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.xml
、suiteB.xml
、suiteC.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 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 文档中查找<suite name="allSuites">
<suite-files>
<suite-file path="suite1.xml" />
<suite-file path="suite2.xml" />
</suite-files>
</suite>
工作正常!它将首先执行当前的套装,然后它会一个一个地执行包含的套装列表。
【讨论】:
有没有办法在通过 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 套件