TestNG迭代测试数据而不是测试方法

将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-service-loader )

这将允许您摆脱suite.xml,并且只允许您在类路径上保留此META-INF和启用程序所需的内容。 任何时候你都会运行任何测试,这将被加载 – 不需要配置任何像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); } } }