2011-11-11 171 views
1

我正在寫測試API的jnuit測試用例。問題與junit測試案例!避免代碼重複

我的課是如下

class MyTest extends TestCase{ 
    List<String> argList; 
    public MyTest(){ 
    //read argList from File 
    } 



    testMyTest(){ 
     //callmy api 
     myApi(arg1); 
     } 

} 

現在我想爲每個50個args.Args的一個單獨的測試用例是從文件中讀取。我不想用不同的參數來調用myApi的獨立方法。我該怎麼做? 我不想寫sperate方法,如

testMyTest1(){ 
    //callmy api 
    myApi(arg1); 
    } 

testMyTest1(){ 
    //callmy api 
    myApi(arg2); 
    } 
+0

太少信息給出。什麼是參數類型,myApi調用期望輸出什麼,如何驗證測試用例是否已通過等等。 –

回答

1
private static final String[] args = new String[] {.....}; 

@Test 
public void myTest(){ 
    for (int i=0; i<args.length; i++){ 
     myApi(args[i]; 
    } 
} 

上述回答你的問題,我認爲,但是這是不好的JUnit實踐。最好每個測試方法只用一個測試條件調用被測方法一次。這樣,如果多個事情都是錯誤的,那麼每個人都會得到一個單獨的錯誤,而不是一次處理一個錯誤。這表明了以下幾點:

private static final String[] args = new String[] {.....}; 

private void testMyTest(String arg){ 
    myApi(arg); 
} 

@Test 
public void myTest0(){ 
    testMyTest(args[0]); 
} 
@Test 
public void myTest1(){ 
    testMyTest(args[1]); 
} 

也許是最好的機制是做上面的第一個選項,但使用ErrorCollector規則,以允許要報告多個錯誤。

編輯我糾正了,jordao關於參數化測試的回答確實是最好的方法。

2

爲此,您可以使用parameterized test

+0

噢!絕對是這樣做的正確方法。 –

+0

有沒有一種方法可以在測試的一個子集上運行參數化測試?即一組測試應該只運行一次,另一組應該爲每個參數多次運行一次?或者這通常是使用多個測試類來完成的? –

+0

@JohnB:是的,多個測試類將解決這個問題... –

0

單元測試通常使用斷言進行。你不需要爲每個參數編寫一個方法,但是根據你的參數執行不同的斷言。做這將是

方式一:

class MyApiTest extends TestCase { 
    List<String> argList; 

    public MyApiTest() {} 

    public testMyApi() { 
     assertTrue(testMyApi(arg1)); 
     assertFalse(testMyApi(arg2)); 
     assertNull(testMyApi(arg3)); 
     assertEquals(testMyApi(arg4), testMyApi(arg5)); 
    } 
} 

我甚至寧願使用註釋,像

class MyApiTest { 
    @Before 
    public setUp() {} 

    @After 
    public tearDOwn() {} 

    @Test 
    public testMyApi() { 
     Assert.assertTrue(testMyApi(arg1)); 
     Assert.assertFalse(testMyApi(arg2)); 
     Assert.assertNull(testMyApi(arg3)); 
     Assert.assertEquals(testMyApi(arg4), testMyApi(arg5)); 
    } 
}