使用DataProvider进行TestNG并行执行

问题描述 投票:10回答:6

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

我尝试了一种方法:

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

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

java multithreading testng dataprovider
6个回答
14
投票

你需要使用dataproviderthreadcount。不需要threadpoolsizeinvocationcount值。查看详情here


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>

1
投票

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

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

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!


0
投票

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

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

-1
投票

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

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

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

也,

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

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

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

更多信息可以在here找到

© www.soinside.com 2019 - 2024. All rights reserved.