我有一堆参数化的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类上没有公共静态参数方法”。
有没有办法从测试套件而不是测试用例中指定参数? 如果可能的话,我想避免为每个测试套件创建一个新类。
答案 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}};
}