2016-04-15 234 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); 
    } 
}