7 依赖关系(dependencies)
有时,测试方法需要按某种顺序执行,比如:
- 在运行更多的测试时,需要确保确定数量的测试方法执行完成并且成功
- 当需要初始化一些方法,而这些初始化方法也是测试方法
7.1 依赖注解
使用@Test注解的属性
dependsOnGroups的
dependsOnMethods。这种情况有两种注解:
- 硬依赖(Hadr dependencies):所有依赖的方法必须成功运行。如果至少有一个依赖方法失败,测试方法将不会调用并在测试报告中标记为SKIP。
- 软依赖(soft dependecies):即使依赖的测试方法有运行失败的,测试方法也会执行。软依赖通过@Test的属性设置always=run实现。
硬依赖例子:
@Test
public void serverStartedOk() {}
@Test(dependsOnMethods = { "serverStartedOk" })
public void method1() {}
method1()方法依赖serverStartedOk方法运行,保证serverStartedOk总是首先运行。
测试方法也可以依赖分组的执行:
@Test(groups = { "init" })
public void serverStartedOk() {}
@Test(groups = { "init" })
public void initEnvironment() {}
@Test(dependsOnGroups = { "init.*" })
public void method1() {}
在这个例子中,method1() 声明依赖任何附和正则表达式“init.*”的分组。
serverStartedOk和
initEnvironment将一直优先method1方法执行。
注:在同一个分组中的测试方法不能保证每次运行顺序都一样。
硬依赖配置(alwayRun=false,默认设置)。
dependsOnGroups
和
dependsOnMethods
都接受正则表达作为参数。对于
dependsOnMethods,如果依赖的方法有几个重载(overloaded)版本,所有的重载的方法都是调用。如果只是想调用其中一个重载方法,可以使用dependsOnGroups。
默认情况下,依赖方法都是通过类来分组 。比如:方法b()依赖方法a(),我们有这个类的实例,这些实例包含这些方法,则调用方法将会是:
a(1)a(2)b(2)b(2)
TestNG将所有的实例的方法a运行完之后才会运行b
这种行为可能在某些情况下是可取的,比如,测试对于不同国家的浏览器签入和签出。我们可能需要如下运行方法:
signIn("us")signOut("us")signIn("uk")signOut("uk")
对于这种顺序,我们可以使用xml的属性
group-by-instances
,这个属性在标签<suite>和<test>都有效
<suite name="Factory" group-by-instances="true">or <test name="Factory" group-by-instances="true">
7.2 在xml中设置依赖
使用标签<
dependencies>
<?xml version="1.0" encoding="utf-8"?>
<test name="My suite">
<groups>
<dependencies>
<group name="c" depends-on="a b"/>
<group name="z" depends-on="c"/>
</dependencies>
</groups>
</test>
<depends-on>属性可以包含一个空格分隔的列表。