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>