Java 使用DataProvider并行执行TestNG

Java 使用DataProvider并行执行TestNG,java,multithreading,testng,dataprovider,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.prin

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

我试过这样的方法:

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个线程。
您能否告诉我们,为了控制数据提供程序线程池的大小,必须向上述代码段添加哪些内容

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

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

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

而且

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

@Test(threadPoolSize = 3, invocationCount = 10,  timeOut = 10000)
public void testServer() {
在本例中,testServer函数将从三个不同的线程调用十次。此外,10秒的超时可以保证没有任何线程会永远阻塞此线程


可以找到更多信息

您需要使用
dataproviderthreadcount
threadpoolsize
invocationcount
值不是必需的。请参阅详细信息。

在testng.xml中,您可以通过
数据提供程序thread count=“3”


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

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

我认为有一种方法可以将其设置为注释级别,它应该添加到数据提供程序的:

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

您可以通过在数据提供者的定义中添加额外的配置“parallel=true”以及数据提供者的名称来实现这一点。例如:

@DataProvider(name="InvalidLoginDataProvider", parallel = true)
public Object[][] myDataProviderMethod(){
...
...
}
根据TestNG文档,@Test线程池(使用@Test中的invocationCount和threadPoolSize参数创建)和数据提供程序线程池是不同的,并且管理方式也不同。
因此,要指定数据提供程序线程池中的线程数量,必须在testng.xml文件中添加以下配置

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

...
...

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

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


您将希望并行运行测试,而不是提供程序。在您的构建中,将并行模式配置为
methods
并将
threadCount
配置为5。hi Ben,我有一个测试,根据数据提供程序提供的值的数量,该测试应该运行超过10k次。我想控制在dataprovider中设置parallel=true时生成的线程数。我找到了这个命令行参数-dataproviderthreadcount来控制dataprovider线程数。然而,我想知道如何使用注释来实现这一点。在我的项目中,由于827个测试方法上的数据提供程序,我将测试配置为并行运行,总共执行180万次。我不认为您可以通过注释来配置它,而是将其配置传递给运行程序。您好,我尝试过这种方法,但我的问题是关于与数据提供程序并行执行的。我正在尝试使用dataprovider并行运行测试。在这种情况下,将调用计数指定为3将导致对来自数据提供程序的每个输入调用该方法10次,该输入占8*3=24次运行。数据提供程序将无助于并行运行它。。这是一种描述您的输入的方法,使用这些输入调用您的测试1-1-IMHOHi,dataproviderthreadcount可以用来模拟单个测试方法和来自dataprovider的数据实例的并行执行。数据提供程序线程池与testng中的测试线程池不同。但是,dataproviderthreadcount被指定为cmd行参数。我想知道是否可以在注释级别指定它。hi niharika,使用dataproviderthreadcount解决了我的问题。但是,我只能将其设置为cmd行参数。有没有办法在注释级别传递相同的内容?没有。无法从批注级别执行此操作。感谢您澄清无法在批注级别提供此操作。这是否意味着所有使用任何dataprovider的测试都将使用dataproviderthreadcount指定的测试数?有没有可能根据测试来控制线程的数量,而不是让所有的测试都使用多个线程?好吧,它处于运行级别,不能在测试级别进行控制-如果我正确理解你的问题的话。这正是我想要的信息。这并不能回答这个问题。您可以,也可以参考页面右侧的相关和链接问题来找到答案。如果您有一个相关但不同的问题,并包含指向此问题的链接以帮助提供上下文。请参阅:@YasinPatel改进了一个问题的格式,而这个问题只允许回答,这给了作者一个错误的印象,即像这样滥用StackOverflow是可以的。请不要。另外,如果你确实改进了(其他)帖子,那么请不要停止格式化,还要处理打字错误、缺少标点符号和错误放置的空白。实际上,你的编辑给人的印象是,你既没有阅读帖子本身,也没有阅读现有的评论。
<suite name="Suite1" data-provider-thread-count="20" >
...
...
</suite>