背景:
有时,需要按特定顺序调用测试方法。例如:
- 在运行更多测试方法之前,请确保一定数量的测试方法已经完成并成功。
- 在希望将初始化的方法也用作测试方法的同时初始化测试项目。
TestNG允许使用注解或XML指定依赖项。
1. 使用注解指定依赖
可以使用@Test注解中的属性 dependsOnMethods 或dependsOnGroups。
有两种依赖关系:
强依赖。所依赖的所有方法都必须已经运行并成功运行。如果依赖项中至少发生了一次故障,则不会调用它并将其标记为SKIP。
弱依赖。即使其中一些方法失败了,也会始终在所依赖的方法之后运行。如果想确保测试方法以特定顺序运行但它们的成功并不真正取决于其他方法的成功时,这将非常有用。通过在@Test批注中添加“ alwaysRun = true”来获得弱依赖性。
强依赖的示例:
@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.*”匹配的任何组,这保证了将始终在method1()之前调用方法serverStartedOk()和initEnvironment()。
注意:如之前所述,在同一个测试项目运行中,不能保证属于同一组的方法的调用顺序是相同的。
如果依赖的方法失败并且有严格的依赖关系(alwaysRun = false,这是默认设置),则依赖于该方法的方法不会标记为FAIL,而是会标记为SKIP。跳过的方法也将在最终报告中展示(在HTML中既不是红色也不是绿色),因为跳过的方法不一定会失败(标有@ Before / After的方法将不展示在最终报告中)。
DependsOnGroups和dependsOnMethods
DependsOnGroups和dependsOnMethods都接受正则表达式作为参数。对于dependsOnMethods,如果依赖于一个碰巧具有多个重载版本的方法,则将调用所有重载方法。如果只想调用重载方法之一,则应使用dependsOnGroups。
默认情况下,从属方法按类分组。例如,如果方法b()依赖于方法a(),并且有几个包含这些方法的类实例(如果涉及data provider和factory),则调用顺序如下:
a(1) a(2) b(2) b(2)
在所有实例都调用完其a()方法之前,TestNG不会运行b()。
但是在某些情况下,例如在测试登录和退出Web浏览器的情况下,可能不希望出现上述行为。在这种情况下,应该需要如下顺序:
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">
2. 使用XML指定依赖
可以在testng.xml文件中指定组依赖性。使用<dependencies>标记来实现此目的:
<test name="My suite"> <groups> <dependencies> <group name="c" depends-on="a b" /> <group name="z" depends-on="c" /> </dependencies> </groups> </test>
<depends-on>属性包含以空格分隔的组列表。
See you tomorrow~