ユニットテストに関するいくつかの質問
-
25-09-2019 - |
質問
スタッククラスのテストファースト(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()
私の推論は、最初のケースでそれをしなければならないでしょう、私はそれが何をするかだけを言っていますが、いつではありません。第二に、私はいつさらにアイテムを追加するかを言っていますが、私はそれを(内部的に)達成することをどのように考えているかを述べていますが、これは正しくないかもしれません。私の見解では(私が正しいかどうかはわかりません)、私のSUTと外部との相互作用の可能性があり、内部的にどのように実装されるかについてではなく、私のテストは私のテストです。私は正しいですか?
3番目のオプションが最良のものであるように見えます。それは、それが何をしているのか(実際にはサイズが2倍になる)を明確に述べているからです。実装(後でそれを内部アレイリストに変更したいかもしれません!)。
それは私を私に導きます 2番目の質問: :アレイを内部的に使用し、正常に動作するスタッククラスのすべてのユニットテストを行ったと仮定すると、後で配列をアレイリストまたは他の種類のデータにリファクタリングして変更したい場合、テストがそのままのままである場合は、テストがそのまま残ります。 -構造?または、テストはそれを何らかの形で反映する必要がありますか?ノーだと思いますが、よくわかりません。
解決
私の見解では(私が正しいかどうかはわかりません)、私のSUTと外部との相互作用の可能性があり、内部的にどのように実装されるかについてではなく、私のテストは私のテストです。私は正しいですか?
あなたは正しいです。クラスの内部実装を変更する場合、単体テストは同じままでなければなりません。外部から新しいものを公開する場合は、これらの変更を説明するために新しい単体テストを作成する必要があります。
クラスを設計しているとき、それがどのように実装されたかを示すものを公開したくないことを忘れないでください。クラスのパブリックメンバーは、それと対話する方法を示しています。
他のヒント
ユニットテストで内部リストまたは配列のサイズをどのようにテストできるかはわかりません。スタックインターフェイスを介してアクセスすることはできません。ユニットテストは、外部契約をテストするためのものです。実装の詳細をテストしたい場合は、他のことを試してください。
あなたの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番目の質問も同様に答えます。テストは、クラスのユーザーが気になる場合にのみ、基礎となるデータ構造を反映する必要があります。
あなたがいるかどうかはわかりません したほうがいい スタックインターフェイスを介してアクセスできないため、ユニットテストで内部リストまたは配列サイズをテストします。スタックを実装するには多くの方法があり、いくつかの良いものといくつかの悪い方法がありますが、バーナードが述べたように、それらは内部実装です。ユニットテストは、外向きの機能性をテストするように設計されています。