4

私はTDD環境で作業しており、assertTrueをよく使用しますが、assert equalsなどの他の多くのメソッドがあります。40を超えるテストケースがあるクラスがあり、それらはすべてassertTrueです。これは受け入れられますか?

スタイルとして聞きたかったのですが、これでいいのでしょうか?

助言がありますか?

この質問が不適切だと思われる場合は、削除することをお知らせください。

編集:

    assertTrue(targetSpecifiers.size() == 2);
    assertTrue(targetSpecifiers.get(0).getPlacementId().compareTo(new BigInteger("1")) ==0);
    assertTrue(targetSpecifiers.get(1).getPlacementId().compareTo(new BigInteger("2")) ==0);
4

4 に答える 4

6

他のアサーションを使用する主な利点は、意図をより適切に伝達し、障害が発生した場合に、より意味のあるデフォルトメッセージを提供する可能性が高いことです。

例えば

assertEquals(2, x)ifをx実際に1と書くと、失敗メッセージは次のようになります。

java.lang.AssertionError: expected:<2> but was:<1>

これは、とスタックトレースassertTrue(x == 2)だけが表示される場所に書き込む場合よりも役立ちます。AssertionError

TDDを使用している場合、これはさらに重要です。最初に失敗したテストを作成するときに、予期した理由でテストが失敗し、偶発的な動作が発生していないことを確認する必要があるためです。

于 2012-11-12T18:00:57.900 に答える
5

必要に応じて、障害の報告を改善するため、正しいassertXXXメソッドを使用する必要があります。たとえば、2つの文字列「abc」(期待される)と「abxy」(実際)の同等性をテストしている場合、assertEqualsを使用します。

assertEquals("abc", "abxy") 

以下のようにassertTrueを使用するよりも推論しやすい、より良い出力を提供します

assertTrue("abc".equals("abxy"))

注:実際の引数と予想される引数を指定する場所にも注意してください。多くの開発者が、assertXXXメソッドの最初のパラメーターが期待されるという規則(junitの規則)に従わないのを目にします。不適切な使用はまた、多くの混乱につながります

于 2012-11-12T18:02:09.223 に答える
4

私の推測では、あなたは次のようなものを持っていると思います:

assertTrue(expectedValue.equals(actualValue));

それでも正しいことをテストしますが、失敗した場合は、アサーションが失敗したことだけを知ることができます代わりにこれを使用した場合:

assertEquals(expectedValue, actualValue);

...その後、失敗は「期待:5;以前:10」などと表示され、何が起こっているのかを理解するのがかなり簡単になります。

メソッドが返される結果などを主張しているのでない限り、私はほとんど役に立たないことがbooleanわかります。assertTrue

アサーションの例を挙げていただければ、より慣用的なものに変換できる可能性があります。

于 2012-11-12T18:01:12.003 に答える
2

これらのアサーションは完全に有効ですが、他のアサーションは読みやすく、より適切な失敗メッセージを提供します。

Hamcrest を見ることをお勧めします。これは、アサーションと失敗メッセージの最も読みやすい形式を提供します。あなたの例

assertTrue(targetSpecifiers.size() == 2);
assertTrue(targetSpecifiers.get(0).getPlacementId().compareTo(new BigInteger("1")) ==0);
assertTrue(targetSpecifiers.get(1).getPlacementId().compareTo(new BigInteger("2")) ==0);

として書き換えることができます

assertThat(targetSpecifiers, hasSize(2));
assertThat(targetSpecifiers.get(0).getPlacementId(), equalTo(BigInteger.valueOf(1));
assertThat(targetSpecifiers.get(1).getPlacementId(), equalTo(BigInteger.valueOf(1));

またはさらに簡潔に

assertThat(targetSpecifiers, contains(
    hasProperty("placementId", equalTo(BigInteger.valueOf(1)),
    hasProperty("placementId", equalTo(BigInteger.valueOf(2))
);

contains完全性と順序を検証するため、これで 3 つのアサーションすべてがカバーされます。

于 2012-11-13T10:11:22.757 に答える