我有以下代码,其中url
中的每个listOne
都使用方法testItem
进行测试:
@Parameters(name="{0}")
public static Collection<Object[]> data() throws Exception {
final Set<String> listOne = getListOne();
final Collection<Object[]> data = new ArrayList<>();
for (final String url : listOne) {
data.add(new Object[] { url });
}
return data;
}
@Test
public void testItem() {
driverOne.makeDecision(urlToTest);
assertTrue(driverOne.success(urlToTest);
}
如果我现在想要添加第二个列表listTwo
,并运行一个如下listTwo
(但不是listOne
的项目<)的1}}上定义的测试方法,该怎么办?
@Test
public void testItemAlternate() {
driverTwo.makeDecision(urlToTest);
assertTrue(driverTwo.success(urlToTest));
}
也就是说,我希望driverOne
为listOne
中的所有网址做出决定,并且我希望driverTwo
为listTwo
中的所有网址做出决定。将此转换为代码的最佳方法是什么?感谢。
答案 0 :(得分:1)
引自:https://github.com/junit-team/junit/wiki/Parameterized-tests
自定义运行器Parameterized实现参数化测试。运行参数化测试类时,会为测试方法和测试数据元素的交叉产品创建实例。
因此,我假设不,那是不可能的。
如果你想做这样的事情,我猜你要么
(1)将需要为每个要用第一个集合执行的测试构建一个测试类,并为每个测试构建一个测试类,以便用第二个集合执行或
(2)除了@Parameters
注释之外还需要使用其他机制,也许是手工制作的。
答案 1 :(得分:0)
您可以在测试集数据本身中包含一些测试集标识符,然后使用org.junit.Assume类来帮助:
@Test
public void testItem() {
org.junit.Assume.assumeTrue(testSetId.equals("TEST_SET_1"));
driverOne.makeDecision(urlToTest);
assertTrue(driverOne.success(urlToTest);
}
@Test
public void testItemAlternate() {
org.junit.Assume.assumeTrue(testSetId.equals("TEST_SET_2"));
driverTwo.makeDecision(urlToTest);
assertTrue(driverTwo.success(urlToTest));
}
答案 2 :(得分:0)
作为完全不同的答案,存在junit-dataprovider