3

TDD を使用してクラスを実装すると仮定するとStack、Stack クラスの各機能に対して、それを実行する新しいテストを追加する必要があります。

[TestMethod] public void Should_Be_Empty_After_Instantiation()
[TestMethod] public void Should_Not_Be_Empty_After_Pushing_One_Item()
...

一方、単体テストを実行するときは、クラスが提供するはずの外部動作に焦点を当てる必要があるため、単体テストのセットは、Stack インターフェースの期待されるすべてのコントラクトが満たされていることを確認します。

私の質問は、これらの 2 つの側面をどのように調整するかということです。

たとえばStack、初期サイズが 8 の配列を内部で使用すると仮定すると、ユーザーが 9 番目の項目を挿入したい場合は、配列を大きくする必要があります。そのサイズ変更機能を追加するには、クラス コードをその方向に駆動する少なくとも 1 つのテストが必要です (そうですか?)。

一方、それは、クラスの実際のコントラクトを実行しないユニットテストを追加することになります(または、これは実際にはユニットテストではありませんか?)(ユーザーはスタック) しかし、その実装。

ここにはひねりがあり、解決方法がわかりません。ここで概念を混乱させていますか?

ありがとう

編集

多くのグーグル検索の後、この問題に対処していると思われる次のリンクにたどり着きました: http://stephenwalther.com/blog/archive/2009/04/11/tdd-tests-are-not-unit-tests.aspx

4

3 に答える 3

4

9番目のアイテムをスタックにプッシュするテストを作成できます。サイズ変更ロジックがない場合、これは明らかに失敗します。ただし、スタックの内部実装の詳細をテストに組み込むため、9をテストにハードコーディングすることは悪い考えのように思われます。

現在、TDDテストを作成すると、APIのギャップの可能性が作成者に通知されることがよくあります。この場合、テストでは、スタックの初期の事前割り当てサイズを指定できるようにする必要があります。次に、それを8または2などに設定し、それより1つ多いアイテムをプッシュすることができます。そして、他のクライアントもそれを望んでいるかもしれないと考えるのは非現実的ではありません(たとえば、std :: vectorのreserveメソッドに似ています)。したがって、コンストラクターパラメーターをStackに追加して初期予約サイズを指定し、デフォルトで8に設定し、Should_Not_Error_When_Pushing_More_Items_Than_Initial_Sizeテストを追加することを検討します。

于 2010-08-30T22:10:32.503 に答える
1

TDD と特定のクラスの外部動作を参照する場合、それらは同じものであると言えます。TDD スタイルのコードを記述するときは、クラスのパブリック API を使用したときの動作に注目します。したがって、最初の 2 つのテスト ケースは、クラス (スタックのサイズ) で公開されているものをテストするため、正しいものです。

内部実装と配列を使用するかどうかに関しては、テストはそれがどのように行われるかには関係なく、機能が特定のテストに対して機能するだけです。後の段階で別の方法で実装することを選択することもできます。テストでは、動作が変更されていないことを確認します (リファクタリング後にテストが失敗することはありません)。

于 2010-08-30T21:41:59.217 に答える
0

ここには、動作のいくつかの側面があります。

  • アイテムのプッシュとポップを可能にするスタック
  • 別のアイテムが追加されたときに内部配列を拡張するストレージ要素。

両方のテストに問題がある場合は、スタックの動作とは別に、内部配列を拡張する動作を常に別のクラスに入れることができます。オーバードライブの単一責任原則だ!次に、スタックの動作をテストする際に非常に大きな配列を使用し、モックを使用して成長が関係する場合にスタックがその責任を正しく委任することを確認できます (モック フレームワークがない場合は、独自のロールを作成できます)。

これは、タイミング、スレッド化、または必ずしも外部から見ることができない内部動作をカプセル化するその他の方法に役立つ手法であることがわかりました。もちろん、パフォーマンスはある程度犠牲になります。それが重要な場合は、呼び出し元クラスの観点からスタックの動作を心配し、システム パフォーマンスとプロファイリング テストを使用して残りをピックアップします。

于 2010-09-07T17:28:59.923 に答える