在开源GitHub项目中,我参与了一个展示Selenium WebDriver框架与Java结合使用的工作项目。随着项目的增长,需要创建多个testng.xml文件来运行不同的测试。
这些多个文件是为了将测试隔离开来,并将所有与相应网站相关的测试放置在一个单独的testng.xml中(我使用了不同的演示网站来展示可以使用Selenium WebDriver自动化的不同动作)。
我想详细介绍多个testng.xml文件的用法以及如何执行测试。由于项目中使用了Maven作为构建工具,因此需要单个testng.xml文件来运行项目中的所有测试。同时,在调试测试失败的情况时,也需要运行单个testng.xml文件。
在这个项目中,我创建了9个不同的testng.xml文件,每个文件都包含多个测试,我将使用单个testng.xml文件运行这9个不同testng.xml文件中的所有测试。是的,这是可能的!
所以,请加入我的旅程,我将展示如何使用单个testng.xml文件执行多个testng.xml文件。我还会介绍如何从9个可用的testng.xml文件中执行单个文件,并使用Maven从命令行运行它。
使用单个testng.xml文件运行多个testng.xml文件。
首先,让我们关注使用所有9个不同的testng.xml文件运行所有测试。这个问题的解决方案是,在你的testng.xml文件中使用<suite-files> </suitefiles>
标签,并在该标签之间提供其他testng.xml 文件的路径。这就是我所说的示例文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Selenium 4 POC Tests ">
<suite-files>
<suite-file path="testng-saucedemo.xml"/>
<suite-file path="testng-automationpractice.xml"/>
<suite-file path="testng-theinternet.xml"/>
<suite-file path="testng-juice-shop.xml"/>
<suite-file path="testng-lambdatestecommerce.xml"/>
<suite-file path="testng-seleniumgrid-theinternet.xml"/>
<suite-file path="testng-lambdatest-selenium-playground.xml"/>
<!-- <suite-file path="testng-seleniumgrid-juiceshop.xml"/>-->
</suite-files>
</suite>
一旦我们执行这个文件,它将按照<suite-files>
标签更新的顺序执行相应的testng.xml文件。所以,首先执行"testng-saucedemo.xml"
,然后执行"testng-automationpractice.xml"
,依此类推。
上述示例中提供的所有testng.xml文件中都包含多个测试。因此,各自testng.xml 中的所有测试都将执行,完成后,将选择下一个XML文件进行执行。
以下是testng-saucedemo.xml 文件的内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Sauce Demo Website Tests" parallel="tests" thread-count="4" verbose="2">
<test name="selenium 4 Tests with Chrome Browser">
<parameter name="browser" value="chrome"/>
<classes>
<class name="io.github.mfaisalkhatri.tests.saucedemo.SauceDemoTests">
<methods>
<include name="loginSauceDemoTest"/>
<include name="logOutSauceDemoTest"/>
</methods>
</class>
</classes>
</test> <!-- Test -->
<test name="selenium 4 Tests with Firefox Browser">
<parameter name="browser" value="firefox"/>
<classes>
<class name="io.github.mfaisalkhatri.tests.saucedemo.SauceDemoTests">
<methods>
<include name="loginSauceDemoTest"/>
<include name="logOutSauceDemoTest"/>
</methods>
</class>
</classes>
</test> <!-- Test -->
<test name="selenium 4 Tests with Edge Browser" enabled="false">
<parameter name="browser" value="edge"/>
<classes>
<class name="io.github.mfaisalkhatri.tests.saucedemo.SauceDemoTests">
<methods>
<include name="loginSauceDemoTest"/>
<include name="logOutSauceDemoTest"/>
</methods>
</class>
</classes>
</test> <!-- Test -->
<test name="selenium 4 Tests with Opera Browser" enabled="false">
<parameter name="browser" value="opera"/>
<classes>
<class name="io.github.mfaisalkhatri.tests.saucedemo.SauceDemoTests">
<methods>
<include name="loginSauceDemoTest"/>
<include name="logOutSauceDemoTest"/>
</methods>
</class>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
一旦这个XML文件中更新的所有测试执行完毕(无论通过与否),并且执行完成,下一个文件将被选中运行另一组测试。
TestNG不支持并行运行套件文件。
使用Maven运行单个testng.xml文件。
您在IDE中有个选项,通过点击testng.xml文件并选择运行测试的选项来运行您的测试。然而,当涉及到在CI/CD管道中执行测试时,这个选项不太适用,因为您需要使用自动化管道中的命令来执行测试。
配置您的项目以使用命令行运行suite-xml文件
我们需要设置以下配置,以便能够使用Maven运行testng.xml文件。
在您的pom.xml中更新Maven Surefire插件:
请注意上面截图中的<SuiteXmlFile>
标签。suiteXmlFile
的值设置为${suite-xml}
。我们将在pom.xml文件的属性块中为这个声明设置默认值,如下所示:
为上面博客部分使用的testng.xml文件设置了默认路径,并在其中更新了suite-files
路径。
所以,现在如果我们运行命令mvn clean install
或mvn clean test
,Maven将根据属性块中更新的文件路径拾取testng.xml 默认文件,并执行所有测试。
现在,脑海中浮现的问题是:“如果我想执行其他任何 testng.xml 文件,该怎么做,是否有可能?”
答案是“是的”: 我们可以通过在 mvn
命令中添加 -Dsuite-xml=<testng.xml file path>
来运行项目中的任何 testng.xml 文件。
请记住,我们之前在 pom.xml 中的 Maven Surefire 插件块中设置了这个配置。
我们只需要在命令行中传递 suite-xml
属性变量的值,这可以通过在 mvn
命令中使用 -D
选项来完成:
mvn clean test -Dsuite-xml=<testng.xml file path>
现在让我们动手试试使用命令行,通过 Maven 从命令行运行不同的 testng.xml 文件,正如我们刚刚学到的那样。
我们将运行 testng-internet.xml
文件,检查它是否应该覆盖现有的默认 testng.xml,并且只运行我们在命令中传递的那个文件。我们需要传递保存 testng.xml 的完整路径,在我们的例子中,它位于 test-suite
文件夹中,所以完整路径是 test-suites\testng-theinternet.xml
。这是我们将要运行的命令(在执行 Maven 命令之前,请确保你在命令行窗口中位于项目的根文件夹路径):
mvn clean test -Dsuite-xml=test-suite\testng-theinternet.xml

“-Dsuite-xml” 选项可以与其他 maven 命令一起使用,如下所示: mvn clean install/ mvn clean verify 等。
测试已成功运行,结果在控制台上打印出来。它显示共有32个测试运行并成功通过。
为了确认正确选择了XML文件并执行了测试,让我们使用IDE执行testng-theinternet.xml
文件中的测试,并检查执行的测试数量。
我们可以看到,共有32个测试被执行并通过了,这证实了我们使用mvn
命令执行的测试是针对我们传递的testng.xml文件正确执行的。
结论
我们可以在项目中根据不同的模块/网站分离测试,拥有多个testng.xml文件,并且这些多个testng.xml文件可以使用单个testng.xml文件来执行。
同样,我们也可以使用Maven Surefire插件从命令行执行testng.xml文件。
Source:
https://dzone.com/articles/working-with-multiple-testngxml-files