2017-01-08 8 views
3

JUnitでデータ駆動型のパラメータ化メソッドを作成したいと考えています。クラス全体だけでなく、JUnitでのパラメータテストメソッド

私が見る例では、クラスの全体をパラメータ化しています。

など。

@RunWith(Parameterized.class) 
public class PrimeNumberCheckerTest { 

しかし、私は、単一のテスト方法、全体ではなくクラスをパラメータしたいと思います。 TestNGので

は、そのようなことは、このように見えるように思える:

@DataProvider(name = "test1") 
public static Object[][] primeNumbers() { 
    return new Object[][] {{2, true}, {6, false}, {19, true}, {22, false}, {23, true}}; 
} 

// This test will run 4 times since we have 5 parameters defined 
@Test(dataProvider = "test1") 
public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) { 
    System.out.println(inputNumber + " " + expectedResult); 
    Assert.assertEquals(expectedResult, 
    primeNumberChecker.validate(inputNumber)); 
} 

はJUnitの中にそのようなことは可能ですか?

EDIT:

  1. 最もエレガント/ DRYの方法は、単一のメソッドレベルの注釈持っているだろう - 私は願っていますものです。

  2. は、私がライブラリを見つけた:

https://github.com/Pragmatists/junitparams

例:

@RunWith(JUnitParamsRunner.class) 
public class PersonTest { 

    @Test 
    @Parameters({"17, false", 
       "22, true" }) 
    public void personIsAdult(int age, boolean valid) throws Exception { 
    assertThat(new Person(age).isAdult(), is(valid)); 
    } 

} 

疑問が残っている - JUnitのに組み込まれているようなものがありますか?

そうでなければ、ボイラープレートコードまたはクラスレベルの歪みを最小限に抑えることができる最も近いビルトイン物は何ですか?

答えて

2

@RunWith(Suite.class)@Suite.SuiteClassesを使用して、外部クラスをスイートに変換し、内部にネストされたクラス(スイートの「サブテストクラス」を定義)を持つことができます。それぞれに独自のランナーがあります。

@RunWith(Suite.class) 
@Suite.SuiteClasses({MyFooTest.Individual.class, MyFooTest.WithParams.class}) 
public class MyFooTest { 

    @RunWith(Parameterized.class) 
    public static class WithParams { 
    @Parameterized.Parameters 
    public static Collection<Object[]> primeNumbers() { 
     ... 
    } 
    @Test 
    public void testPrimeNumberChecker() { 
     ... 
    } 
    ... 
    } 

    public static class Individual { 
    @Test 
    public void someOneOffTest() { 
     ... 
    } 
    ... 
    } 
} 
+0

感謝。しかしこれはかなりオーバーヘッドのようです。私は単一のメソッドレベルのアノテーションを望んでいました...ここのように - https://github.com/Pragmatists/junitparams。 – KarolDepka

+0

私はこれらの発言を私の質問の「編集」セクションにも追加しました。 – KarolDepka

+1

私は自明ではありませんが、外部クラスそのものをサブスイートの1つとして使うことができます: '@ Suite.SuiteClasses({MyFooTest.class、MyFooTest.WithParams.class})'。そうすることで、パラメータ化されたテストだけが独自のクラスを必要とし、少なくともオーバーヘッドの一部が削減されます。それは多くのように感じる、私は同意する。私が知る限り、これはジュニットとの最善の方法です。 – yshavit

2

TestNGのはrun JUnit testsのことができるようになっている:ので、あなたはランナーとしてTestNGのを使用し、TestNGの中にJUnitの+新/パラメータ化テストの古いテストを持つことができます。

ドキュメントから:

TestNGのは、JUnitの3とJUnit 4つのテストを実行することができます。あなたがやらなければならないことは、testng.classNamesプロパティであなたのJUnitテストクラス を指定し、真の にtestng.junitプロパティを設定し、クラスパス上の JUnitのjarファイルを入れている:

<test name="Test1" junit="true"> 
    <classes> 
    <!-- ... --> 
+0

ありがとうございます。これを説明するリンクを提供してもらえますか(理想的には、引用符で)?理想的には、セットアップの現実的な限界を指摘してください。それから私はupvote :)。 – KarolDepka

+0

@KarolDepka見積もりが追加されました。 – juherr

関連する問題