![](/img/trans.png)
[英]How can I run all the dataProvider entries in one class in parallel?
[英]How can I use an Object iterator DataProvider and run multiple tests in parallel in java?
所以我需要检查多个 CSV(超过 500k)并且数量永远不会相同。 每个 CSV 文件有一行或多行,共 30 行。 我需要获取每个文件,并验证来自 API 的数据字段。
我现在想的解决办法是:
一个 DataProvider 可以为 Object 迭代器提供我需要检查的所有文件。 对于每个文件,我将执行多个测试(10-15)。 所有这些都与多个线程并行运行。 为了不为每个测试执行 API 请求,我需要发出请求@BeforeSuite。
我没有找到与这种类型的 DataProvider 并行执行测试的任何方法。 测试首先对所有数据集运行 test1,然后对所有数据集运行 test2,因此使 API 调用 @BeforeSuite 没有任何价值。 任何想法?
这是一个代码示例:
数据工厂:
import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class DataFactory {
@Factory(dataProvider = "dp")
public Object[] createInstances(String filename) {
return new Object[]{new TestSuite(filename)};
}
private static final String CSV_PATH = "src/main/resources/files/";
@DataProvider(name = "dp")
public Iterator<Object[]> getFileList() {
File[] files = new File(CSV_PATH).listFiles();
List<Object[]> data = new ArrayList<>();
for (File file : files) {
data.add(new String[]{file.getName()});
}
return data.iterator();
}
}
测试 class:
import java.lang.reflect.Method;
import org.testng.annotations.Test;
public class TestSuite {
String filename1 = "";
public TestSuite(String filename) {
filename1 = filename;
}
@Test
public void test1(Method res) {
System.out.println("…Executing…" + res.getName() + " dataProviderData " + filename1 + " thread number " + Thread.currentThread().getId());
}
@Test
public void test2(Method res) {
System.out.println("…Executing…" + res.getName() + " dataProviderData " + filename1 + " thread number " + Thread.currentThread().getId());
}
TestNG XML 配置:
<suite name="Tests Suite" thread-count="20" parallel="methods">
<test name="CSV test">
<classes>
<class name="DataFactory" group-by-instances="true"/>
</classes>
</test>
</suite>
找到了一个解决方案:
在我的测试套件文件中添加了@BeforeClass:
@BeforeClass
public void getIdFromFilename(ITestContext context) throws IOException {
String id = "";
String name = "";
//Get data from API
//Get data from CSV
context.setAttribute("product", product);
context.setAttribute("id", id);
context.setAttribute("name", name);
}
@Test
public void test1(ITestContext context) {
PojoApi product = (PojoApi) context.getAttribute("product");
String idFromApi = product.getId();
String id = (String) context.getAttribute("id");
System.out.println("Test id: ");
System.out.println("Product id from api: " + idFromApi);
System.out.println("Product id from CSV: " + id);
System.out.println(Thread.currentThread().getId());
Assert.assertEquals(id, idFromApi);
}
@Test
public void test2(ITestContext context) {
PojoApi product = (PojoApi) context.getAttribute("product");
String name = (String) context.getAttribute("name");
String nameFromAPI = product.getName();
System.out.println("Test name: ");
System.out.println("Product name from api: " + nameFromAPI);
System.out.println("Product name from CSV: " + name);
System.out.println(Thread.currentThread().getId());
Assert.assertEquals(name, nameFromAPI);
}
我将并行模式更改为 parallel="instances" 到 TestNG XML 配置
<suite name="CSV Suite" group-by-instances="true" parallel="instances" thread-count="10">
<test name="CSV Test" >
<classes>
<class name="DataFactory"/>
</classes>
</test>
</suite>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.