2013-10-05 48 views
24

我目前正在做我的第一個Java項目,並且喜歡完全TDD它。我正在使用JUnit編寫測試。顯然,JUnit不支持data providers,這使得用20個不同版本的參數測試相同的方法相當麻煩。支持數據提供者的最流行/標準的Java測試工具是什麼?我遇到了TestNG,但不知道這是多麼受歡迎,或者它如何與替代品相比。用數據提供者編寫Java測試

如果有一種方法來獲得這種行爲是使用JUnit的一種很好的方式,那麼這也可能工作。

+0

JUnit有參數化測試。 –

+0

但請注意,參數化JUnit測試的Eclipse集成很糟糕。 a)運行單個參數集是不可能的,b)從JUnit窗口很難判斷哪個參數在測試過程中實際上失敗了(在列表中看到類似於[0],[1],[2]的東西)。 – 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

根據在靈活性VS可讀性您的需求,您可以選擇Parameterized - JUnit的內置選項,通過dkatzel描述。其他選項是由外部庫像zohhak提供的外部JUnit的選手,這讓你做的:

@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有一點不同的功能。只選擇你最適合的任何套裝

36

我們公司的同事們爲JUnit寫了一個免費提供的TestNG風格的DataProvider,你可以找到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