在JUnit中参数化测试方法,而不仅仅是整个类

时间:2017-01-08 21:00:20

标签: java junit testng data-driven-tests testng-dataprovider

我想在JUnit中创建一个数据驱动的参数化方法

我看到的示例,参数化整个

E.g。

@RunWith(Parameterized.class)
public class PrimeNumberCheckerTest {

但是,我想参数化单个测试方法,而不是整个

在TestNG中,类似的东西看起来像这样:

@DataProvider(name = "test1")
public static Object[][] primeNumbers() {
   return new Object[][] {{2, true}, {6, false}, {19, true}, {22, false}, {23, true}};
}

// This test will run 4 times since we have 5 parameters defined
@Test(dataProvider = "test1")
public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) {
   System.out.println(inputNumber + " " + expectedResult);
   Assert.assertEquals(expectedResult,
   primeNumberChecker.validate(inputNumber));
}

在JUnit中是否可以这样做?

编辑:

  1. 最优雅/干燥的方式是使用单个方法级别的注释 - 这是我所希望的。

  2. 我找到了一个图书馆:

  3. https://github.com/Pragmatists/junitparams

    示例:

    @RunWith(JUnitParamsRunner.class)
    public class PersonTest {
    
      @Test
      @Parameters({"17, false", 
                   "22, true" })
      public void personIsAdult(int age, boolean valid) throws Exception {
        assertThat(new Person(age).isAdult(), is(valid));
      }
    
    }
    

    问题仍然存在 - JUnit内置了类似内容吗?

    如果没有,那么最接近锅炉板代码或类级扭曲的最接近的内置物是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用@RunWith(Suite.class)@Suite.SuiteClasses将外部类转换为套件,然后在内部嵌套类(定义套件的“子测试类”),每个类都带有它们自己的跑步者。

@RunWith(Suite.class)
@Suite.SuiteClasses({MyFooTest.Individual.class, MyFooTest.WithParams.class})
public class MyFooTest {

  @RunWith(Parameterized.class)
  public static class WithParams {
    @Parameterized.Parameters
    public static Collection<Object[]> primeNumbers() {
      ...
    }
    @Test
    public void testPrimeNumberChecker() {
      ...
    }
    ...
  }

  public static class Individual {
    @Test
    public void someOneOffTest() {
      ...
    }
    ...
  }
}

答案 1 :(得分:2)

TestNG应该能够run JUnit tests:因此,您可以使用TestNG作为跑步者,并在TestNG中的JUnit +新/参数化测试中使用旧测试。

来自文档:

  

TestNG可以运行JUnit 3和JUnit 4测试。所有你需要做的就是放   类路径上的JUnit jar文件,指定您的JUnit测试类   在testng.classNames属性中并将testng.junit属性设置为   真:

<test name="Test1" junit="true">
  <classes>
    <!-- ... -->