并行运行多个testng套件,每个套件具有不同的参数

时间:2019-01-06 12:53:15

标签: maven cucumber testng

我试图用黄瓜并行运行多个具有不同参数的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命令行分别为每个测试传递测试级别信息。

我的疑问是我可能会像-Dbrowser =“ chrome”中那样覆盖JVM值,而被-Dbrowser =“ firefox”覆盖

更多详细信息

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

2 个答案:

答案 0 :(得分:1)

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

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

因此,假设您的线程计数为2,并且您通过JVM参数以逗号分隔的值传入了两种浏览器形式,则解析逻辑仍然无法区分是否要检索第一个值或如果要检索第二个值。

您可以采用的一种方法如下:

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

答案 1 :(得分:0)

我建议使用虚拟机执行此操作。为每个不同的jvm参数集使用不同的虚拟机。这应该简化事情,因为每组功能都将被隔离