【问题标题】:TestNG parallel Execution with DataProvider使用 DataProvider 的 TestNG 并行执行
【发布时间】:2020-03-01 02:11:26
【问题描述】:

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

我尝试了类似的方法:

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 个。 您能否告诉上面的 sn-p 必须添加什么来控制数据提供者线程池大小。

【问题讨论】:

  • 您需要并行运行测试,而不是提供程序。在您的构建中,将并行模式配置为 methodsthreadCount 到 5。
  • 嗨 Ben,我有一个测试,它应该根据数据提供者提供的值的数量运行超过 10k 次。我想控制在 dataprovider 中设置 parallel=true 时产生的线程数。我发现这个命令行参数 -dataproviderthreadcount 来控制 dataprovider 线程数。但是我想知道如何使用注释来完成此操作
  • 在我的项目的build 中,我将测试配置为并行运行,并且由于数据提供者在 827 种测试方法上总共执行了 180 万次。我认为您不能通过注释来配置它,而是将其配置传递给运行器。

标签: java multithreading testng dataprovider


【解决方案1】:

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

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

【讨论】:

  • 这没有提供问题的答案。您可以search for similar questions,或参考页面右侧的相关和链接问题找到答案。如果您有一个相关但不同的问题,ask a new question,并包含指向此问题的链接以帮助提供上下文。见:Ask questions, get answers, no distractions
  • @YasinPatel 改进仅允许回答的问题的格式给作者带来了错误的印象,即像这样滥用 StackOverflow 是可以的。请不要。此外,如果您确实改进了(其他)帖子,那么请不要停留在格式上,还要处理拼写错误、缺少标点符号和错位的空格。实际上,您的编辑给人的印象是您既没有阅读帖子本身,也没有阅读现有评论。
【解决方案2】:

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

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

根据 TestNG 文档,@Test 线程池(使用 @Test 中的 invocationCount 和 threadPoolSize 参数创建)和数据提供者线程池不同且管理方式不同。
所以,要指定Data provider线程池中有多少线程,需要在testng.xml文件中添加如下配置。

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

HTH!

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 嗨 niharika,使用 dataproviderthreadcount 解决了我的问题。但是我只能将其设置为 cmd 行参数。有没有办法在注释级别传递相同的内容?
      • 不。注释级别没办法。
      • 感谢您清除无法在注释级别提供此功能。这是否意味着使用任何 dataprovider 的所有测试都将使用使用 dataproviderthreadcount 指定的测试数量?是否可以根据测试控制线程数,而不是让所有测试使用多个线程?
      • AFAIK 它处于运行级别,无法在测试级别进行控制 - 如果我正确理解您的问题
      • 好的。这正是我正在寻找的确切信息。
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        在testng.xml中你可以通过data-provider-thread-count="3"为dataprovider设置线程数

        <suite name="Manage" data-provider-thread-count="3" >
            <test name="Manage data tests">
                <classes>
                    <class name="uk.example.ExampleTest"></class>
                </classes>
            </test>
        </suite>
        

        【讨论】:

          【解决方案7】:

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

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

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

          还有,

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

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

          在这个例子中,函数 testServer 将被三个不同的线程调用十次。此外,10 秒的超时可确保没有任何线程会永远阻塞在该线程上。

          更多信息可以找到here

          【讨论】:

          • 嗨,我尝试了这种方法,但我的问题是关于与数据提供者的并行执行。我正在尝试使用 dataprovider 并行运行测试。在这种情况下将调用计数指定为 3 将导致该方法被调用 10 次,因为数据提供者的每个输入占 8 * 3 = 24 次运行。
          • 数据提供者不会帮助并行运行它.. 这是一种描述您的输入的方法,它使用这些输入调用您的测试 1 by 1 - 恕我直言
          • 您好,dataproviderthreadcount 可用于模拟单个测试方法与来自 d​​ataprovider 的数据实例的并行执行。数据提供者线程池与 testng 中的测试线程池不同。但是 dataproviderthreadcount 被指定为 cmd line 参数。我想知道是否可以在注释级别指定它。
          猜你喜欢
          • 2016-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-08
          相关资源
          最近更新 更多