8

私は最近コードカバレッジツール(特にEmmaとEclEmma)を使い始めましたが、単体テストの完全性と、単体テストがコードのどの領域にないかを確認できるという見方が本当に気に入っています。まったくヒットしません。私は現在、単体テストをあまり行わない組織で働いています。私は、すべての人に単体テストとコードカバレッジ、およびTDDを実施し、できれば組織を変換するように促す予定です。

このテーマについて私が確信していない問題の1つは、コードカバレッジをどこまで実行する必要があるかということです。たとえば、次のようなクラスがある場合:

//this class is meant as a pseudo-enum - I'm stuck on Java 1.4 for time being
public final class BillingUnit {

    public final static BillingUnit MONTH = new BillingUnit("month");
    public final static BillingUnit YEAR = new BillingUnit("year");

    private String value;

    private BillingUnit(String value) {
        this.value = value;
    }

    public String getValue() {
        return this.value;
    }

    public boolean equals(Object obj) {
        return value.equals(((BillingUnit) obj).getValue());

    }

    public int hashCode() {
        return value.hashCode();
    }
}

equals()正しく機能すること、期待どおりの結果が得られることなどを確認するために、いくつかの簡単な単体テストを作成しgetValue()ました。しかし、EclEmmaの視覚的な性質のおかげで、hashcode()メソッドは「テストされていない」場合は明るい赤で表示されます。

hashCode()この例では、実装がいかに簡単であるかを考えると、わざわざテストする価値がありますか?このメソッドの単体テストを追加して、コードカバレッジを%向上させ、EclEmmaがこれらの行に追加する明白な赤いハイライトを取り除くように感じます。

神経症でOCDに似ているかもしれませんが、EclEmmaのようなものを使用すると、テストされていないものを簡単に確認できます。プラグインはソースコードを赤で強調表示し、カバーされたコードは緑で強調表示します。できるだけ多くのクラスを100%グリーンにするようにプッシュします-それがあまりメリットをもたらさない場合でも。

4

8 に答える 8

8

私はコードカバレッジを使用して、テストのセットが不完全である可能性がある場所についてのヒントを提供します。たとえば、特定の機能のテストを作成してから、その機能を満たすコードを開発する場合がありますが、実際には、想定以上のことを実行するコードを作成します。別のケースで例外が発生する可能性があると言います。テストが実行されないこと。カバレッジアナライザーを使用すると、テストが関連付けられていないコードを導入したことがわかります。十分なテストを作成していないことを知るのに役立ちます。

一方、カバレッジ分析は誤ったセキュリティにつながる可能性があります。すべてのコードをカバーしているからといって、十分なテストがあるわけではありません。コードが何をすべきかという観点からテストについて考え、それが確実に実行されるようにテストを作成する必要があります。できれば、最初にテストを書くことによって。コードが完全にカバーされているからといって、コードが本来の機能を果たしているとは限りません。

あなたの例では、コードを書く前に、メソッドの機能が何をするかを定義するために、hashCodeのテストを書いていたでしょう。したがって、私はそれをカバーしてもらいます。それは私が常に100%のカバレッジを持っているという意味ではありません。たとえば、単純なアクセサのテストを書くことにあまり熱心ではありません。また、他の人のコードをテストする必要性を感じないため、フレームワークから継承する親クラスのメソッドをテストしない場合があります。

于 2008-10-31T14:06:43.730 に答える
6

特定の種類のステートメントを無視することを選択できるライブラリを使用することは価値があると思います。たとえば、次のようなものがたくさんある場合:

if(logger.isDebugEnabled()) {
    logger.debug("something");
}

これらの種類の回線のカバレッジ計算をオフにできると便利です。些細なゲッターとセッター(他のチェックや副作用なしにメンバー変数を設定または返すだけのもの)のカバレッジ計算をオフにすることも(ほぼ間違いなく)有効です。ただし、equalsとハッシュコードをオーバーライドした場合は、それらをテストする必要があると思います。重要な機能を追加したので、テストする必要があります。

明確にするために、上記の状況をカバレッジから除外する必要があると思う理由は次のとおりです。

  • その機能をテストしなくても大丈夫です。すべてのステートメントがヒットしていることを確認するために、ロギングライブラリを各ロギングレベルに設定して、一連のテスト全体を5回実行する必要はありません。
  • 上記を行った場合、カバレッジが逆に歪んでしまいます。ブランチの90%がでありif(log.isDebugEnabled())、他のブランチを除いてすべてをテストすると、90%のブランチカバレッジ(良い)があるように見えますが、実際には、0%の重要なブランチカバレッジ(悪い!!)があります。 。
于 2008-10-31T14:07:25.087 に答える
4

コード カバレッジとテスト カバレッジには違いがあります。100% のコード カバレッジではなく、コードが適切にテストされていることを確認する必要があります。

次のコードを検討してください。

public float reciprocal (float ex)
{
    return (1.0 / ex) ;
}

値 1.0 で合格した 1 つのテストを実行した場合、すべての合格で 100% のコード カバレッジ (分岐とステートメント) が得られます。コードには明らかに欠陥があります。

テスト カバレッジの測定はより難しく、より優れた開発者およびテスターに​​なることから得られます。

特に hashCode に関しては、そのメソッドに対して個別の単体テストが必要であると言うでしょう。個人的には、それが少なくとも 1 つのユニット統合テストに含まれていることを確認し、各アクセサー/修飾子を直接テストしません。多くの場合、投資収益率が低すぎて、その努力を正当化できません。これはもちろん、正しいハッシュ コードを生成していることを確認する単体テストがあることを前提としています。

于 2008-10-31T14:32:07.593 に答える
3

意味のあるテストで 100% のコード カバレッジに到達することは、それほどの価値はないかもしれません。また、前述のように、100% のコード カバレッジは、アプリケーションで考えられるすべての条件がテストされたことを必ずしも意味しません。

testingやequalshashCodeや などのその他のコントラクト ベースのインターフェイスについては、これらのテストを含めます。と同様に、コントラクトが正しく実装されていることが重要です。ComparableSerializableequals/hashCodeequals/Comparable

特にJUnit-Addonsを参照してください

于 2008-10-31T14:37:09.423 に答える
2

今はそれほど複雑ではないかもしれませんが、メソッドが変更された場合、後で期待どおりに機能していることを確認するための簡単なチェックが非常に役立ちます。

小切手は本当に書きやすいはずなので、そうしてみませんか?それは統計を助け、またそれが壊れた場合に備えて後であなたにチェックを与えるのを助けます。

また、TDDの場合は、100%のカバレッジが必要です。これにより、リファクタリング時に何も壊れていないことを確認できます(または非常に近くなります)。

于 2008-10-31T14:06:26.803 に答える
1

仲間のプログラマーが古い Java1.4 で私のように立ち往生しました ;)

以前の回答で述べたように、対象となるコードはコード テストされていません。そして結論は次のとおりです。ある時点から、コード カバレッジを改善する唯一の方法は...コードを削除することです!

ここで、hashCode に関して、予想されるソートされたメカニズムが尊重されていることを確認するために単体テスト設計でカバーするのは興味深いことです (もう 1 つの関数をカバーするためではありません)。

于 2008-10-31T14:12:22.470 に答える
0

他の場所で述べたように、低いコードカバレッジは問題ですが、高いコードカバレッジは、純粋な金を書いていることを意味するわけではありません。

コードカバレッジについて心配していなかった場合は、テストが必要になることをお勧めします-使用方法equals()getValue()場所に応じてhashCode()(申し訳ありませんが、私はC#開発者です)、テストすることをお勧めしますそれ。

最も重要な部分は、テストによって、正しいコードを記述したこと、およびコードが期待どおりに機能することを確信できることです。

于 2008-10-31T14:07:46.037 に答える
0

この特定のケースでは、 equals メソッドをテストしているので、等しいオブジェクトが等しいハッシュコードを持っていることもテストすることができます: equals が true を返すと予想されるすべてのケースに追加のテストを追加するだけです。

これにより、コード カバレッジが得られ、おまけに、hashCode が実際に契約を満たしているという自信が得られます :-)

String の hashCode メソッドを信頼できることは明らかであり、このクラスを変更することは決してないことを考えると、これはわずかな価値しかありません。しかし、equals メソッドをテストするのに十分なほど疑わしい場合は、それと hashCode が一貫していることをテストするのに十分なほど疑わしいはずです。また、以前に行ったことを将来台無しにしたくないという仮定を常に疑う必要があります。たとえば、誰かがやって来て、ポインター等価チェックを追加して「最適化」することを決定した場合、変更されたコードを実行するための完全なテスト セットを用意することもできます。そうしないと、あなたがしたのと同じ心配で時間を浪費することになります。コード カバレッジがなくても大丈夫ですか?

于 2008-10-31T16:20:29.263 に答える