2015-11-18 81 views
1

使用JUnit,您可以使用@RunWith(Parameterized.class)來提供一組參數傳遞給測試構造函數,然後對每個對象運行測試。混合參數化和程序化單元測試

我試圖將盡可能多的測試邏輯移入數據中,但有一些測試不會輕易轉換爲數據驅動的測試。有沒有辦法使用JUnit的Parameterized runner來運行一些帶參數的測試,然後添加非數據驅動的測試,這些測試對於每個測試對象構造都不會重複運行?

+0

有2個測試類有什麼問題?一個用於參數化,一個用於非參數化? – dkatzel

+0

我寧願在一次測試中爲一個類進行測試,而不是創建「MyClassDataDrivenTest」和「MyClassProgrammaticTest」。 –

回答

1

我的解決方法是創建一個類,並將編程和數據驅動的測試放在兩個單獨的子類中。 JUnit運行測試時,子類必須是靜態的。這是一個骨架:

@RunWith(Enclosed.class) // needed for working well with Ant 
public class MyClassTests { 
    public static class Programmatic { 
     @Test 
     public void myTest(){ 
      // test something here 
     } 
    } 

    @RunWith(Parameterized.class) 
    public static class DataDriven { 
     @Parameters 
     public static Collection<Object[]> getParams() { 
      return Collections.emptyList(); 
     } 

     private String data; 
     public DataDriven(String testName, String data){ 
      this.data = data; 
     } 
     @Test 
     public void test() throws AnalyzeExceptionEN{ 
      // test data string here 
     } 
    } 
} 
1

一種方法是使用Junit的Enclosed跑步者。它非常冗長,但也非常強大。它允許你在一個文件中組合多個不同的跑步者。

其他選項是使用自定義junit亞軍。肯定zohhak支持tests with parameters and without。小提取物:

@RunWith(ZohhakRunner.class) 
public class CoercingTest { 

    @TestWith("ONE_OF_ENUM_VALUES") 
    public void should_coerce_enum(SampleEnum param) { 
     assertThat(param).isEqualTo(SampleEnum.ONE_OF_ENUM_VALUES);  
    } 

    @Test 
    public void should_run_standard_junit_test() { 
     //this will also work 
    } 
} 

如果它對你來說還不夠,肯定你可以找到其他支持這兩種測試的跑步者。