2

新しいクラス、Holder を実装しました。目標は次のとおりです。

  1. 3 つのフィールド。フィールド 1 と 2 は int で、フィールド 3 はブール値です。
  2. 一度構築されると、変更されません (不変)。したがって、フィールドにはゲッターのみがあります。
  3. フィールド 1 と 2 は、文字列形式 1、文字列形式 2、int、クラス タイプ A、クラス タイプ B の 5 つの可能なタイプから情報を抽出することによって初期化されます。フィールド 3 は true / false として設定されます。

これが私に残す問題は、可能なコンストラクターオプションが 50 あることです。5 X 5 X 2. これは賢明でもスケーラブルでもありません (6 番目のタイプを追加すると、大幅な変更を行う必要があります)。そのため、ビルダー パターンを使用しました。

class Builder {
    Builder s1SetField1(String Format1),
    Builder s2SetField1(String Format2),
    ...
    Builder s1SetField2(String Format1),
    ...
    Builder setField3(boolean b)
    Holder build()
}

これは本当にうまくいきます。フィールド 1 の初期化用に 5 つのビルダー メソッド、フィールド 2 の初期化用に 5 つのビルダー メソッド、ブール値用に 1 つのビルダー メソッドがあります。フィールドが設定されたら、正しい形式のフィールドでプライベート コンストラクターを呼び出す build() メソッドを呼び出し、新しいオブジェクトを返します。

私が抱えている問題は単体テストです。Builder メソッドのすべての順列で構築された代表的なオブジェクトが取り込まれたリストを設定したいと思います。これで、50 の新しい Build() 呼び出しに戻りました。field1List、field2List、field3List の 3 つのリストを作成することを考えました。次に、それぞれを階層的に繰り返します。

for (Object f1 : field1List) {
    for (Object f2 : field2List) {
        for (boolean f3 : field3List) {
            returnList.add(new Builder().setField1(f1).setField2(f2).setField3(f3).build());
        }
    }
}
return returnList;

もちろん、混合オブジェクトをリストに保持するのは扱いにくいように思えます。すべての順列を使用して初期化するより良い方法はありますか?

4

1 に答える 1

3

システムへの入力のすべての順列をテストしようとするのは狂気です。小規模なシステムでも、順列の数は膨大です。

代わりに、同値パーティショニングを使用して、これらの多くの順列をより小さな同値クラスのセットに分類し、同値クラスごとに 1 つのテスト ケースのみを使用します。あなたのコードが解決しようとしている問題と、それが書かれている方法 (または、他の誰かのコードをテストしている場合は、書かれている可能性が高い) に関する知識を使用して、プログラムが正しく動作する場合のプロパティを持つ一連の等価クラスを選択します。クラス内の他のすべてのケースに対して正しく機能する可能性が非常に高い場合、同等クラス内の 1 つのテスト ケース。これにより、費用対効果の高いテスト ケースが得られます。

あなたの場合、私はbuild ()単独でテストし、さらにメソッドごとに1つのテストとsetXXX ()それに続くメソッドをテストしbuild ()ます。

于 2013-06-21T23:21:20.810 に答える