13

私は通常、重複を避け、DRY 原則を遵守しようとします。ただし、次のようなケースについては疑問に思っています。

public class Feature {
    final static String FEATURE_LABEL = "blah";

    public void doSomething() { ... }
    ...
}

public class FeatureTest {
    ...
    @Test
    public void doSomethingShouldMakeSomethingHappen() {
         assertEquals(Feature.FEATURE_LABEL, 
             feature.getSomethingHappens().getLabel());
    }

ラベルが "blah" であることが要件であり、誰かが FEATURE_LABEL を "bleh" に変更した場合、要件を満たしていなくてもテストはパスします。これは DRY に違反する有効な場所ですか?

4

5 に答える 5

16

はい、ここでリテラルを使用します。

リテラルに関する質問からの引用:

ハードコーディングされたリテラルは、単一のテスト クラス内でローカル定数が役立つほど値が再利用されない限り、テスト値の単体テストに表示する必要があります。

単体テストは、抽象化やリダイレクトのない期待値の記述です。テストを読んでいる自分を想像してみてください。情報が文字通り目の前にあることを望んでいます。

于 2009-01-14T13:36:07.427 に答える
5

何かをテストする場合、重要な考慮事項は、テスト条件がテスト対象から独立していることです。そうでなければ、テストには単一の信頼できる意味がありません。検査中のオブジェクトが変更されるたびに、それらは別のテストに変化します。

あまり良いことではありません。

同じ考え方が単体テストにも当てはまります。上記のようなコンテキストでは、テスト対象の文字列は、テスト対象のクラスの内容から完全に独立している必要があります。つまり、はい、ここで DRY の原則に違反することができますし、違反する必要があります。

于 2009-01-14T13:36:23.777 に答える
2

他の人がすでに言ったことを表現する別の方法: テストが失敗することがない場合、それを保持する意味はありません。したがって、これは意味がありません。

assertEquals(Feature.FEATURE_LABEL, Feature.FEATURE_LABEL);

たとえば、リストに制限があるとします。limit == limit をテストしても意味がありません。テストでは、リストに limit 要素を超える要素を入れようとする必要があります。

OTOH、定数が適切な場所で使用されていることを確認したい場合(つまり、UI要素のラベルとして使用する必要がある場合)、文字列定数を使用してテストを使用するのが理にかなっています(新しいリテラルの代わりに) )。

そうは言っても、私自身の UI テストでは、表示されているすべての文字列を収集し、結果の (長い) 文字列をファイルの内容と比較するスクレイパーを使用しています。これは、UI の予期しない変更に対する非常に単純な包括的なテストであり、HTML の UI に最も適しています (HTML をダウンロードして比較します) が、同じパターンを任意の UI に適用できます。

于 2009-01-14T13:49:09.647 に答える
1

とりあえず参考書にとどめておきます。

問題は、誰かがテストを変更するきっかけなる要件が変更された場合です。おそらく、テストを変更する正しい方法は、それをリテラルとして新しい値に変更し、それが失敗することを確認し、本番静的を変更し、合格することを確認してから、本番静的を再度使用するようにテストを変更し、それでも合格することを確認することです。

それは意味がありますか?

于 2009-01-14T13:35:19.410 に答える
0

私はあなたが持っているものは良いと思います、そしてはい、それはDRYの有効な使用法です:この値がいくつかのテストで終わる場合、値が変更されてもいくつか変更したくないでしょう。ただし、Feature.FEATURE_LABELの値を検証するテストも追加する必要があります。

これは、「1回だけ」を適用するのに適した場所です。FEATURE_LABELの値がテストされたテストが1つしかない場合は、リテラル文字列を使用します。それを使用している複数のテストがある場合にのみ、参照の使用を開始します(そして値のテストを追加します)。

于 2009-01-14T14:42:48.837 に答える