2017-01-05 14 views
2

best practicesを尊重して単体テストを実現しようとしています。ルールの1つは、メソッドで1つだけ「アサート」を使用することです。私は方法ごとにいくつかのテストを実現したいと思います。なぜなら、すべてのメソッドの始めに(データベースに挿入 - > 5秒)重い処理が行われるからです。Java JUNIT - Stringを使った複数のテスト

私はこのソリューションを開発しました。それは良い方法ですか?ルールの

String failuresMsg = ""; 
if(9 != var1) 
    failuresMsg += "[var1 <9," + var1+">]"; 
if(9 != var2) 
    failuresMsg += "[var2 <9," + var2+">]"; 
if(9 != var3) 
    failuresMsg += "[var3 <9," + var3+">]"; 
if(9 != var4) 
    failuresMsg += "[var4 <9," + var4+">]"; 

assertEquals("", failuresMsg); 

答えて

3

一つの方法で唯一の「アサート」を使用することです。

いいえ、テスト方法でシナリオをテストする必要はありません。それは同じことではありません。もし範囲に従って許容可能な値を有する場合

String failuresMsg = ""; 
if(9 != var1) 
    failuresMsg += "[var1 <9," + var1+">]"; 
if(9 != var2) 
    failuresMsg += "[var2 <9," + var2+">]"; 
if(9 != var3) 
    failuresMsg += "[var3 <9," + var3+">]"; 
if(9 != var4) 
    failuresMsg += "[var4 <9," + var4+">]"; 

assertEquals("", failuresMsg); 

一般には、少なくともこの範囲の限界及び範囲の1つまたはいくつかの内部の値をテストする必要があります。

あなたのテストを取る場合、それは(物事を見ての方法に従って、またはそれ以上)2つのテストの方法を与えるだろう、私は二つの異なるシナリオを持っているので、場合:

  • を値が許容

  • です

    値は、各シナリオについて

許容できない、私は、コードとテストのメンテナンス性が良いとどまる場合、私は必要なすべてのアサーションを行うようにしてもよいです。ここで

はサンプルコードです:間隔はあまり重要でない場合

@Test 
public void doMethodWithAcceptableValues(){ 
    int testValue = 0; 
    Assert.assertTrue(objUnderTest.doMethod(testValue)); 
    testValue = 100; // limit value 
    Assert.assertTrue(objUnderTest.doMethod(testValue)); 
    testValue = 50; // middle value 50. it is an example 
    Assert.assertTrue(objUnderTest.doMethod(testValue)); 
} 

@Test 
public void doMethodWithNotAcceptableValues(){ 
    int testValue = -1; 
    Assert.assertFalse("-1 not acceptable", objUnderTest.doMethod(testValue)); 
    testValue = 101; // limit value 
    Assert.assertFalse("101 not acceptable", objUnderTest.doMethod(testValue)); 
} 

何もあなたはそれのために(パラメータ化テスト)をJUnitのメカニズムを使用したりを作成することができ、区間の全ての値をテストすることができなくありませんこのロジックをループなどで実行する独自のメソッドです。
多くの場合、ホーム処理はよりシンプルで読みやすく保守が容易です。

+0

私は指定しませんでした、変数は強く縛られています、そして、このテストは単一のアイデアをチェックすることに対応します。 同じテストでいくつかのアサートを持つ問題は、いくつかの失敗の場合、最初の失敗の結果のみを表示します。 –

+0

実際には問題はありません。なぜなら、テストが失敗したときにはどのシナリオが失敗するのか理解できないからです。シナリオのテスト方法が失敗した場合は、通常、エラーメソッドを修正してテストを再実行して問題が修正されているかどうかを確認する必要があるため、テスト中に他のアサーションが失敗しないかどうかは関係ありません。メソッド内で各アサーションを分割すると、テストとテストコードの複雑さが増します。それはコストがあります。なぜなら、コードがあり、読みにくく、複雑で、保守が難しいからです。 – davidxxx

+0

OK、この明白な答えをありがとう。 –

3

私はあなたのテストでJUnitParamsRunnerを使用することができます。これを使用すると、テストメソッドにパラメータを追加できます。次に、メソッド本文からifを削除することができます。

例:

@RunWith(JUnitParamsRunner.class) 
public class TestSomething{ 

    @Test 
    @Parameters({ "A", "B", "C" }) 
    public void shouldDoSomething(String s){ 

    assertEquals(s, "s"); 
    } 

    //OR 

    @Test 
    @Parameters(method = "data") 
    public void shouldSomething(String a, String b){ 

    assertEquals(a,b); 
    } 

    @SuppressWarnings("unused") 
    private Object[] data() { 
    return $(// 
    $("A", "B") // 
); 
} 
} 

私は思うが、その後、より良く、より読みやすいテスト中のは、あなたが唯一のアサーションを持っているので、開始値が試験時間に変更されていない場合meny、およびパラメータが拡張子には本当に簡単です。メンテナンス可能です。

関連する問題