我有一个自定义报告和断言解决方案,该解决方案可以按照我想要的方式正常工作,但是gradle不能正确地将测试标记为失败。对我而言,最简单的解决方案是,只要解决我的断言,就将测试标记为testNG失败,因此它将在gradle中将其标记为失败。我已使用以下方法设置了测试状态:
Reporter.getCurrentTestResult().setStatus(ITestResult.FAILURE);
但是@Test方法结束后它将恢复
@Test
public void assertionsFail(){
//Custom assertion fails
generalAssertion(new AssertionPayload(false));
//Let testNG know that test failed
Reporter.getCurrentTestResult().setStatus(ITestResult.FAILURE);
//Marked as failed here, Reporter.getCurrentTestResult() returns 2
}
@AfterMethod(alwaysRun = true)
public void afterTest(ITestResult testResult) {
//Why is it marked as passed here? Reporter.getCurrentTestResult() returns 1
}
在测试方法结束时,我确认状态设置为失败。但是,当它到达我的@AfterTest时,由于某种原因,它不再设置为失败,而是设置为通过。我在这里缺少简单的东西吗?是否有简单的方法将测试标记为失败?我一直在考虑使softAssert失败,但这确实很不稳定而且不理想。
答案 0 :(得分:0)
我已经深入研究了testNG的代码,并了解到在测试完成之后setStatus被调用了几次。如果有任何可抛出的东西,testNG似乎会读取,然后相应地设置状态。通过执行此操作,我可以得到所需的行为:
Throwable throwable = new Throwable("One or more tests in this group has failed");
throwable.setStackTrace(new StackTraceElement[0]);
Reporter.getCurrentTestResult().setThrowable(throwable);
我也删除了堆栈跟踪,因为它只是指向我的断言的位置,对您没有帮助