1

Stack クラスのテスト ファースト (TDD) を設計しているとします。

public class Stack<T> {
    private T[] elements = new T[16];
    private int size = 0;
    ...
}

このスタックは、サイズ 16 の内部配列を使用して要素を格納します。17 番目の要素を追加する必要があるまでは問題なく動作します。17 番目の要素が必要になるかもしれないので、その機能をスタックに追加することにしたので、その機能を追加しなければならないテストにどのような名前を付けることができるかを考え始めました。それが私の最初の質問の主題になります。

最初に次の形式のものを選択しました。

Should_Be_Able_To_Correctly_Increase_Its_Inner_Array_Size()

その後

Should_Handle_More_Items_Than_The_Default_Internal_Array_Size()

しかし、少し考えた後、おそらく次のようなものがより適切であるという結論に達しました。

Should_Double_Its_Size_Every_Time_Its_Full()

私の推論は、最初のケースではそうしなければならないでしょう。2 つ目は、いつアイテムを追加するかを述べていますが、それを (内部的に) どのように達成しようと考えているかも述べていますが、これは正しくない可能性があります。私の見解では (私が正しいかどうかはわかりません)、私のテストは、SUT が内部でどのように実装されているかではなく、外部との可能な相互作用であるべきです。私は正しいですか?

3番目のオプションが最適であるように見えます.3番目のオプションが最適であると思われます.実装 (後で内部 ArrayList に変更したくなるかもしれません!)。

これは私の2番目の質問につながります.配列を内部的に使用するスタッククラスのすべての単体テストを実行し、それが正常に動作し、期待どおりに動作すると仮定すると、後でリファクタリングして配列をArrayList またはその他の種類のデータ構造? それとも、何らかの方法でテストにそれを反映させる必要がありますか? いいえと思いますが、よくわかりません。

4

4 に答える 4

3

私の見解では (私が正しいかどうかはわかりません)、私のテストは、SUT が内部でどのように実装されているかではなく、外部との可能な相互作用であるべきです。私は正しいですか?

あなたは正しいです。クラスの内部実装を変更しても、単体テストは同じままにする必要があります。何か新しいものを外部に公開する場合は、これらの変更を考慮して新しい単体テストを作成する必要があります。

クラスを設計するときは、それがどのように実装されたかを示すものを公開したくないことに注意してください。クラスのパブリック メンバーは、それと対話する方法を示します。

于 2010-08-30T19:11:36.357 に答える
2

このクラスで何をコミットするかを自問してください。

あなたやクラスの消費者は、容量が 2 倍になるか、1 増えるか、1000 増えるかを本当に気にしますか? その場合は、インターフェースを変更して、容量を増やすために使用する戦略を指定できるようにする必要があります。

public Stack<T>(CapacityGrowthStyle capacityGrowthStyle) { ... }

そうでない場合は、テストを作成して容量を文書化し、そのままにしておきます(X以下は、基礎となるデータ構造の制限です)。

[Test]
public void Can_Handle_X_Items() { ... }

[Test]
[ExpectedException(typeof(InvalidOperationException))]
public void Cannot_Handle_More_Than_X_Items() { ... }

2 番目の質問にも同様に答えます。テストは、クラスのユーザーが気にする場合にのみ、基になるデータ構造を反映する必要があります。

于 2010-08-30T19:27:55.890 に答える
2

単体テストで内部リストまたは配列サイズをテストする方法がわかりません。Stack インターフェイスからアクセスすることはできません。単体テストは、外部コントラクトをテストするためのものです。実装の詳細をテストしたい場合は、別のことを試してください。

2 番目の質問に対する答えは「はい」です。単体テストの場合、テストは合格するはずです。

于 2010-08-30T19:09:33.953 に答える
1

Stack インターフェイスからアクセスできないため、単体テストで内部リストまたは配列サイズをテストする必要があるかどうかはわかりません。スタックを実装するには多くの方法があり、良い方法も悪い方法もありますが、Bernard が述べたように、それらは内部実装です。単体テストは、外向きの機能をテストするように設計されています。

于 2010-08-30T19:26:13.747 に答える