2016-02-29 64 views
0
@RunWith(JUnitParamsRunner.class) 
public class MySimpleTest { 

    private MyRec rec; 
    private Matrix matrix; 

    @Before 
    public void createRecognizerBeforeEveryExecution() { 
     rec = new MyRec(); 
     matrix = MatrixUtils.createMatrixWithValues(); 
    } 

    public static Iterable<Object[]> data() { 
     return Arrays.asList(
       new Object[]{"expectedvalue1", "input1"}, 
       new Object[]{"expectedvalue2", "input2"} 
     ); 
    } 

    @Test 
    @Parameters(method = "data") 
    public void test1(String output, String input) { 
     rec.fun1(matrix); 
     assertEquals(output, rec.someFunction(input)); 
    } 

    public static Iterable<Object[]> data2() { 
     return Arrays.asList(
       new Object[]{"expectedothervalue1", "input1"}, 
       new Object[]{"expectedothervalue2", "input2"} 
     ); 
    } 

    @Test 
    @Parameters(method = "data2") 
    public void test2(String output, String input) { 
     rec.fun1(matrix); 
     rec.fun2(matrix); 
     assertEquals(output, rec.someFunction(input)); 
    } 

} 

我試圖找出什麼是進行此測試的正確方法。我想使用參數化測試,因爲這非常方便。所以你可以看到,在每個測試函數中,我都調用了一些函數(fun1fun2)。但每次測試只需要調用一次(例如每次參數化測試執行之前)。JUnitParams - 在測試之前執行單獨的方法

有什麼辦法告訴JUnitParams它應該在執行所有參數化測試之前執行其他函數嗎?

我不能使用@Before註釋,因爲您可以在test1中看到我沒有使用fun2。它認爲它應該由單獨的函數執行。

回答

0

我決定使用TestNG的解決這個問題(代碼只是爲了證明我的思路):

import org.testng.Assert; 
import org.testng.annotations.*; 

import java.lang.reflect.Method; 

public class TempTest { 

    private Integer number; 

    @BeforeMethod 
    public void init(Method m) { 
     number = 5; 
     switch(m.getName()) { 
      case "test2": 
       fun(10); 
       fun2(5); 
       break; 
      case "test1": 
       fun(10); 
       break; 
     } 
    } 

    public void fun(int value) { 
     number += value; 
    } 

    public void fun2(int value) { 
     number -= value; 
    } 

    @Test 
    public void test1() { 
     Assert.assertEquals(new Integer(15), number); 
    } 

    @Test 
    public void test2() { 
     Assert.assertEquals(new Integer(10), number); 
    } 

    @Test 
    public void test3() { 
     Assert.assertEquals(new Integer(5), number); 
    } 

} 
1

解決方案1:

的樂趣[1 | 2]不依賴於內部測試狀態,試圖據此裏面放上數據和數據2的方法調用。

public static Iterable<Object[]> data() { 
     rec.fun1(matrix); 
     return Arrays.asList(
       new Object[]{"expectedvalue1", "input1"}, 
       new Object[]{"expectedvalue2", "input2"} 
     ); 
    } 

public static Iterable<Object[]> data2() { 
     rec.fun1(matrix); 
     rec.fun2(matrix); 
     return Arrays.asList(
       new Object[]{"expectedvalue1", "input1"}, 
       new Object[]{"expectedvalue2", "input2"} 
     ); 
    } 

解決方案2:

劈裂測試用例是不是最佳做法。你的測試很難保持。流程要複雜得多。您的測試開始也有風險取決於對方。測試中的複製有時候會更好。

PS: 如果您正在使用的字符串作爲測試方法的參數最好是通過他們完全像在這個文件的第25行:中 https://github.com/Pragmatists/JUnitParams/blob/master/src/test/java/junitparams/usage/SamplesOfUsageTest.java,而不是特殊的方法。

@Test 
@Parameters({"AAA,1", "BBB,2"}) 
public void paramsInAnnotation(String p1, Integer p2) { } 
+0

如果我理解正確的解決方案2,我不應該在這裏使用參數化的測試,但只需在一種測試方法中生成一些重複的檢查。這是正確的方法? –

+0

我假設你想通過移動常見代碼到另一個地方(這使得它們更復雜的恕我直言)在測試之間刪除重複(有趣的方法)。你的@Parameters是好的(你想在少數數據集上運行你的測試用例),但它可以做一點simmpler(看PS編輯) –

相關問題