TestNG 与 DataProvider 并行执行

TestNG parallel Execution with 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

生成了 10 个线程,而我在线程池大小中指定了 5 个线程。 您能否告诉我们必须向上面的代码片段添加什么来控制数据提供程序线程池的大小。

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

invocationCount :- 这个方法应该被调用的次数。

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

此外,

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

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

在此示例中,函数 testServer 将从三个不同的线程调用十次。此外,十秒的超时保证 none 个线程将永远阻塞在该线程上。

可以找到更多信息here

您需要使用 dataproviderthreadcountthreadpoolsizeinvocationcount 值不是必需的。查看详细信息 here

在 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>

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

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

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

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

您可以通过在其定义中添加额外的配置 '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!

您好,当我尝试处理数据提供程序线程计数时出现以下错误。如何解决该问题

java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated. Make sure to release the connection before allocating another one.