首页 > 解决方案 > 并行运行多个 testng 套件,每个套件具有不同的参数

问题描述

我正在尝试使用 cucumber 以不同的参数并行运行多个 testng 套件。每个 tesng 套件都试图传递不同的浏览器、testinfo 等。我想通过 maven 命令行选项来实现这一点。我关注了https://rationaleemotions.wordpress.com/2016/03/29/parallel-execution-of-multiple-testng-suites/#comment-1723上的帖子。我想做的是使用不同的 JVM 参数集并行运行这些套件。

我尝试了以下方法来实现相同的目的,这只是启动了一个 firefox 浏览器来执行测试并完全忽略了 chrome 浏览器(甚至不按顺序运行)

mvn verify  -Dcucumber.options="--tags @123" -DGrid="false" -Dbrowser="chrome" 
-Durl="https://abc.xyz.com" -Dtestinfo="R3.0-Regression-chrome" -DNewuser="123test1"  
-DsuiteXmlFile=Chrometestng.xml,-Dcucumber.options="--tags @123" -DGrid="false" 
-Dbrowser="firefox" -Durl="https://abc.xyz.com" -Dtestinfo="R3.0-Regression-FF" 
-DNewuser="123test2" -DsuiteXmlFile=FFtestng.xml  -Dthreads=2

我确定的火如下

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
<configuration>
    <testFailureIgnore>true</testFailureIgnore>
    <suiteXmlFiles>
        <suiteXmlFile>${suiteXmlFile}</suiteXmlFile>
    </suiteXmlFiles>
    <skipTests>false</skipTests>
    <properties>
        <property>
            <name>suitethreadpoolsize</name>
            <value>${threads}</value>
        </property>
    </properties>
</configuration>

我的testNg如下

<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.2</version>
<scope>test</scope>

我的 chrometestng.xml 和 Chrometestrunner 如下(FFtestng.xml 和 FFrunner 类似于 chrome,除了套件/测试名称的更改)

<suite name="ChromeSuite" parallel="false">
<test name="ChromeTest">
    <classes>
        <class name="abc.runner.ChromeTestRunner"></class>
    </classes>
</test> <!-- Test -->

  @RunWith(ExtendedCucumber.class)
  @ExtendedCucumberOptions(
    jsonReport = "target/cucumber.json",
    detailedReport = true,
    jsonUsageReport = "target/cucumber-usage.json",
    toPDF = true,
    excludeCoverageTags = {"@flaky" },
    includeCoverageTags = {"@passed" },
    reportPrefix = "abc_Report",
   outputFolder = "abc_Reports/PDFReports/${testinfo}/DATE(yyyy-MM-dd-HH-mm-SS)/")
@CucumberOptions(plugin = { /*"html:target/cucumber-html-report",*/
    "json:target/cucumber.json"/*, "pretty:target/cucumber-pretty.txt",
    "usage:target/cucumber-usage.json", "junit:target/cucumber-results.xml"*/ },
    features={"src/test/resources/featurefiles"},strict = false, dryRun=false,
    glue = {"abc_stepdefinitions"},
    tags = {"@123"})
@Test
public class ChromeTestRunner extends ExtendedTestNGRunner {    
}

当我尝试这个

mvn verify DsuiteXmlFile=Chrometestng.xml,FFtestng.xml -Dthreads=2

它同时启动了两个 chrome 浏览器。

我试图弄清楚我的方法有什么不正确以及实现这一目标的正确方法是什么。如果这是不可能的,有没有办法我可以在一个套件中拥有多个测试标签(chrome/ff/ie),并从 maven 命令行分别为每个测试传递测试级别信息。

我怀疑我可能会覆盖 JVM 值,如 -Dbrowser="chrome",被 -Dbrowser="firefox" 覆盖

更多细节

我基本上是在尝试用 cucumber 并行进行跨浏览器测试。在这种情况下,我基本上可以在单个套件中拥有 3 个测试标签(每个用于 chrome、ff、ie),但我关心的是如何传递浏览器、testinfo 等参数(每个测试都是唯一的)与 maven 命令行分开。像 -Dchrometest.browser="chrome" 和 -Dfirefoxtest.browser="firefox" 这样的东西会在这里工作。现在我为每个浏览器有 3 个批处理文件并同时调用 3 个。所以 3 个单独的 JVM 实例。缺点是 cpu 利用率总是 100 % 并且 IE 总是失败

标签: mavencucumbertestng

解决方案


您与此问题相关联的博客是由我创建的。

回来回答你的问题。如果不添加一些丑陋的技巧,您所问的问题是不可能的。我之所以说这是不可能的,是因为您需要确保套件的数量与作为 JVM 参数一部分的逗号分隔值相匹配。

因此,假设您的线程数是2并且您通过 JVM 参数将两种浏览器风格作为逗号分隔值传递,解析逻辑仍然无法区分是要检索第一个值还是要检索第二个值.

您可以做的一种方法如下:

  1. 定义一个同步的单例类。
  2. 这个类在调用时基本上能够解析 JVM 参数(在这种情况下传递的浏览器风格)并为每次调用返回一个浏览器值。因此,如果要调用它两次,它将尝试从解析的 JVM 参数返回两个值(这是逗号分隔的值)。
  3. 现在在您的套件中,您基本上只需查询这个新的单例类。所以每次查询都会返回一个独特的浏览器风格。

推荐阅读