2

私は単体テストを書くのが初めてで、以下のシナリオのテストケースを書いているときに行き詰まりました。

 Class A
 {
     public B createB(string name);
     public B getB(string name);
     public void removeB(B instance);
 }

 Class B
 {
     public B(string name);
 }

特定の名前のインスタンスがすでに存在する場合、メソッドcreateB()はnullを返します。したがって、ケースが正常に完了したBことをテストするには、電話をかけて存在するかどうかを確認してから、削除する必要があります。createB()getB()removeB()

 A a = getInstanceOfA();
 public void testCreateB()
 {
     B b = a.getB("B");
     if (b != null)
     {
         a.removeB(b);
     }
     assertNotNull(a.createB("B"));
 }

これは「テストケースは1つの理由だけで失敗しなければならない」というルールに違反しています。テストが失敗した場合、問題がどこから来ているのかわかりません。getB()メソッドのテストについても同じですcreateB()。テストを開始するための前提条件として呼び出す必要があります。JUnitを使用していますが、テストを開始するたびにテストケースがシャッフルされます。このシナリオでテストケースを確実に分離するためのベストプラクティスはありますか?

もう1つの注意点として、このgetInstanceOfA()メソッドは別のライブラリから提供されるAPI呼び出しであり、の「クリーンな」インスタンスを取得することは制御できませんA

4

3 に答える 3

1

プログラムを文字列「B」の既知の状態にし、「B」を指定してcreateBメソッドを呼び出し、期待どおりの結果が得られることを確認する必要があります。次に、別の状態と別の期待される結果を使用して、これを再度実行します。このような:

public void testCreateBSucess() {
    A a = getInstanceOfA(); // Make sure "B" doesn't exists
    B b = a.createB("B");
    assertNotNull(b);
}

public void testCreateBFail() {
    A a = getInstanceOfA();
    a.createB("B"); // Making sure "B" exists
    B b = a.createB("B");
    assertNull(b);
}
于 2013-03-20T03:34:15.597 に答える
1

mockitoのようなモックフレームワークを見てください。これにより、開発者が制御する他の関数に対するモック応答が得られ、必要な関数だけをテストできます。

于 2013-03-20T03:47:54.657 に答える
0
  • @Beforeメソッドのように、そしてメソッドでJUnit4アノテーションを使用してみて@Afterください。
  • または、複雑な長いテストを作成します。テストライティングの一般的なルールに違反せずにテストを書くことができない場合がたくさんあります。本当に必要な場合は、非常に長いテストを作成してもかまいません。
于 2013-03-20T03:58:52.557 に答える