如果测试失败,我想截取屏幕截图。我想将这个逻辑添加到用@AfterMethod
注释的方法,而不是用try / catch块包装所有测试方法。
如果当前测试失败,我怎样才能在用@AfterMethod
注释的方法中检测到?
如果使用@AfterMethod
注释的方法具有ITestResult
参数,则TestNG将自动注入测试结果。 (来源:TestNG documentation, section 5.18.1)
这应该做的工作:
@AfterMethod
public void tearDown(ITestResult result) {
if (result.getStatus() == ITestResult.FAILURE) {
//your screenshooting code goes here
}
}
一个很好的选择是使用ITestListener
而不是在@AfterMethod
中处理故障报告。在测试方法运行之后,但在onTestFailed()
方法运行之前,将调用测试监听器的@AfterMethod
函数。 (请注意,侦听器中没有onTestFinished()
函数; @AfterMethod
将履行该角色。)
为了让自己更容易,你可以使用TestListenerAdapter
,它将实现你自己并不特别@Override
的所有其他功能。
你最终得到的是:
public class MyTestListener extends TestListenerAdapter {
@Override
public void onTestFailure(ITestResult result){
yourTakeScreenShotFunctionHere();
}
}
然后,您将侦听器附加到测试类
@Listeners({MyTestListener.class})
public class MyTestClass(){etc}
ITestResult
是对测试类对象的引用,因此您可以使用反射从中获取数据,例如Selenium WebDriver实例等。
您可以根据需要拥有尽可能多的不同侦听器,以执行各种操作,例如清理或保留错误日志,截取屏幕截图,触发其他报告功能,发送电子邮件或任何您想要的内容。
与以前的答案不同:
由于您已经知道只想在失败的情况下拍摄屏幕截图,您可以使用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 })
(最好是在基类中,所有测试都从中继承)
如果你能实现一个监听器IInvokedMethodListener并实现afterInvocation()
方法会很好。这使您可以访问方法的结果对象。你可以把你的代码放在这里截图。