3

最初に、間隔 (2 つの Long 値として私が定義した間隔クラスRangeSet) で動作するクラス (それを と呼びましょう) を作成しました。ArrayListリストは間隔のコレクションであり、void add(Range range)すでにリストにある間隔との重複、上書き、包含、または隣接があるかどうかをチェックするメソッドがありました。ポイントは、重複しない間隔のリストを保持することでした。

私は、そのクラスの広範なテストを設計して作成し、発生する可能性のあるさまざまなケースをチェックしました。私が言っているのはたくさんのコードです。

さて、(何らかの理由で)そのクラスを2つの別々のクラスに分割しなければならなかったことがわかりました-RangeSetいくつかの便利なメソッドを持つ抽象クラスになり、それから継承されます- ArrayRangeSet(間隔のコレクションを保持するArrayList)およびTreeRangeSet(コレクションを保持するの間隔のTreeSet)。メソッドの実装はadd(Range range)、これら 2 つの間で大きく異なります。

テスト データを定義する際の冗長性を避けるために、テストを継承するにはどうすればよいですか?

テストの例は次のようになります。

@Test
void testCase4(){
    RangeSet set = new RangeSet();
    Range r1 = new Range(4, 5);
    Range r2 = new Range(13, 15);
    Range r3 = new Range(19, 22);
    set.add(r1);
    set.add(r2);
    set.add(r3);

    Range testRange = new Range(11,100);
    set.add(testRange);

    assertEquals(2,set.iterator().size());
    assertEquals(new Range(4,5),set.iterator().getAt(0));
    assertEquals(new Range(11,100),set.iterator().getAt(1));
}

はっきり言っているかどうかはわかりません。多くのテスト データが定義されており、これら 2 つのクラスのテストは同じように見えます。どうすれば解決できますか?

編集:これらの assert ステートメントを継承されたテスト クラスに渡す方法はありますか? 結局のところ、これらのaddメソッドは、操作は異なりますが、同じ目標を達成するはずです。

4

3 に答える 3

1

JUnit@Beforeなどのフィクスチャ メソッドを使用できます。または、それを別のフィクスチャ クラスに保持することもできます。または、適切であれば、プロパティ ファイルに保持することもできます。複数の選択肢があるということです。

そのような固定具は、私には親のようには聞こえません。is aつまり、フィクスチャとテスト クラスの間に関係はありません。ところで、2 つのテスト クラス間の共通性を処理するために基底クラスを使用しても害はありません。基本クラスを決定する場合は、そこにsetup、または言う/@Before、メソッドを配置して、データを 1 か所で準備できます。

于 2012-08-30T10:26:26.320 に答える
0

のテストクラスを作成RangeSetします。これは、テストデータを提供し、のテストArrayRangeSetTreeRangeSet継承を許可します。ArrayRangeSet基本テストのインスタンスを作成するメカニズムTreeRangeSet(抽象「ファクトリ」メソッドなど)を提供する場合は、両方のクラスで同じ動作をするはずのすべてのメソッドのテストを基本テストに入れることができます。テストクラスArrayRangeSetTreeRangeSetは、「特定の」メソッドのテストのみが含まれています。

于 2012-08-30T11:05:51.627 に答える
0

RangeSetTestDataテストの実行に必要なすべてのものを保持するように、共有テスト データを不変の定数クラスに配置します。RangeSetTreeRangeSetおよびに対して、ArrayRangeSet一定のテスト データに基づいて機能をテストする3 つのテストを実装します。

編集: そうすれば、プロパティ ファイル/テスト リソースのシリアル化と逆シリアル化に対処する必要がなくなり、一定のテスト データ クラスは非常に保守しやすくなります。

于 2012-08-30T10:28:44.320 に答える