当前位置: 首页 > 知识库问答 >
问题:

用不同的参数并行运行多个testng套件

罗凯
2023-03-14

我试图用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>

我的测试如下所示

<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/ff/ie),并从maven命令行为每个测试单独传递测试级别信息。

我怀疑我可能会覆盖-dbrowser=“chrome”中的JVM值,然后被-dbrowser=“Firefox”覆盖。

更多细节

我基本上是在尝试用cucumber并行地进行跨浏览器测试。在这种情况下,我基本上可以在一个套件中有3个测试标记(每个用于chrome、ff、ie),但我关心的是如何从maven命令行中分别传递诸如browser、testinfo(每个测试唯一的)之类的参数。类似-dchrometest.browser=“chrome”和-dfirefoxtest.browser=“Firefox”之类的东西在这里能起作用吗?现在我有3个批处理文件为每个浏览器和调用3个同时。所以3个分离的JVM实例。缺点是cpu利用率总是100%,IE总是失败

共有1个答案

令狐珂
2023-03-14

你与这个问题链接的博客是我创建的。

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

假设您的线程计数为2,并且通过JVM参数传递了两种浏览器类型作为逗号分隔的值,那么解析逻辑仍然无法区分是要检索第一个值还是要检索第二个值。

  1. 定义一个同步的单例类。
  2. 调用该类时,基本上能够解析JVM参数(在本例中传递的浏览器风格),并为每次调用返回一个浏览器值。因此,如果要调用它两次,它将尝试从解析的JVM参数返回两个值(逗号分隔的值)。
  3. 现在,在您的套件中,您基本上只需查询这个新的单例类。所以每次查询都会返回一种独特的浏览器风格。
 类似资料:
  • 主套房.java 对于每个测试套件,都有包含@Test的类 例如 TestSuite1.java TestClass1.java 所以我的问题是如何运行TestSuite1、TestSuite2

  • 我有一个TestNG XML,格式如下: 这个套件有两个类,每个类都有一些@Test方法。现在我想让我的套件以同样的顺序再运行3次,就像它运行一样,即所有的class1方法,然后是class2方法。我怎样才能做到这一点?我正在使用Selenium WebDriver和核心Java来运行我的自动化套件。

  • 请查看testng.xml并建议 我想运行2个类(下面提到),但面临一些挑战,因为它在下面提到的2个场景下显示了一些不稳定的行为。 这些测试类下的方法具有组和优先级 **目标是使用组运行这些测试 Scenario1:当我使用Threadcount=1时; [test name=“autopracticee”parallel=“classes”thread-count=“1”] 以下是行为: 1.1

  • 我正在尝试在不同的Android设备上并行运行我的自动化套件(使用Selenium WebDrive(Java)TestNG Maven实现)。这是我在xml中的代码: 在TotoTest课上,我有20个测试。它们中的每一个都有注释@Test。当我运行xml时,两个设备并行运行类TotoTest。所以我的设备1(模拟器1)运行20个测试,我的设备2(模拟器2)也运行20个测试。 但是我想要的是,模

  • 请让我知道是否可以通过TestNG运行并行套件?