自定义使用JUnit @Parameters运行哪些测试?

时间:2014-07-28 17:39:30

标签: java junit

我有以下代码,其中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的项目<)的

@Test
public void testItemAlternate() {
    driverTwo.makeDecision(urlToTest);
    assertTrue(driverTwo.success(urlToTest));
}

也就是说,我希望driverOnelistOne中的所有网址做出决定,并且我希望driverTwolistTwo中的所有网址做出决定。将此转换为代码的最佳方法是什么?感谢。

3 个答案:

答案 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