我有一个扩展 CommonTest 类的 TestClass,在测试类的@Dataprovider 中有一个方法 doSomething() 失败了。我想在@AfterClass 中捕获堆栈跟踪而不在@Dataprovider 中使用 try/catch
class CommonTest {
@AfterClass
captureFailures() {
}
}
class TestClass {
@DataProvider
sampleMethod() {
CommonUtils.doSomething()
}
}
class CommonUtils {
doSomething()
}
不使用try/catch捕获
@DataProvider
中失败方法的stacktrace,可以使用TestNG提供的ITestResult
对象。这是 captureFailures()
类中 CommonTest
方法的示例实现:
@Dataprovider
class CommonTest {
private static List<Throwable> failures = new ArrayList<>();
@AfterMethod
public void afterMethod(ITestResult result) {
if (result.getStatus() == ITestResult.FAILURE) {
failures.add(result.getThrowable());
}
}
@AfterClass
public void captureFailures() {
if (!failures.isEmpty()) {
System.out.println("Failures captured in @DataProvider:");
for (Throwable failure : failures) {
failure.printStackTrace();
}
}
}
}
class TestClass extends CommonTest {
@DataProvider
public Object[][] sampleMethod() {
CommonUtils.doSomething();
return new Object[][]{{}};
}
}
class CommonUtils {
public static void doSomething() {
throw new RuntimeException("Failed to do something");
}
}
在此实现中,我们使用
ArrayList
来存储由 Throwable
方法捕获的任何 afterMethod()
对象。在每个测试方法之后调用此方法,包括用@DataProvider
注释的方法。如果测试结果失败,我们将Throwable
对象添加到failures
列表中。
在
captureFailures()
方法中,我们检查failures
列表是否不为空。如果有任何失败,我们打印出列表中每个Throwable
对象的堆栈跟踪。
请注意,我们还对
CommonTest
类进行了抽象,并在TestClass
类中对其进行了扩展。这是因为我们要使用afterMethod()
类中的CommonTest
方法来捕获@DataProvider
类的TestClass
方法中的失败。