2013-10-05 12 views
24

私は現在、私の最初のJavaプロジェクトを行っており、完全にTDD化したいと思っています。私はテストを書くためにJUnitを使用しています。どうやらJUnitはdata providersのサポートを提供していないので、20種類の引数を使って同じメソッドをテストするのは面倒です。データプロバイダをサポートするJavaのための最も一般的な/標準のテストツールは何ですか?私はTestNGに出くわしましたが、それがどれほど普及しているのか、あるいはそれがどのように代替案と比較されているのかは分かりません。データプロバイダによるJavaテストの作成

この動作を実現する方法がある場合は、JUnitを使用すると便利です。

+0

JUnitにはパラメータ化されたテストがあります。 –

+0

しかし、パラメータ化されたJUnitテストのEclipse統合がうまくいくことに注意してください。 a)1つのパラメータセットを実行することはできません。b)テスト中に実際に失敗したパラメータ([0]、[1]、[2]など)がJUnitウィンドウからわかりにくいです。 – qqilihq

+2

@qqilihq JUnit 4.11にはパラメータ化されたテストの名前を付け加えることで、この種の問題が解決されました。https://github.com/junit-team/junit/blob/master/doc/ReleaseNotes4.11.md – dkatzel

答えて

23

のJUnit 4は可読性対柔軟性で、ニーズに応じて、PHPのデータプロバイダ

@RunWith(Parameterized.class) 
public class MyTest{ 
    @Parameters 
    public static Collection<Object[]> data() { 
      /*create and return a Collection 
      of Objects arrays here. 
      Each element in each array is 
      a parameter to your constructor. 
      */ 

    } 

    private int a,b,c; 


    public MyTest(int a, int b, int c) { 
      this.a= a; 
      this.b = b; 
      this.c = c; 
    } 

    @Test 
    public void test() { 
      //do your test with a,b 
    } 

    @Test 
    public void testC(){ 
     //you can have multiple tests 
     //which all will run 

     //...test c 
    } 
} 
+4

これは同じですが、同じではありません。 PHPのデータプロバイダは、メソッドに引数を渡します。あなたの例では、引数はテストクラスのコンストラクタに渡されます。値のリストを取得したい複数のテストメソッドがある場合はどうなりますか?それぞれのテストクラスを作成するのは非常に面倒です。 –

+0

複数のテストメソッドにそれぞれ '@ Test'アノテーションを付けることができます。すべてのテストが行​​使されます。どのように表示するために私の答えを少し更新しました – dkatzel

+8

同じリストの引数または要素の同じリストを使用する複数のテストがある場合には、これは適しています。重複がなければ、それは本当に助けにはなりません。私の場合、私は有効な入力のリストと、重複がない無効な入力のリストを持っています。それらをまとめることは非常に奇妙です。 –

6

と同じことをしているテストをパラメータ化している、あなたが選ぶことができますParameterized - JUnitの者がdkatzelによって説明、オプションに建て。少し異なる機能を持つ

@TestWith({ 
     "clerk,  45'000 USD, GOLD", 
     "supervisor, 60'000 GBP, PLATINUM" 
    }) 
    public void canAcceptDebit(Employee employee, Money money, ClientType clientType) { 
     assertTrue( employee.canAcceptDebit(money, clientType) ); 
    } 

junitParams:その他のオプションは、あなたがしてみましょうzohhakのような外部のライブラリが提供する外部のJUnitランナー、です。あなたに最も合うものを選んでください

36

私たちの同僚のチームは、無料で入手できるDataProviderをJUnit用のTestNGスタイルで書いています。このデータプロバイダはon github (https://github.com/TNG/junit-dataprovider)です。

私たちは非常に大きなプロジェクトでそれを使用しています。 JUnitのParameterizedにはいくつかの利点があります。別々のクラスのオーバーヘッドを減らし、単一のテストも実行できるからです。

の例では、この

@DataProvider 
public static Object[][] provideStringAndExpectedLength() { 
    return new Object[][] { 
     { "Hello World", 11 }, 
     { "Foo", 3 } 
    }; 
} 

@Test 
@UseDataProvider("provideStringAndExpectedLength") 
public void testCalculateLength(String input, int expectedLength) { 
    assertThat(calculateLength(input)).isEqualTo(expectedLength); 
} 

編集のようになります。V1.7以降、それはまた、データ(文字列、リスト)を提供するために、別の方法があるようにプロバイダーをインライン化することができ、他の方法をサポートしています必ずしも必要ではない。

完全な実際の例は、githubのマニュアルページにあります。また、ユーティリティクラスのプロバイダを収集し、他のクラスからアクセスするなど、いくつかの機能もあります。マニュアルページは非常に詳細です。そこには何か質問があります。

+2

上記の例を実行しようとしている人は、 '@RunWith(DataProviderRunner.class)'アノテーションをテストクラスに追加することを忘れないでください! – ADi3ek

関連する問題