当将DataProvider与多个TestNG方法一起使用时,每个方法都会按顺序使用所有数据集运行。相反,我希望对数据集进行迭代,并在每次迭代中执行所有方法。我不在乎结果是显示每个测试方法的结果还是每个方法的运行摘要。
我已经尝试了选项
order-by-instances="true"
在suite.xml中没有成功。
样本代码:
public class TestNGTest
{
@DataProvider(name = "dp")
public Object[][] createData(Method m) {
return new Object[][] { new Object[] { "Cedric" }, new Object[] {"Martina"}};
}
@Test(dataProvider = "dp")
public void test1(String s) throws InterruptedException {
System.out.println("test1 " + s);
Thread.sleep(1000);
}
@Test(dataProvider = "dp")
public void test2(String s) throws InterruptedException {
System.out.println("test2 " + s);
Thread.sleep(1000);
}
}
实际结果:
test1 Cedric
test1 Martina
test2 Cedric
test2 Martina
PASSED: test1("Cedric")
PASSED: test1("Martina")
PASSED: test2("Cedric")
PASSED: test2("Martina")
想要的结果:
test1 Cedric
test2 Cedric
test1 Martina
test2 Martina
PASSED: test1("Cedric")
PASSED: test2("Cedric")
PASSED: test1("Martina")
PASSED: test2("Martina")
请尝试使用以下侦听器GroupByInstanceEnabler。你可以把这个监听器放在测试类的Listeners注释中(或者测试基类,如果有),或者更简单更好的解决方案是把它放在META-INF中,让TestNg使用ServiceLoader加载它(http://testng.org/doc/documentation-main.html#listeners-服务加载器)
这将允许您摆脱suite.xml,并且只需要在类路径中保留此META-INF和enabler。任何时候你运行任何测试,都会加载它——不需要配置IDE之类的任何东西,创建要运行的套件——它总是会开箱即用地加载你的监听器。
import org.testng.ISuite;
import org.testng.ISuiteListener;
public class GroupByInstanceEnabler implements ISuiteListener {
@Override
public void onStart(ISuite suite) {
suite.getXmlSuite().setGroupByInstances(true);
}
@Override
public void onFinish(ISuite suite) {
}
}
爪
使用Factory、DataProvider和注入的XmlTest对象找到了一个解决方案。
当然,TestClass可以在另一个文件中。然而,我更喜欢把它作为一个内部类,因为它无论如何都不能在没有工厂的情况下运行。这个解决方案的唯一缺点是不能从类中运行单个测试。
package com.nhp.ts.test.business.qi;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;
import org.testng.xml.XmlTest;
public class FooTest {
@DataProvider(name = "dp")
public Object[][] createData() {
return new Object[][] {
{ "Cedric" },
{ "Martina" }
};
}
@Factory(dataProvider = "dp")
public TestClass[] testFactory(String name) {
return new TestClass[] { new TestClass(name) };
}
public class TestClass {
private String name;
public TestClass(String name) {
this.name = name;
}
@BeforeTest
public void setOptions(XmlTest test)
{
test.setGroupByInstances(true);
}
@Test
public void test1() throws InterruptedException {
System.out.println("test1 " + name);
}
@Test
public void test2() throws InterruptedException {
System.out.println("test2 " + name);
}
}
}