如何处理多个testng.xml文件?

在开源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

 

<?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

 

<?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 installmvn 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 命令之前,请确保你在命令行窗口中位于项目的根文件夹路径):

Plain Text

 

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