我正在尝试以下代码:
public class ShashiTest {
@Test
public void test1(){
System.out.println("1===========");
}
@Test(dependsOnMethods="test1")
public void test2(){
System.out.println("2===========");
}
@Test(dependsOnMethods="test2")
public void test3(){
System.out.println("3===========");
}
@AfterMethod(dependsOnMethods={"test2","test3"})
public void test4(){
System.out.println("4===========");
}
}
我期待输出为:
1===========
2===========
4===========
3===========
4===========
但我发现异常,因为未找到测试方法:
com.ShashiTest.test4() is depending on method public void com.ShashiTest.test2(), which is not annotated with @Test or not included.
at org.testng.internal.MethodHelper.findDependedUponMethods(MethodHelper.java:111)
我在哪里弄错了?我如何实现目标?
答案 0 :(得分:2)
@AfterMethod声明此方法在使用@Test注释的每个方法之后运行。现在你与test4()之后和test2()之前调用test4()有冲突,同时还要求它在test2()之后运行。有关更深入的讨论,请参阅this。
编辑:我应该让呼叫顺序更清晰。
test1()->test4()
test2()->test4()
test3()->test4()
如您所见,要求test4()在test2()和test3()之后运行与@AfterMethod注释冲突,要求在每个方法之后调用它。
答案 1 :(得分:1)
dependsOnMethod
不是那样工作,只是用于在它们之间订购方法。
javadoc足够明确IMO:
此方法所依赖的方法列表。无法保证所依赖的方法的运行顺序,但保证在运行包含此批注的测试方法之前运行所有这些方法。此外,如果这些方法中的任何一个不是SUCCESS,则不会运行此测试方法,并将其标记为SKIP。如果其中一些方法已经过载,则将运行所有重载版本。
但不应该发生异常,所以我为它打开了an issue。
关于仅针对特定方法运行@AfterMethod
的需求(看起来很奇怪,但为什么不运行),您可以执行以下操作:
public class ShashiTest {
@Test
public void test1(){
System.out.println("1===========");
}
@Test(dependsOnMethods="test1")
public void test2(){
System.out.println("2===========");
}
@Test(dependsOnMethods="test2")
public void test3(){
System.out.println("3===========");
}
@AfterMethod
public void test4(Method m){
switch(m.getName()) {
case "test2":
case "test3":
System.out.println("4===========");
}
}
}
应该按预期工作。