TestNG测试用例重试成功后仍标记测试套件失败如何解决
问题原因
你遇到的套件状态异常核心是两个逻辑遗漏:
- 监听器执行顺序错误:你在
onFinish方法中先调用了super.onFinish(testContext),父类方法会先完成测试套件最终状态的全局统计,之后再删除重试产生的中间失败/跳过结果,已经无法改变已经统计完成的套件状态。 - 结果集清理不完整:你只处理了
failedTests和skippedTests两类结果集,遗漏了TestNG内置的failedButWithinSuccessPercentageTests结果集,部分重试的中间结果可能落入该集合,也会影响最终状态统计。
修正后的代码
RetryListener.java
public class RetryListener extends TestListenerAdapter { @Override public void onFinish(final ITestContext testContext) { // 先清理所有标记为RETRIED的中间结果 removeRetriedResults(testContext.getSkippedTests()); removeRetriedResults(testContext.getFailedTests()); removeRetriedResults(testContext.getFailedButWithinSuccessPercentageTests()); // 清理完成后再调用父类方法统计最终状态 super.onFinish(testContext); } private void removeRetriedResults(IResultMap resultMap) { resultMap.getAllResults() .removeIf(testResult -> Boolean.TRUE.equals(testResult.getAttribute(RetryAnalyzer.RETRIED_ATTRIBUTE))); } }
额外校验点
- 如果你两个类不在同一个包下,需要把
RetryAnalyzer中的RETRIED_ATTRIBUTE访问权限改为public,避免编译报错 - 确认你已经通过testng.xml配置或者
@Listeners注解正确注册了RetryListener - 如果你使用的是TestNG 7.5及以上版本,可以额外校验
testContext.getPassedTests()中不存在同一测试方法的重复结果,避免报告出现执行次数异常 - 你当前配置的
MAX_RETRIES = 2代表测试用例最多重试2次,加上首次执行一共会运行3次,可根据实际需求调整参数
内容的提问来源于stack exchange,提问作者raulram
相关产品推荐
相关产品推荐

