参数化测试套件

时间:2012-05-05 15:45:18

标签: java junit junit4

我有一堆参数化的JUnit4测试,它们看起来都像:

@RunWith(Parameterized.class)
public class MyTestX {
  private final MyParameter param;
  public TestX(MyParameter param) { 
    this.param = param; 
  }

  @Test
  public void myTest() {
    // Some test code
  }
}

我想从不同的测试套件中运行它们,每个测试套件都有不同的MyParameter值。

我尝试了以下内容:

@RunWith(Suite.class)
@SuiteClasses( { MyTest1.class, MyTest2.class, ... })
public class MyTestSuite1 {

  @Parameters
  public static Collection<Object[]> data() {
    Object[][] data = {{ new MyParameter(1) )}};
    return Arrays.asList(data);
  }
} 

但它不起作用:我得到“MyTestX类上没有公共静态参数方法”。

有没有办法从测试套件而不是测试用例中指定参数? 如果可能的话,我想避免为每个测试套件创建一个新类。

4 个答案:

答案 0 :(得分:1)

我有类似的问题。它是通过创建一个包含@Parameters@RunWith(Parameterized.class)的抽象类来修复的。测试套件中的所有测试都扩展了这个类。我发现的一件事是@Parameters将在@BeforeClass@Before之前调用,无论这些注释是在您的测试套件还是您的测试中。希望这会有所帮助。

答案 1 :(得分:0)

听起来您想要使用相同的参数运行不同的测试。

参数化测试用于运行具有不同参数的相同测试。如果您的测试不完全相同,那么您需要进行不同的测试。

您需要做的是向@Test课程添加不同的MyTestX方法,而忘记参数化测试。那么你将只有一个课程,你的测试将以清晰的方式组织。

答案 2 :(得分:0)

我正在学习Junit和WebDriver,在我的junit练习中,我也遇到了类似的错误。不知道我的答案会有多大用处,但值得一试。

请检查您的import语句,并且应该有正确的参数声明,即 import org.junit.runners.Parameterized.Parameters ;

如果它与任何其他参数语句冲突,则尝试删除另一个语句并仅保留此语句。

这解决了我的问题。

刚看到这篇文章是2岁,但这可能会帮助其他人现在得到同样的问题。

答案 3 :(得分:0)

  

我想从不同的测试套件中运行它们,每个测试套件都有不同的MyParameter值。

您的要求与Parameterized的正常行为不同:如果您定义了测试层次结构并为它们分配了同一组参数(Object[][]),那么JUnit框架将运行所有测试第一个测试用例的参数,在它转到下一个测试用例并使用所有参数运行之前。

所以如果你想先执行单个参数的所有测试,然后再转到下一个参数,你需要另一个参赛者。请查看this library为您提供ParameterizedSuite亚军。

参数化测试套件如下所示:

@RunWith(ParameterizedSuite.class)
@SuiteClasses({OneTest.class, TwoTest.class})
public class MyParameterizedTestSuite {
    @Parameters(name = "Parameters are {0} and {1}")
    public static Object[] params() {
        return new Object[][] {{'A',1}, {'B',2}, {'C',3}};
    }