【问题标题】:TestNG parallel test/method using dataprovoder使用 dataprovoder 的 TestNG 并行测试/方法
【发布时间】:2016-12-05 22:57:35
【问题描述】:
我有一个像这样的 testNG 方法:
@Test(dataProvider="takeMyProvider")
public void myTest(String param1, String param2){
System.out.println(param1 + " " + param2);
}
我的数据提供者返回 10 个元素。我的方法将在一个线程中执行 10 次。这怎么可能平行呢?例如
- 我想同时使用 5 个方法。 webdriver 应该同时打开 5 个浏览器。并行执行这 5 个测试后,应执行其他 5 个测试
或
- webdriver 应该打开 10 个浏览器并并行处理所有 10 个元素
有人有想法吗?
【问题讨论】:
标签:
java
selenium
selenium-webdriver
testng
【解决方案1】:
非常感谢您的反馈和有用的提示。
我的测试可能以任何并行方式运行,但仅在一个浏览器实例中运行。
让我们详细了解一下:
我的数据提供者返回一个对象[][]
@Dataprovider(name = "takeMyProvider", parallel = true)
public object[][] myProvider(){
return new object[][]{{"1", "name1"}, {"2", "name2"} {"3", "name3"}}
}
这个测试方法执行了3次
@Test(dataProvider="takeMyProvider")
public void myTest(String param1, String param2){
System.out.println(param1 + " " + param2);
}
但仅在一个浏览器实例中。这不是我想要的。
我希望 testNG 启动 3 个 chrome 实例并并行执行 3 个测试。
顺便说一句,我正在硒网格上运行测试。也许有 100 个节点。
当 100 个节点并行执行此测试时,这将是完美的。甚至 1.000,取决于数据提供者。
有人有想法吗?
最好的问候
【解决方案2】:
您可以通过 TestNG 中的套件文件定义并行度。以下示例以 10 个线程并行运行方法:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="MySuiteNameHere" parallel="methods" thread-count="10">
<test name="Selenium Tests">
<classes>
<class name="foo.bar.FooTest"/>
</classes>
</test>
</suite>
您还需要注意,您的数据提供程序可以是线程安全的,以允许它不强制方法按顺序运行。
// data providers force single threaded by default
@DataProvider(name = "takeMyProvider", parallel = true)
不过要小心。当使用并行方法运行时,TestNG 不会创建类对象的新实例。这意味着如果您在测试类对象上保存值,您可能会遇到线程问题。
另外注意,如果你设置线程数为5,它不会等前5个全部完成再启动下5个。它基本上是把所有的测试方法放入一个队列然后启动@ 987654323@ 线程。然后每个线程简单地轮询队列中可用的下一个元素。
【解决方案3】:
TestNG 的@Test 注释已经有了你想要的……在某种程度上:
// Execute 10 times with a pool of 5 threads
@Test(invocationCount = 10, threadPoolSize = 5)
这不会完全适合您的第一个场景,即运行前 5 个,等待它们完成,然后运行其他 5 个。