12

私は C# (フィボナッチ ヒープを使用した優先キュー) でデータ構造を作成しており、それをまったく新しい TDD の学習体験として使用しようとしています。

1 つのユニットの失敗が複数のテストの失敗と混同しないように、各テストはクラスの 1 つの部分のみをテストする必要があることは理解していますが、データ構造の状態が重要な場合にこれを行う方法がわかりません。テスト。

例えば、

private PriorityQueue<int> queue;

[SetUp]
public void Initialize()
{
    this.queue = new PriorityQueue<int>();       
}

[Test]
public void PeekShouldReturnMinimumItem()
{
    this.queue.Enqueue(2);
    this.queue.Enqueue(1);

    Assert.That(this.queue.Peek(), Is.EqualTo(1));
}

このテストは、 または どちらEnqueueかが壊れた場合にPeek壊れます。

基礎となるデータ構造のヒープをテストで手動でセットアップできると考えていましたが、実装を世界に公開せずにそれを行う方法がわかりません。

これを行うより良い方法はありますか?他の部分に頼っても大丈夫ですか?

簡単にSetUpするために省略しました。

4

3 に答える 3

7

クラスのプライベート アクセサーをテスト プロジェクトに追加します。クラスのメソッドを使用する代わりに、アクセサーを使用して、既知の方法でクラスのプライベート プロパティを設定します。

SetUpまた、テスト クラスでメソッドとメソッドを使用TearDownして、テスト間で必要な初期化を実行する必要があります。実際には、テスト ケース間の結合を減らすために、テスト間で再利用するよりも、各テストでキューを再作成することをお勧めします。

于 2008-10-16T03:29:37.200 に答える
3

理論的には、一度に 1 つの機能のみをテストする必要があります。ただし、キューにいくつかのメソッド ( EnqueuePeekDequeueCount) しかない場合は、1 つのメソッドのみを使用して実行できるテストの種類がかなり制限されます。

問題を過度に設計せず、いくつかの単純なテスト ケース (上記のようなもの) を作成し、その上に構築して、さまざまな機能を適切にカバーすることをお勧めします。

使用されている機能の 1 つが壊れた場合にも壊れる何かがその下にある限り、複数の機能をカバーするテストを書くことが適切だと思います。したがって、テスト スイートがあり、テスト スイートが壊れた場合Enqueue、明らかにすべてのテスト (またはほとんどのテストが失敗する) がEnqueue壊れたことが分かります。テストとそのテスト スイートとの関係を無視してはなりません。

于 2008-10-16T03:44:12.600 に答える
1

これで問題ないと思いますが、テスト メソッドの開始時にキューをクリアしてください。

于 2008-10-16T03:27:02.523 に答える