TestNG XML

时间:2020-02-23 14:41:58  来源:igfitidea点击:

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侦听器。