2016-06-01 9 views
9

無効なインデックスのペア(2d配列)に対してIndexOutOfBoundsException をスローする簡単な方法を考えてみましょう。悪いパラメータのすべての組み合わせをテストするには?

不良番号 のすべての組み合わせに対して例外がスローされることを、どのようにテストすればよいですか?

( 1つの呼び出しが例外をスローした場合、もちろんこのテストは続行されません)

@Test(expected = Exception.class) 
public void validateIndices(){ 
    check(0,-1); 
    check(-1,0); 
    check(0,COLS + 1); 
    check(ROWS + 1, 0); 
} 

メソッドのパラメータの バリエーションをテストするための一般的な方法はありますか?

+0

は言う:試験方法ごとにテスト条件を1つ。したがって、4回の 'check'呼び出しのために少なくとも4つ必要です。 – Tom

+0

@トムはそれを4回繰り返すことは非常に重複しませんか? – jam

+0

*「それを4回繰り返しても大したことはありませんか?」それはあなた次第です。失敗した 'validateIndices'メソッドが必要な場合や、これらの呼び出しのどれが失敗したかを手動で確認する必要がある場合は、' testCheck_invalidSecondArgument'のような専用メソッドがあります。 – Tom

答えて

6

あなたの場合、私はParameterized私のユニットテストは、同じテストですべての組み合わせをテストする詳細here

あなたのケースでは、それは次のようになります。

まあ
@RunWith(Parameterized.class) 
public class MyTest { 
    @Parameterized.Parameters 
    public static Collection<Object[]> data() { 
     return Arrays.asList(new Object[][] { 
      { 0, -1 }, { -1, 0 } 
     }); 
    } 

    @Parameterized.Parameter 
    public int row; 

    @Parameterized.Parameter(value = 1) 
    public int col; 

    @Test(expected = IndexOutOfBoundsException.class) 
    public void validateIndices(){ 
     check(row, col); 
    } 
} 
0

を、インデックスが両方ともInteger値であれば、その後のtry-catch文でループが可能です:

for (int i = iBegin; i < iEnd; i++) { 
    for (int j = jBegin; j < jEnd; j++) { 
    try { check(i, j); } 
    catch (Exception e) { iList.add(i); jList.add(j); } 
    } 
} 

(iListとjListはこの場合、あるタイプのCollectionで、iBegin、jBegin、iEnd、およびjEndは整数の値で、バリエーションの境界を与える)

2

Thあなたが探していることをやっているという意味で、他の答えは正しかったですが、一つの大きな概念的な欠点があります。エラー状況をチェックするだけです... を手動でに指定してください。

意味:この種のテストでは、「テスト対象のコード」が明確に定義されたケースで期待されることを実証するだけです。

これを環境に伝えるプログラミングモデルと比較してください。「これは私の機能が動作することを期待する方法です。その環境はあなたの関数が壊れた入力を見つけることを試みます。

おもしろいとお考えなら、QuickCheckをご覧ください。 Javaの "ネイティブ"ではなく、今のところ "主流"ではありませんが...試してみる価値があります。

6

@ Nicolas_Filotto答えに加えて、Junit Theoriesも使用できます。より読みやすく、Parameterizedと違って、すべての可能なパラメータの組み合わせでテストを実行します。

@RunWith(Theories.class) 
public class MyTest { 
    @DataPoints("cols") 
    public static int[] rowValues(){ 
     return new int[]{0, -1, 1, 2}; 
    } 
    @DataPoints("rows") 
    public static int[] colValues(){ 
     return new int[]{0, -1, 4, 5}; 
    } 

    @Theory 
    public void upperBoundIsChecked(@FromDataPoints("cols") int col, 
            @FromDataPoints("rows") int row){ 
     assumeTrue(row >= ROWS || col >= COLS); 
     try { 
      check(col, row); 
      fail("Should have thrown IllegalArgumentException"); 
     } catch (IllegalArgumentException ignore){} 
    } 

    @Theory 
    public void lowerBoundIsChecked(@FromDataPoints("cols") int col, 
            @FromDataPoints("rows") int row){ 
     assumeTrue(row < 0 || col < 0); 
     try { 
      check(col, row); 
      fail("Should have thrown IllegalArgumentException"); 
     } catch (IllegalArgumentException ignore){} 
    } 

    @Theory 
    public void validIndicesNoException(@FromDataPoints("cols") int col, 
             @FromDataPoints("rows") int row){ 
     assumeTrue(row >= 0 && col >= 0 && row < ROWS && col < COLS); 
     try { 
      check(col, row); 
     } catch (Exception e){ 
      fail("Should not have thrown an exception: " + e.getMessage()); 
     } 
    } 

} 

各理論は、理論の仮定に一致する可能性のあるすべての行と列の組み合わせをチェックします。

あるいは、COLSと行のリストが同じであれば、それも簡単に行うことができる:ユニットテストについての最も基本的なチュートリアルと同様に

@RunWith(Theories.class) 
public class MyTest { 

    @DataPoints 
    public static int[] values(){ 
     return new int[]{0, -1}; 
    } 
    @Theory 
    public void validateIndices(int col, int row){ 
     check(col,row); 
    } 
} 
+2

理論は、データポイントの組み合わせに対して幅広い動作をテストするのに非常に役立ちます。言及されていない1つの利点は、理論が失敗した場合、結果が失敗した原因となった値の特定の組み合わせを示します。 –

関連する問題