TestNG XML
TestNG XML文件使我们可以配置测试套件,并从命令行或者ant脚本执行它。
当我们通过Eclipse或者通过Maven构建执行TestNG测试时,将生成HTML报告。
这些HTML报告还创建了一个测试套件XML文件,我们可以用来通过命令行执行相同的测试。
如果您不熟悉TestNG,请阅读TestNG教程。
TestNG XML
TestNG XML套件基于以下DTD:https://testng.org/testng-1.0.dtd
在研究一些TestNG XML示例之前,我们先创建一个简单的类和相应的TestNG测试类。
package com.theitroad.xml; public class Utils { public static String NAME = ""; public int add(int x, int y) { return x + y; } public static void setName(String s) { System.out.println("Setting NAME to " + s); NAME = s; } }
package com.theitroad.xml; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Optional; import org.testng.annotations.Parameters; import org.testng.annotations.Test; public class TestNGXMLTest { @Test(dataProvider = "dp", priority=1) public void test_add(Integer x, Integer y) { Utils u = new Utils(); Assert.assertEquals(u.add(x, y), x + y); } @Test(dataProvider = "dpName", priority=3, groups="setName") public void test_setName(String s) { Utils.setName(s); Assert.assertEquals(Utils.NAME, s); } @Test @Parameters("name") public void test_name(@Optional("NA") String s) { System.out.println("Input parameter = "+s); } @DataProvider public Object[][] dp() { return new Object[][] { new Object[] { 1, 1 }, new Object[] { 2, 2 }, }; } @DataProvider public Object[][] dpName() { return new Object[][] { new Object[] { "Utils" }, new Object[] { "MyUtils" }, }; } }
TestNG XML示例
让我们创建一个非常简单的TestNG XML测试套件文件。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"> <suite name="TestNGXMLTest Test Suite" guice-stage="DEVELOPMENT" parallel="classes"> <test thread-count="5" name="TestNGXMLTest Test" verbose="2"> <classes> <class name="com.theitroad.xml.TestNGXMLTest" </classes> </test> </suite>
上面的TestNG XML文件非常容易理解。
我们创建了一个测试套件并定义了要执行的类。
parallel属性告诉TestNG并行运行测试套件类,thread-count用于定义并行运行测试时使用的最大线程数。
" verbose"用于定义要在控制台上执行的日志记录数量。
当我们执行上述测试套件XML文件时,将得到以下输出。
[RemoteTestNG] detected TestNG version 6.14.3 Input parameter = NA Setting NAME to Utils Setting NAME to MyUtils PASSED: test_name("NA") PASSED: test_add(1, 1) PASSED: test_add(2, 2) PASSED: test_setName("Utils") PASSED: test_setName("MyUtils") =============================================== TestNGXMLTest Test Tests run: 5, Failures: 0, Skips: 0 =============================================== =============================================== TestNGXMLTest Test Suite Total tests run: 5, Failures: 0, Skips: 0 ===============================================
下图显示了如何通过命令行在TestNG XML套件文件上运行。
我们也可以使用Eclipse TestNG插件直接运行它。
TestNG XML Suite软件包
我们还可以定义包以查找TestNG测试类。
当我们要执行许多测试类时,这很方便。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"> <suite name="TestNG Packages Test Suite" guice-stage="DEVELOPMENT"> <test thread-count="5" name="TestNG Packages Test" verbose="2"> <packages> <package name="com.theitroad.xml"></package> </packages> </test> </suite>
由于程序包中只有一个TestNG测试类,因此输出将与早期测试相同。
TestNG XML组
我们可以指定要包含在测试中的组,以及要排除在XML测试套件文件中的组。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"> <suite name="TestNG Groups Test Suite" guice-stage="DEVELOPMENT"> <test thread-count="5" name="TestNG Groups Test" verbose="2"> <groups> <run> <include name="setName"></include> </run> </groups> <classes> <class name="com.theitroad.xml.TestNGXMLTest"> </class> </classes> </test> </suite>
以上测试套件将仅执行setName
组中的方法,因此将仅执行test_setName
方法。
TestNG XML包含排除方法
默认情况下,所有测试方法都包含在测试类中。
我们可以使用exclude
元素从测试套件中排除某些方法。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"> <suite name="TestNG Excludes Test Suite" guice-stage="DEVELOPMENT"> <test thread-count="5" name="TestNG Excludes Test" verbose="2"> <classes> <class name="com.theitroad.xml.TestNGXMLTest"> <methods> <exclude name="test_add"></exclude> </methods> </class> </classes> </test> </suite>
TestNG XML参数
我们可以使用parameter
元素将参数传递给Test classes方法。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"> <suite name="TestNG Parameters suite" guice-stage="DEVELOPMENT"> <test thread-count="5" name="TestNG Packages Test" verbose="2"> <parameter name="name" value="theitroad"></parameter> <!-- Test Level Parameters --> <classes> <class name="com.theitroad.xml.TestNGXMLTest" </classes> </test> </suite>
当我们进行测试时," name"参数将被映射到" test_name"方法参数。
您将在输出控制台日志中注意到以下语句。
Input parameter = theitroad PASSED: test_name("theitroad")
在TestNG Parameters中了解更多信息。
TestNG XML侦听器
我们还可以为我们的TestNG XML测试套件指定侦听器。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"> <suite name="TestNG Listeners Test Suite" guice-stage="DEVELOPMENT"> <listeners> <listener class-name="com.theitroad.listeners.Test3SuiteListener" <listener class-name="com.theitroad.listeners.Test3TestListener" </listeners> <test thread-count="5" name="TestNG Listeners Test" verbose="2"> <classes> <class name="com.theitroad.xml.TestNGXMLTest" </classes> </test> </suite>
TestNG侦听器是监视和修改测试用例行为的一项重要功能,有关更多信息,请参见TestNG侦听器。