2011-07-15 15 views
1

ユニットテストを書いているときに非常に込み入った質問があります。ユニットテスト関数

テストコードで関数を使用して関数をテストできますか?例えば

私はAdd()と呼ばれる機能を持っているList<int>クラスを持っている場合。

2つのintが既に内部にあるターゲットリストオブジェクトをテストしたい:1と2。 3番目の番号:3を追加し、その番号が正常に追加されたことを確認します。だから私は書いた:

public void TestMethod() 
{ 
    //initialize 
    List<int> list = new List<int>(); 
    list.Add(1); 
    list.Add(2); 

    //do operation 
    list.Add(3); 
    Assert.IsTrue(list.Contains(3)); 
} 

しかし、ターゲット機能をテストしようとしている上記のテストケース、:追加()、すでに初期化するために)(追加使用しています。私はこの共同研究がいくつかの条件の下で何らかの問題を引き起こすかもしれないと考えています...

私たちはこれをすることができないと言っているテストトーンはありますか?

ありがとうございます!

答えて

4

機能に複数のテストが必要な場合があります。この場合、単一のAdd()しかテストしなかった関数と、上にあるものをテストします。両方が合格している限り、あなたは結果が確実であると(合理的に)確信することができます。しかし、最初のテストが失敗した場合、2回目のテストの結果は無視されるはずです。

しかし、理想的には、テストしているものの内部状態にアクセスできるため、テスト中の関数を呼び出すことを含まない初期条件を設定する方法が異なります。

0

何もあなたがそれをやめてしまうことはありませんが、私はこの特定の例では値を見ません。

他のシナリオがあります。

1)3番目の呼び出しは、渡されるパラメータの値に基づいて、以前のものとは異なる方法でオブジェクトビットの状態に影響を与えます。

2)同じメソッドを3回使用すると、3回の無効なログイン試行など、特別な動作が予想されます。

2

このような場合は、テストをより包括的にする方がよいでしょう。私は代わりにこれを行うかもしれません:

public void TestMethod() 
{ 
    //initialize 
    List<int> list = new List<int>(); 
    list.Add(1); 
    list.Add(2); 

    // Test setup 
    Assert.IsTrue(List.Count == 2); 
    Assert.IsTrue(List[0] == 1); 
    Assert.IsTrue(List[1] == 2); 

    //do operation 
    list.Add(3); 
    Assert.IsTrue(List.Count == 3); 
    Assert.IsTrue(List[0] == 1); 
    Assert.IsTrue(List[1] == 2); 
    Assert.IsTrue(List[2] == 3); 
} 
0

あなたの例のようなテストメソッドを書くのは珍しいことではないと思います。重要なのは、それを見る方法です。

TestMethod()がAdd()をテストすることを意図していた場合、Add()を使用しての前提条件をテストに設定することはできません。

TestMethod()がAdd()とContain()の相互作用/シーケンスをテストすることが意図されていればOKです。

関連する問題