TestNG 可以运行多个套件吗?

Posted

技术标签:

【中文标题】TestNG 可以运行多个套件吗?【英文标题】:Can TestNG run multiple suites? 【发布时间】:2011-05-28 22:10:04 【问题描述】:

我正在使用 Selenium 和 TestNG 测试 web-ui。我有一个包含许多测试类的测试套件。 我有一个@BeforeSuite 方法,它也有一个@Parameters 注释,该方法接收将运行Selenium 测试的浏览器 作为参数,执行以下行:

selenium = new DefaultSelenium("localhost", 4444, browser, "http://localhost:8099");
selenium.start();

我用来运行测试套件的 XML 是:

<suite name="suite">
<parameter name = "browser" value = "*firefox"/>
 <test name="allTests">
  <classes>
   <class name="test.webui.MemcachedDeploymentTest" />
  </classes>
 </test> 
</suite>

这工作正常,测试在 Firefox 中运行。 我的问题是我想以某种方式再次运行这个套件,在第一次运行完成后立即运行,但这次使用 Chrome 作为浏览器。我现在有 2 个 XML 套件,一个带有 Chrome,一个带有 Firefox。有没有办法自动一个接一个地运行这些测试套件?也许使用第三个 XML?

【问题讨论】:

是的,TestNG 可以运行多个套件 【参考方案1】:

你可以像这样运行 testNG 套件:

<suite name="allSuites">
  <suite-files>
    <suite-file path="suite1.xml" />
    <suite-file path="suite2.xml" />
    ...
  </suite-files>
</suite>

您还可以与 ant 任务并行运行这些套件。如果你愿意,我会提供 ant 的示例代码。

【讨论】:

能否提供与 maven 任务并行运行的示例代码? 对不起,我还没有尝试过,所以我不能提供代码。 Tarken,你能“提供 ant 的示例代码”吗?【参考方案2】:

要使用 TestNG XML 运行多个套件,正确的代码如下,我准备了三个套件 suiteA.xmlsuiteB.xmlsuiteC.xml 并将它们合并到 testng.xml。您可以复制粘贴以下代码并更改类标签中的packagename.classname 并运行它会起作用...

suiteA.xml

 <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
    <suite name="SuiteA"  > 
    <!-- suite name="Suite Name" --> 
                 <test name="TestA1" allow-return-values="true">
                         <classes>
                           <!-- packagename.Testcase class name  -->
                                 <class name ="com.qtpselenium.suiteA.TestCaseA1" />
                         </classes>
                 </test>
                 <test name="TestA2" allow-return-values="true">
                         <classes>
                           <!-- packagename.Testcase class name  -->
                                 <class name ="com.qtpselenium.suiteA.TestCaseA1" />
                         </classes>
                 </test>
    </suite>

suiteB.xml

   <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
    <suite name="SuiteB"  > 
    <!-- suite name="Suite Name" --> 
                 <test name="TestB1" allow-return-values="true">
                         <classes>
                           <!-- packagename.Testcase class name  -->
                                 <class name ="com.qtpselenium.suiteB.TestCaseB1" />
                         </classes>
                 </test>
                 <test name="TestB2" allow-return-values="true">
                         <classes>
                           <!-- packagename.Testcase class name  -->
                                 <class name ="com.qtpselenium.suiteB.TestCaseB2" />
                         </classes>
                 </test>
</suite>

suiteC.xml

  <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
        <suite name="SuiteC"  > 
        <!-- suite name="Suite Name" --> 
                     <test name="TestC1" allow-return-values="true">
                             <classes>
                               <!-- packagename.Testcase class name  -->
                                     <class name ="com.qtpselenium.suiteC.TestCaseC1" />
                             </classes>
                     </test>
                     <test name="TestC2" allow-return-values="true">
                             <classes>
                               <!-- packagename.Testcase class name  -->
                                     <class name ="com.qtpselenium.suiteC.TestCaseC2" />
                             </classes>
                     </test>
        </suite>

testng.xml

 <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
    <suite name="TestNG Dadadriver suite"  > 
    <!-- suite name="Suite Name" --> 
            <suite-files>
                   <suite-file path="./suiteA.xml" />
                   <suite-file path="./suiteB.xml" />
                   <suite-file path="./suiteC.xml" />
            </suite-files>
    </suite>

【讨论】:

suiteA.xml, suiteB.xml... 的理想位置在哪里?我们是否需要创建一个单独的文件夹并复制那些 xml 文件? @soccerway : 您可以在 标记中指定 suite.xml 文件的路径,从该位置读取您的 suiteA.xml 文件。 谢谢 Arpan....我已经尝试过您的解决方案...这工作正常。也为您的答案投票。 现在我遇到了另一个问题,Safari 浏览器无法识别按钮,我的问题..***.com/questions/58871378/… 有没有办法在上面的文件testng.xml中并行运行套件【参考方案3】:

将你的参数标签放在测试标签中并创建另一个测试标签:

<suite name="suite">
    <test name="Firefox tests">
        <parameter name="browser" value="*firefox" />
        <classes>
            <class name="test.webui.MemcachedDeploymentTest" />
        </classes>
    </test>
    <test name="Chrome tests">
        <parameter name="browser" value="*chrome" />
        <classes>
            <class name="test.webui.MemcachedDeploymentTest" />
        </classes>
    </test>
</suite>

另一个不那么冗长的选项是使用@Factory

【讨论】:

这里你把参数标签放在测试标签中,我需要在@BeforeSuite方法中注入参数,而不是@BeforeTest 有没有办法两次运行同一个套件,每次使用不同的参数? 是的,使用@Factory 并创建测试类的两个实例,每个实例都有不同的参数。将该参数存储在一个字段中,并在您的测试方法中使用该字段。阅读 @Factory 的 Javadoc 了解更多详细信息。 如果套件非常大(不适合同一个文件),我仍然想按顺序运行它们怎么办?可以使用“主”XML 文件吗? 是的,在 testng.xml 文档中查找 标记。【参考方案4】:
<suite name="allSuites">
  <suite-files>
    <suite-file path="suite1.xml" />
    <suite-file path="suite2.xml" />
  </suite-files>
</suite>

工作正常!它将首先执行当前的套装,然后它会一个一个地执行包含的套装列表。

【讨论】:

有没有办法在中使用启用/禁用标志进行额外控制?目标是从根/主套件 testng.xml 文件的单个位置启用/禁用套件文件【参考方案5】:

通过 Maven:

<plugin>
   <artifactId>maven-surefire-plugin</artifactId>
   <configuration>
      <suiteXmlFiles>
         <suiteXmlFile>src/test/resources/unit-testng.xml</suiteXmlFile>
         <suiteXmlFile>src/test/resources/api-testng.xml</suiteXmlFile>
      </suiteXmlFiles>
   </configuration>
</plugin>

【讨论】:

以上是关于TestNG 可以运行多个套件吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何参数化 Maven surefire 插件,以便我可以选择运行哪些 TestNG 套件

TestNG 在运行 pom.xml 中提到的所有测试套件之前运行一次

TestNG套件测试

Gradle 并行运行 TestNG 套件

TestNg的基础知识一

TestNg的基础知识一