2016-04-15 233 views
0

參數化測試很適合將不同數據輸入到您的測試中。但是,我創建了一個示例計算器,我想爲其創建參數化測試。但是,我發現您只能爲單個測試創建一組參數化數據。使用多個測試進行參數化junit測試

我已經創建了參數化測試,用於在預期結果中添加2個數字。由於預期結果不同,這些數據將不會與減法一起使用。

是否有可能對每個測試的參數化數據進行加,減,乘和除?

非常感謝您的任何建議,

@RunWith(Parameterized.class) 
public class CalculatorModelPresenterTest { 

    private CalculatorModel mCalculatorModel; 

    /* Array of tests */ 
    @Parameterized.Parameters 
    public static Collection<Object[]> data() { 
     return Arrays.asList(new Object[][]{ 
       {3.0, 4.0, 7.0}, 
       {4.0, 3.0, 7.0}, 
       {8.0, 2.0, 10.0}, 
       {-1.0, 4.0, 3.0}, 
       {3256.0, 4.0, 3260.0} 
     }); 
    } 

    private double mNumberOne; 
    private double mNumberTwo; 
    private double mExpectedResult; 

    /* CONSTRUCTOR THAT ASSIGNS THE FIELDS WITH THE TEST DATA */ 
    public CalculatorModelPresenterTest(double numberOne, double numberTwo, double expectedResult) { 
     mNumberOne = numberOne; 
     mNumberTwo = numberTwo; 
     mExpectedResult = expectedResult; 
    } 

    /* THIS TEST WILL PASS AS THE TEST DATA IS FOR ADDING */ 
    @Test 
    public void testAdd() throws Exception { 
     final double actualResult = mCalculatorModel.add(mNumberOne, mNumberTwo); 
     assertEquals(actualResult, mExpectedResult, 0); 
    } 

    /* HOWEVER, THIS TEST WILL ALWAYS FAIL AS THE TEST DATA IS CUSTOMIZED FOR THE ADD */ 
    @Test 
    public void testSub() throws Exception { 
     final double actualResult = mCalculatorModel.sub(mNumberOne, mNumberTwo); 
     assertEquals(actualResult, mExpectedResult, 0); 
    } 

    @Before 
    public void setUp() throws Exception { 
     mCalculatorModel = new CalculatorModel(); 
    } 

    @After 
    public void tearDown() throws Exception { 
     mCalculatorModel = null; 
    } 
} 
+0

你並不需要設置'mCalculatorModel'到'null'在'tearDown'方法,因爲JUnit的每一組參數創建類'CalculatorModelPresenterTest'的新實例。 –

回答

1

只需添加另一個參數是這樣的:

return Arrays.asList(new Object[][]{ 
      {3.0, 4.0, 7.0, -1.0}, 
      {4.0, 3.0, 7.0, 1.0}, 
      {8.0, 2.0, 10.0, 6.0}, 
      {-1.0, 4.0, 3.0, -5.0}, 
      {3256.0, 4.0, 3260.0, 3252.0} 
    }); 

... 

private double mExpectedSubResult; 

/* CONSTRUCTOR THAT ASSIGNS THE FIELDS WITH THE TEST DATA */ 
public CalculatorModelPresenterTest(double numberOne, double numberTwo, double expectedResult, double expectedSubResult) { 
    mNumberOne = numberOne; 
    mNumberTwo = numberTwo; 
    mExpectedResult = expectedResult; 
    mExpectedSubResult = expectedSubResult; 
} 
... 

/* THIS TEST WILL NOW PASS */ 
@Test 
public void testSub() throws Exception { 
    final double actualResult = mCalculatorModel.sub(mNumberOne, mNumberTwo); 
    assertEquals(actualResult, mExpectedSubResult, 0); 
} 
+0

工作。只需要繼續添加參數到數組中。謝謝。 – ant2009

1

在JUnit 4中,你不能有多個@Parameters方法。您需要爲每個操作添加一個新類,並使用新參數。

+0

這就是我的想法,但我不想繼續添加類來做一些簡單的測試。 – ant2009

1

你可以寫爲每個測試的內部類與每個具有不同的參數,並與Enclosed亞軍運行它。

@RunWith(Enclosed.class) 
public class CalculatorModelPresenterTest { 

    @RunWith(Parameterized.class) 
    public static class Sum { 

     @Parameterized.Parameters 
     public static Object[][] data() { 
      return new Object[][]{ 
       {3.0, 4.0, 7.0}, 
       {4.0, 3.0, 7.0}, 
       {8.0, 2.0, 10.0}, 
       {-1.0, 4.0, 3.0}, 
       {3256.0, 4.0, 3260.0} 
      }; 
     } 

     @Parameterized.Parameter(0) 
     private double mNumberOne; 
     @Parameterized.Parameter(1) 
     private double mNumberTwo; 
     @Parameterized.Parameter(2) 
     private double mExpectedResult; 

     @Test 
     public void testAdd() throws Exception { 
      CalculatorModel calculatorModel = new CalculatorModel(); 
      double actualResult = calculatorModel.add(mNumberOne, mNumberTwo); 
      assertEquals(actualResult, mExpectedResult, 0); 
     } 
    } 

    @RunWith(Parameterized.class) 
    public static class Difference { 

     @Parameterized.Parameters 
     public static Object[][] data() { 
      return new Object[][]{ 
       {3.0, 4.0, -1.0}, 
       {4.0, 3.0, 1.0}, 
       {8.0, 2.0, 6.0}, 
       {-1.0, 4.0, -5.0}, 
       {3256.0, 4.0, 3252.0} 
      }; 
     } 

     @Parameterized.Parameter(0) 
     private double mNumberOne; 
     @Parameterized.Parameter(1) 
     private double mNumberTwo; 
     @Parameterized.Parameter(2) 
     private double mExpectedResult; 

     @Test 
     public void testSub() throws Exception { 
      CalculatorModel calculatorModel = new CalculatorModel(); 
      double actualResult = calculatorModel.sub(mNumberOne, mNumberTwo); 
      assertEquals(actualResult, mExpectedResult, 0); 
     } 
    } 
} 

另一種方法是使用JUnitParams亞軍。

@RunWith(JUnitParamsRunner.class) 
public class CalculatorModelPresenterTest { 

    @Test 
    @Parameters({ 
      "3.0, 4.0, 7.0", 
      "4.0, 3.0, 7.0", 
      "8.0, 2.0, 10.0", 
      "-1.0, 4.0, 3.0", 
      "3256.0, 4.0, 3260.0" }) 
    public void testAdd(double first, double second, double expectedResult) 
      throws Exception { 
     CalculatorModel calculatorModel = new CalculatorModel(); 
     double actualResult = calculatorModel.add(first, second); 
     assertEquals(actualResult, expectedResult, 0); 
    } 

    @Test 
    @Parameters({ 
      "3.0, 4.0, -1.0", 
      "4.0, 3.0, 1.0", 
      "8.0, 2.0, 6.0", 
      "-1.0, 4.0, -5.0", 
      "3256.0, 4.0, 3252.0" }) 
    public void testSub(double first, double second, double expectedResult) 
      throws Exception { 
     CalculatorModel calculatorModel = new CalculatorModel(); 
     double actualResult = calculatorModel.sub(first, second); 
     assertEquals(actualResult, expectedResult, 0); 
    } 
}