20

如果测试失败,我想截屏。我不想用 try/catch 块包装所有测试方法,而是将此逻辑添加到用@AfterMethod.

@AfterMethod如果当前测试失败,我如何在注释的方法中检测?

4

4 回答 4

34

如果带有注解的方法@AfterMethodITestResult参数,那么 TestNG 会自动注入测试的结果。(来源:TestNG 文档,第 5.18.1 节

这应该做的工作:

@AfterMethod
public void tearDown(ITestResult result) {
   if (result.getStatus() == ITestResult.FAILURE) {
      //your screenshooting code goes here
   }        
}
于 2013-09-03T19:30:15.373 回答
8

一个不错的选择是使用.ITestListener而不是在@AfterMethod. 测试侦听器的onTestFailed()函数将在您的测试方法运行之后但在该@AfterMethod方法运行之前被调用。(请注意,侦听器中没有onTestFinished()函数;该角色由@AfterMethod.)

为了让您自己更轻松,您可以使用 a TestListenerAdapter,它将实现您自己没有专门针对的所有其他功能@Override

你最终得到的是:

public class MyTestListener extends TestListenerAdapter {
@Override
public void onTestFailure(ITestResult result){
    yourTakeScreenShotFunctionHere();
   }
}

然后,您将侦听器附加到您的测试类

@Listeners({MyTestListener.class})
public class MyTestClass(){etc}

ITestResult是对测试类对象的引用,因此您可以使用反射从中获取数据,例如 Selenium WebDriver 实例等。

您可以拥有任意数量的不同侦听器,以执行各种操作,例如清理或保留错误日志、截屏、触发其他报告功能、发送电子邮件或任何您想要的。

于 2015-03-03T22:08:14.017 回答
2

先前答案的变体:

由于您已经知道您只想在失败的情况下截取屏幕截图,您可以使用以下onTestFailure()方法TestListenerAdapter

import org.testng.ITestResult;
import org.testng.TestListenerAdapter;

public class LFailure extends TestListenerAdapter {

@Override
public void onTestFailure(ITestResult tr) {
    System.out.println("Failure");
    // your screenshot code
    }
}

PS:不要忘记添加LFailure到你的testng.xml中,或者直接在这样的代码中:

@Listeners({ LFailure.class })

(最好在一个基类中,你的所有测试都继承自该基类)

于 2017-09-27T18:45:11.703 回答
1

如果您可以实现一个侦听器 IInvokedMethodListener并实现该afterInvocation()方法,那就太好了。这使您可以访问方法的结果对象。你可以把你的代码放在这里截图。

于 2013-09-03T19:00:18.077 回答