检测testng @AfterMethod中的测试失败

如果测试失败,我想截取屏幕截图。 我想将这个逻辑添加到用@AfterMethod注释的方法,而不是用try / catch块包装所有测试方法。

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

如果使用@AfterMethod注释的方法具有ITestResult参数,则TestNG将自动注入测试结果。 (来源: TestNG文档,第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所有其他function。

你最终得到的是:

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

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

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

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

您可以根据需要拥有尽可能多的不同侦听器,以执行各种操作,例如清理或保留错误日志,截取屏幕截图,触发其他报告function,发送电子邮件或任何您想要的内容。

与以前的答案不同:

由于您已经知道只想在发生故障时才截取屏幕截图,因此可以使用TestListenerAdapter onTestFailure()方法:

 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 }) 

(最好是在基类中,所有测试都从中inheritance)

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