3

假设我有一个 JUnit 测试用例:

@RunWith(Parameterized.class)
public class TestMyClass {

    @Parameter
    private int expected;
    @Parameter
    private int actual;  

    @Parameters
    public static Collection<Object[]> data() {
    return Arrays.asList(new Object[][] {     
             { 0,1 }, { 1,2 }, { 2,3 }, { 3,4 }, { 4,5 }, { 5,6 },{ 6,7 }  
       });
    }

    @Test
    public void test1 { //test }

    @Test
    public void test2 { //test }

}

我想只用 {0,1}、{1,2} 和 {2,3} 运行 test1,只用 {3,4}、{4,5} {5,6} 运行 test2

我怎样才能做到这一点?

编辑:在运行时从文件中读取参数。

4

3 回答 3

2

似乎没有办法使用 JUnit 标准的“@Parameters”东西在一次类中为不同的测试使用不同的参数集。你可以试试junit-dataprovider。它类似于 TestNG 数据提供者。例如:

@RunWith(DataProviderRunner.class)
public class TestMyClass {

    @DataProvider
    public static Object[][] firstDataset() {
    return new Object[][] {     
             { 3,4 }, { 4,5 }, { 5,6 },{ 6,7 }  
       };
    }


    @DataProvider
    public static Object[][] secondDataset() {
    return new Object[][] {     
             { 3,4 }, { 4,5 }, { 5,6 },{ 6,7 }  
       };
    }

    @Test
    @UseDataProvider("firstDataset")
    public void test1(int a, int b) { //test }

    @Test
    @UseDataProvider("secondDataset")
    public void test2(int a, int b) { //test }

}

或者您可以为每个测试创建 2 个类。

但我认为使用 junit-dataprovider 更方便。

于 2015-09-23T10:19:04.080 回答
1

有很多 junit 库可以让你做到这一点。如果您预先知道您的参数(看起来像您的情况),使用 zohhak 进行参数化测试可能是最简单的:

@RunWith(ZohhakRunner.class)
public class TestMyClass {      

    @TestWith({
        "1, 6".
        "2, 8",
        "3, 4"
    })
    public void test1(int actual, int expected) { //test }

    @TestWith({
        "2, 2".
        "0, -8",
        "7, 1"
    })
    public void test2(int actual, int expected) { //test }

}

如果您需要在运行时构建参数(生成,从文件读取等),那么您可以检查junit-dataproviderjunit-params

于 2015-09-23T10:41:55.270 回答
1

Enclosed如果您不想使用其他库,可以使用 JUnit 的运行器:

@RunWith(Enclosed.class)
public class ATest {

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

    @Parameter
    private int expected;
    @Parameter
    private int actual;  

    @Parameters
    public static Collection<Object[]> data() {
      return Arrays.asList(new Object[][] {     
         { 0,1 }, { 1,2 }, { 2,3 }  
      });
    }

    @Test
    public void test1 {
      //test
    }
  }

  @RunWith(Parameterized.class)
  public static class TestMyClass {
    @Parameter
    private int expected;
    @Parameter
    private int actual;  

    @Parameters
    public static Collection<Object[]> data() {
      return Arrays.asList(new Object[][] {     
         { 3,4 }, { 4,5 }, { 5,6 },{ 6,7 }  
      });
    }

    @Test
    public void test2 {
      //test
    }
  }
}

顺便说一句:您不必使用 JUnit 4.12 用 List 包装参数。

@Parameters
public static Object[][] data() {
  return new Object[][] {     
     { 0,1 }, { 1,2 }, { 2,3 }  
  };
}
于 2015-09-23T13:06:00.913 回答