TestNG依赖关系–dependOnMethods,dependsOnGroups

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

有时我们希望测试用例按特定顺序运行。
一个非常常见的例子是当我们要为CRUD操作运行测试用例时。
因此,我们要确保先插入测试数据,然后再进行检索,更新和最终删除。

TestNG依赖关系示例–dependOnMethods

假设我们有一个针对CRUD操作的测试类。

package com.theitroad.dependency;

import org.testng.annotations.Test;

public class TestNGDependencyExample {

	@Test
	public void insert() {
		System.out.println("inserting demo data");
	}
	
	@Test
	public void select() {
		System.out.println("selecting demo data");
	}
	
	@Test
	public void update() {
		System.out.println("updating demo data");
	}
	
	@Test
	public void delete() {
		System.out.println("deleting demo data");
	}
}

由于我们没有定义任何顺序,因此TestNG将按照其名称的自然顺序执行它们。
因此,当我们运行测试类时,我们将获得以下输出。

deleting demo data
inserting demo data
selecting demo data
updating demo data

这不是我们想要的测试用例顺序。
一种快速而肮脏的方法是更改方法名称,以便按我们希望的顺序执行它们。

更好的方法是使用dependsOnMethods来告诉TestNG该测试依赖哪些方法,因此这些方法应在此方法之前执行。

以下是我们更新的测试类,我们其中创建执行顺序-插入,选择,更新和删除。

package com.theitroad.dependency;

import org.testng.annotations.Test;

public class TestNGDependencyExample {

	@Test
	public void insert() {
		System.out.println("inserting demo data");
	}
	
	@Test(dependsOnMethods="insert")
	public void select() {
		System.out.println("selecting demo data");
	}
	
	@Test(dependsOnMethods="select")
	public void update() {
		System.out.println("updating demo data");
	}
	
	@Test(dependsOnMethods="update")
	public void delete() {
		System.out.println("deleting demo data");
	}
}

测试运行的新输出为:

inserting demo data
selecting demo data
updating demo data
deleting demo data

dependsOnMethods将String数组作为参数。
在delete()方法上的以下注释也可以,并且产生相同的结果。

@Test(dependsOnMethods= {"insert","update"})
public void delete() {
	System.out.println("deleting demo data");
}

TestNG依赖性测试–dependOnGroups

我们还可以指定测试是否依赖于其他任何组。
当我们有多种方法并将它们组合在一起时,这将很有帮助。
因此,我们可以简单地指定此测试所依赖的组,而不是指定所有方法的庞大列表。

让我们看一个复杂的示例,其中我们的测试依赖于方法和组。
所有较早定义的方法都是名为"测试"的组的一部分。
这些方法取决于"预测试"组。
我们还有一种清理方法,该方法取决于"测试"组。

package com.theitroad.dependency;

import org.testng.annotations.Test;

public class TestNGDependencyExample {

	@Test(groups = "pre-tests")
	public void init() {
		System.out.println("init resources");
	}

	@Test(groups = "tests", dependsOnGroups = "pre-tests")
	public void insert() {
		System.out.println("inserting demo data");
	}

	@Test(dependsOnMethods = "insert", groups = "tests")
	public void select() {
		System.out.println("selecting demo data");
	}

	@Test(dependsOnMethods = "select", groups = "tests")
	public void update() {
		System.out.println("updating demo data");
	}

	@Test(dependsOnMethods = { "insert", "update" }, groups = "tests")
	public void delete() {
		System.out.println("deleting demo data");
	}

	@Test(dependsOnGroups = "tests")
	public void cleanup() {
		System.out.println("closing resources");
	}
}

测试执行的输出为:

init resources
inserting demo data
selecting demo data
updating demo data
deleting demo data
closing resources

XML Suite中的TestNG依赖关系

TestNG XML套件允许我们定义组之间的依赖关系。
如果必须定义方法的调用顺序,则可以对方法元素使用" invocation-numbers"。

假设我们有一个新类,其方法几乎与以前的方法相同,但是方法和组之间没有定义依赖项。

package com.theitroad.dependency;

import org.testng.annotations.Test;

public class TestNGDependencyXMLExample {

	@Test(groups = "pre-tests")
	public void init() {
		System.out.println("init resources");
	}

	@Test(groups = "tests")
	public void insert() {
		System.out.println("inserting demo data");
	}

	@Test(groups = "tests")
	public void select() {
		System.out.println("selecting demo data");
	}

	@Test(groups = "tests")
	public void update() {
		System.out.println("updating demo data");
	}

	@Test(groups = "tests")
	public void delete() {
		System.out.println("deleting demo data");
	}

	@Test(groups = "post-tests")
	public void cleanup() {
		System.out.println("closing resources");
	}
}

这是我们的TestNG XML套件,它将定义组和方法的执行顺序。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="TestNG XML Dependency Test Suite" time-out="300">

	<test name="TestNGXML Dependency Test" verbose="2" time-out="500">
		<groups>
			<dependencies>
				<group depends-on="pre-tests" name="tests"></group>
				<group depends-on="tests" name="post-tests"></group>
			</dependencies>
		</groups>

		<classes>
			<class
				name="com.theitroad.dependency.TestNGDependencyXMLExample">
				<methods>
					<include name="init"></include>
					<include name="cleanup"></include>
					<include name="insert" invocation-numbers="1"></include>
					<include name="select" invocation-numbers="2"></include>
					<include name="update" invocation-numbers="3"></include>
					<include name="delete" invocation-numbers="4"></include>
				</methods>
			</class>
		</classes>
	</test>
</suite>