java - 如何使用套件创建并行测试,但取决于变量或组

标签 java maven selenium-webdriver parallel-processing testng

我使用 Selenium WebDriver、Java、TestNG、Maven 和 Surefire 来启动自动化测试。 我有很多测试,但它们是在 2 个独立的用户组上运行的。我用一组检查权限,用第二组进行其他操作。我想创建并行测试,但不向 suiteXmlFiles 添加任何新测试。

目前,我在tensng.xml中只定义了包:

<suite thread-count="1" name="BrainshareItSuite">
<test name="AllTests" >
    <packages>
        <package name="com.brainshare.faktury.qa.*"/>
    </packages>
  </test>
</suite>

它工作得很好,因为所有新的测试表单包都会自动添加到我的套件中。我会保存这个自动化添加新的测试。

我可以创建 2 个并行的测试组吗?这将取决于变量,例如用户的登录。 或者,我可以向 @Test 注释添加组,例如“特权”。然后启动组:第一组 - 有“特权”,第二组 - 没有并行的“特权”?但是我可以在哪里添加这个呢?

最佳答案

唷!很多问题!我们从哪里开始? :)

从你的标题来看,我认为你试图同时解决太多问题。不太清楚的部分是:

depend on variable or group

据我所知,您无法使用 xml 文件并行运行套件。 但是您可以通过 cmd 引用 testNG 文档:

5.10.1 - Parallel suites
This is useful if you are running several suite files (e.g. "java org.testng.TestNG testng1.xml testng2.xml") and you want each of these suites to be run in a separate thread. You can use the following command line flag to specify the size of a thread pool:
java org.testng.TestNG -suitethreadpoolsize 3 testng1.xml testng2.xml testng3.xml

在上面的示例中,您的 thread-count=1 但我不确定这是否可以从 xml 应用于套件级别。再次引用 testNG 文档: 5.10.2 - 并行测试、类和方法

The parallel attribute on the <suite> tag can take one of following values:
<suite name="My suite" parallel="methods" thread-count="5">
<suite name="My suite" parallel="tests" thread-count="5">
<suite name="My suite" parallel="classes" thread-count="5">
<suite name="My suite" parallel="instances" thread-count="5">

最后,使用 Maven 的另一个可能的解决方案是: a) 在 Surefire 插件中使用 forkCount 来定义线程数,因此在您的情况下为 2,并且您还希望 reuseForks (这意味着当线程可用时开始新的测试)。 b) 确保在配置下指定两个套件名称

作为mvn test启动

<plugins>                    
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId> 
        <version>2.20.1</version>

  <configuration>

        <forkCount>2</forkCount>
        <reuseForks>true</reuseForks>

        <suiteXmlFiles>
        <suiteXmlFile>BrainshareItSuite.xml</suiteXmlFile>
        <suiteXmlFile>NotAprivilegedBunchSuite.xml</suiteXmlFile>
        </suiteXmlFiles>

   </configuration>

        <goals>
         <goal>integration-test</goal>
       </goals>  

  </plugin> 
</plugins>

但是,我认为上面的方法不是很有效(因为本质上你只有 2 个线程执行脚本。就我个人而言,我会尝试以不同的方式解决这个问题,但也许这就是我。

此外,您还提到了组(是的,您可以在测试类的顶部定义它们,这样您就不需要在每个方法中定义每个组),然后是的,您可以并行运行单独的组,但是这此时必须是parallel="tests"

但是为什么要分组呢?为什么不使用一个 xml 来同时执行所有测试呢?毕竟,套件只是测试类的集合,您似乎不需要停止一个套件直到另一个套件执行。所以,我就是这样的:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Regression" parallel="tests" thread-count="15">


 <parameter name="env" value="stage" />   
 <parameter name="browser" value="chrome"/> 



 <test name="login1">   
    <classes>   
    <class name="regression.login.emailLogin"/> 
        </classes>
    </test>   


 <test name="login2">   
    <classes>   
    <class name="regression.login.fbLogin"/>    
        </classes>
    </test>



<test name="login3">    
    <classes>   
    <class name="regression.login.forgottenPassLink"/>
        </classes>
    </test>

  [..]

 </suite>

在上面的示例中,希望我能帮助您解决有关取决于变量的问题。您可以从 xml 传递参数,然后在测试开始时使用 if 子句,以便您可以从那里引导流程。例如,我会将其放在课前,以便加载我的环境并选择网络驱动程序的形式,但您可以从那里做任何您想做的事情:

@BeforeClass
@Parameters({"browser", "env"})
public void initialSetup(String browser, String env){       

    login.setup(browser, env);
}

最后一点,我最好让您知道,您还可以使用数据提供程序将所有用户加载到一个测试中。也许这就是你的本质:

5.6.2 - Parameters with DataProviders

Specifying parameters in testng.xml might not be sufficient if you need to pass complex parameters, or parameters that need to be created from Java (complex objects, objects read from a property file or a database, etc...). In this case, you can use a Data Provider to supply the values you need to test.  A Data Provider is a method on your class that returns an array of array of objects.  This method is annotated with @DataProvider:

//This method will provide data to any test method that declares that its Data Provider
//is named "test1"
@DataProvider(name = "test1")
public Object[][] createData1() {
 return new Object[][] {
   { "Cedric", new Integer(36) },
   { "Anne", new Integer(37)},
 };
}

//This test method declares that its data should be supplied by the Data Provider
//named "test1"
@Test(dataProvider = "test1")
public void verifyData1(String n1, Integer n2) {
 System.out.println(n1 + " " + n2);
}
will print

Cedric 36
Anne 37

希望这对您有所帮助,祝您好运!

关于java - 如何使用套件创建并行测试,但取决于变量或组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47030756/

相关文章:

java - 读取属性文件

java - TestNG - selenium 脚本中的测试执行顺序

java - 使用 Java 流打印列表项

java - 如何处理 Java 中的 Scala 类型中的协变

java - Java 中的数字金字塔

python - 如何检查 Selenium Python WebDriver 中是否选中了复选框?

java - 为什么同一个按钮需要不同的元素定位器才能工作?

java - 在java中声明一个类

Eclipse-Kepler、Maven 和 Setup Tomcat 7 调试(热部署)

java - 运行 mvn install/mvn test 时出现 Maven mapstruct 问题