Java 参数化测试套件

Java 参数化测试套件,java,junit,junit4,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 } } 我想从不同的测

我有一系列参数化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);
  }
} 
@RunWith(Suite.class)
@SuiteClass({MyTest1.class,MyTest2.class,…})
公共类MyTestSuite1{
@参数
公共静态收集数据(){
对象[][]数据={{new MyParameter(1))};
返回数组.asList(数据);
}
} 
但它不起作用:我得到“MyTestX类上没有公共静态参数方法”

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

听起来您希望使用相同的参数运行不同的测试

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


您需要做的是将不同的
@Test
方法添加到
MyTestX
类中,并忘记参数化测试。然后您将只有一个类,并且您的测试将以清晰的方式组织。

听起来您希望使用相同的参数运行不同的测试

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


您需要做的是将不同的
@Test
方法添加到
MyTestX
类中,并忘记参数化测试。然后你就只有一门课了,你的测试将以一种清晰的方式组织起来。

我也遇到了类似的问题。通过创建包含
@Parameters
@RunWith(Parameterized.class)
的抽象类修复了此问题。该类由测试套件中的所有测试扩展。我发现的一件事是,
@参数
将在
@BeforeClass
@before
之前调用,无论这些注释是在测试套件还是测试中。希望这能有所帮助

我也有类似的问题。通过创建包含
@Parameters
@RunWith(Parameterized.class)
的抽象类修复了此问题。该类由测试套件中的所有测试扩展。我发现的一件事是,
@参数
将在
@BeforeClass
@before
之前调用,无论这些注释是在测试套件还是测试中。希望这能有所帮助

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

请检查您的导入语句,并应具有正确的参数语句,即导入org.junit.runners.Parameterized.parameters

如果它与任何其他parameters语句冲突,请尝试删除其他语句并仅保留此语句

这解决了我的问题


刚刚看到这篇文章已经有2年了,但这可能会帮助其他人解决同样的问题。

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

请检查您的导入语句,并应具有正确的参数语句,即导入org.junit.runners.Parameterized.parameters

如果它与任何其他parameters语句冲突,请尝试删除其他语句并仅保留此语句

这解决了我的问题

刚刚看到这篇文章已经2年了,但这可能会帮助其他人得到同样的问题

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

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

因此,如果您想在转到下一个参数之前首先执行单个参数的所有测试,您需要另一个运行程序。请查看为您提供
ParameterizedSuite
Runner的

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

@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}};
    }
我想从不同的测试套件中运行它们,每个套件的MyParameter值都不同

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

因此,如果您想在转到下一个参数之前首先执行单个参数的所有测试,您需要另一个运行程序。请查看为您提供
ParameterizedSuite
Runner的

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

@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}};
    }

我认为要实现这一点,您必须扩展Suite和参数化的runner类,以便前者捕获参数数据并将其传递给子runner,后者接收参数数据而不是来自带注释的方法,我认为,为了实现这一点,您必须扩展套件和参数化的运行程序类,以便前者捕获参数数据并将其传递给子运行程序,后者接收参数数据,而不是来自带注释的方法,而是来自套件运行程序。