【问题标题】:TestNG parallel test/method using dataprovoder使用 dataprovoder 的 TestNG 并行测试/方法
【发布时间】:2016-12-05 22:57:35
【问题描述】:

我有一个像这样的 testNG 方法:

@Test(dataProvider="takeMyProvider")
public void myTest(String param1, String param2){

    System.out.println(param1 + " " + param2);

}

我的数据提供者返回 10 个元素。我的方法将在一个线程中执行 10 次。这怎么可能平行呢?例如

  • 我想同时使用 5 个方法。 webdriver 应该同时打开 5 个浏览器。并行执行这 5 个测试后,应执行其他 5 个测试

  • webdriver 应该打开 10 个浏览器并并行处理所有 10 个元素

有人有想法吗?

【问题讨论】:

    标签: java selenium selenium-webdriver testng


    【解决方案1】:

    非常感谢您的反馈和有用的提示。 我的测试可能以任何并行方式运行,但仅在一个浏览器实例中运行。

    让我们详细了解一下:

    我的数据提供者返回一个对象[][]

    @Dataprovider(name = "takeMyProvider", parallel = true)
    public object[][] myProvider(){
        return new object[][]{{"1", "name1"}, {"2", "name2"} {"3", "name3"}}
    }
    

    这个测试方法执行了3次

    @Test(dataProvider="takeMyProvider")
    public void myTest(String param1, String param2){
    
        System.out.println(param1 + " " + param2);
    
    }
    

    但仅在一个浏览器实例中。这不是我想要的。

    我希望 testNG 启动 3 个 chrome 实例并并行执行 3 个测试。

    顺便说一句,我正在硒网格上运行测试。也许有 100 个节点。 当 100 个节点并行执行此测试时,这将是完美的。甚至 1.000,取决于数据提供者。

    有人有想法吗?

    最好的问候

    【讨论】:

      【解决方案2】:

      您可以通过 TestNG 中的套件文件定义并行度。以下示例以 10 个线程并行运行方法:

      <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
      <suite name="MySuiteNameHere" parallel="methods" thread-count="10">
      
          <test name="Selenium Tests">
              <classes>
                  <class name="foo.bar.FooTest"/>
              </classes>
          </test>
      </suite>
      

      您还需要注意,您的数据提供程序可以是线程安全的,以允许它不强制方法按顺序运行。

      // data providers force single threaded by default
      @DataProvider(name = "takeMyProvider", parallel = true)
      

      不过要小心。当使用并行方法运行时,TestNG 不会创建类对象的新实例。这意味着如果您在测试类对象上保存值,您可能会遇到线程问题。

      另外注意,如果你设置线程数为5,它不会等前5个全部完成再启动下5个。它基本上是把所有的测试方法放入一个队列然后启动@ 987654323@ 线程。然后每个线程简单地轮询队列中可用的下一个元素。

      【讨论】:

        【解决方案3】:

        TestNG 的@Test 注释已经有了你想要的……在某种程度上:

        // Execute 10 times with a pool of 5 threads
        @Test(invocationCount = 10, threadPoolSize = 5)
        

        这不会完全适合您的第一个场景,即运行前 5 个,等待它们完成,然后运行其他 5 个。

        【讨论】:

          猜你喜欢
          • 2019-04-12
          • 1970-01-01
          • 2015-08-14
          • 1970-01-01
          • 1970-01-01
          • 2021-02-20
          • 2015-12-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多