使用DataProvider进行TestNG并行执行

时间:2015-07-20 16:18:13

标签: java multithreading testng dataprovider

我有一个测试从数据提供者接收数据。我希望此测试与数据提供程序中的不同值并行运行。

我尝试了一种方法:

public class IndependentTest
{
@Test(dataProvider = "dp1" ,threadPoolSize=3,invocationCount=1)

public void testMethod(int number)
{
    Long id = Thread.currentThread().getId();
    System.out.println("HELLO :  " + id);
}


@DataProvider(name = "dp1",parallel=true)
public Object[][] dp1() {
  return new Object[][] {
      new Object[] { 1 },
      new Object[] { 2 },
      new Object[] { 3 },
      new Object[] { 4 },
      new Object[] { 5 },
      new Object[] { 6 },
      new Object[] { 7 },
      new Object[] { 8 }

  };
}

}

我收到的输出是:

你好:10

你好:12

你好:17

你好:11

你好:16

你好:14

你好:13

你好:15

当我在线程池大小中指定5时,产生了10个线程。 您能否告诉我们要在上面的代码片段中添加哪些内容来控制数据提供程序线程池大小。

7 个答案:

答案 0 :(得分:14)

您需要使用dataproviderthreadcountthreadpoolsizeinvocationcount值不是必需的。详情请见here

答案 1 :(得分:1)

在testng.xml中,您可以通过data-provider-thread-count="3"

为数据提供者设置线程计数
<suite name="Manage" data-provider-thread-count="3" >
    <test name="Manage data tests">
        <classes>
            <class name="uk.example.ExampleTest"></class>
        </classes>
    </test>
</suite>

答案 2 :(得分:1)

尝试按以下方式设置线程池:

@BeforeClass
public void setupClassName(ITestContext context) {
    context.getCurrentXmlTest().getSuite().setDataProviderThreadCount(5);
    context.getCurrentXmlTest().getSuite().setPreserveOrder(false);
}

答案 3 :(得分:1)

您可以通过在其定义中添加额外的配置'parallel = true'以及DataProvider的名称来实现。一个例子如下:

@DataProvider(name="InvalidLoginDataProvider", parallel = true)
public Object[][] myDataProviderMethod(){
...
...
}

根据TestNG文档,@ Test线程池(使用@Test中的invocationCount和threadPoolSize参数创建)和数据提供程序线程池是不同的,并且管理不同。 因此,要指定数据提供程序线程池中有多少个线程,必须在testng.xml文件中添加以下配置。

<suite name="Suite1" data-provider-thread-count="20" >
...
...
</suite> 

HTH!

答案 4 :(得分:0)

我认为有一种方法可以在注释级别上进行设置,应该将其添加到DataProvider的:

@DataProvider(name="quick-screen-list", parallel = true)
        public Object[][] quickScreenDataProvider() {
           .....

答案 5 :(得分:0)

嗨,当我尝试处理数据提供者线程计数时,我遇到了以下错误。如何解决此问题

java.lang.IllegalStateException:的无效使用 BasicClientConnManager:连接仍处于分配状态。确保 在分配另一个之前释放连接。

答案 6 :(得分:-1)

目前只有一个线程被使用,因为您已将invocationCount定义为1,如果将其更改为3,则将使用三个工作线程。

invocationCount: - 应该调用此方法的次数。

threadPoolSize: - 此方法的线程池大小。该方法将从invocationCount指定的多个线程调用。 注意:如果未指定invocationCount,则忽略此属性。

此外,

您还可以指定应从不同的线程调用@Test方法。您可以使用属性threadPoolSize来实现此结果:

@Test(threadPoolSize = 3, invocationCount = 10,  timeOut = 10000)
public void testServer() {

在此示例中,函数testServer将从三个不同的线程调用十次。此外,超时十秒可确保所有线程都不会永久阻塞此线程。

可以找到更多信息here