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>

