使用testng在@afterMethod中检测跳过的测试



为了报告目的,我正在尝试在@AfterMethod中检测跳过的测试。

我可以捕获失败或通过的测试,但当跳过测试时,它似乎不会进入它。

我的测试:

@Test 
public void method1 () {
    Assert.fail("created failure");
}
@Test (dependsOnMethods = {"method1"})
public void method2 () {}

我的AfterMethod:

@AfterMethod
protected void afterMethod(ITestResult result){
    switch (result.getStatus()) {
        case ITestResult.FAILURE:
            ...
            break;
        case ITestResult.SKIP:
            ...
            break;
        case ITestResult.SUCCESS:
            ...
            break;
    }

例如,这里我只检索失败,但跳过没有通过after方法

你知道怎么做吗?

谢谢!

我通过实现ITestListener类找到了一种方法,您可以在那里找到一个示例:

https://github.com/khmarbaise/testng-example/blob/41861115eb0ea1d98eed97fcfeb7ff30e93e0925/src/test/java/com/soebes/testing/testng/IntegrationTestListener.java

基本上,你所做的是创建一个类,它将捕获所有的ITestResult,甚至是跳过的ITestResult,并在其中重新定义你想做的事情:

public class IntegrationTestListener implements ITestListener {
   public void onTestSkipped(ITestResult result) {
       // do your stuff here
   } 
}

要在测试中使用它,请这样做:

@Listeners ({IntegrationTestListener.class})
public class NotAScenario  extends BasicScenario {
    @Test
    public void test1() {
    }
}

对于@AfterMethod,当我们知道测试肯定已经运行(因此不是ITestResult.STARTED)时,有一个简单的解决方案(经过测试并且有效):

@AfterMethod(alwaysRun = true )
public void doStuff(ITestResult result){
  Integer status = result.getStatus();
  if(!status.equals(ITestResult.SUCCESS)  || !status.equals(ITestResult.FAILURE) ) { 
           // do stuff
   }    
}

对于不想实现ITestListener

中所有方法的某些情况,要干净得多

这对我有效:

@AfterMethod
public void afterMethod(ITestContext context) {
   System.out.println("Skips: " + context.getSkippedTests().size());
}

testng中,如果跳过测试用例,则不会调用@AfterMethod,因为测试用例尚未执行。只有当测试用例被执行时,@AfterMethod才会被执行。

希望这能有所帮助。

kartik是正确的,u无法通过after方法,但在报告中u会找到跳过的测试用例。

但是,如果你想获得跳过的测试用例,你可以在这里添加软相关性,比如:@test(alwaysRun=true,dependensMethods={"method"})

这创建了一个软依赖项,即即使它所依赖的测试失败/引发异常,并且它将在after方法中调用,也应该执行带注释的测试。

您可以通过以下操作捕获跳过测试:

    public void afterMethod(ITestResult result) 
    throws Exception {
     if (result.getStatus() == ITestResult.SKIP) {
          //Some code
     }

最新更新