Setup: 我有一个扩展IRetryAnalyzer的类,并且实现了一个简单的重试逻辑,重写了以下方法:public boolean retry(ITestResult result){
我有另一个类,它扩展了类TestListenerAdapter,它重试失败的测试,直到它们通过或报告失败 . 我已经实现了我的逻辑覆盖以下方法:public void onTestFailure(ITestResult result){
Scenario: 我总共进行了10次测试 . 10次测试中有1次失败2次,并使用我的重试逻辑传递第3次尝试 . 测试结果显示如下:总测试:12,失败:2,跳过:0
我想要的是输出正确数量的测试运行 . 并且也忽略了自测试结束以来的2次失败 . 所以结果应该是这样的:总测试:10,失败:0,跳过:0
我在这里失踪了什么?我需要修改ITestResult对象吗?如果有,怎么样?
仅供参考:我能够使用JUnit实现这一点(实现TestRule接口) .
提前致谢 .
4 回答
请考虑以下测试结果 . 2次重试:
通过=>总体还可以!
失败,通过=>总体还可以!
失败,失败,通过=>总体还可以!
失败,失败,失败=>总体失败!
我所做的是创建一个TestNg监听器,它扩展了默认行为,并在所有测试完成后做了一些魔术 .
基本上我做两件事:
收集所有通过的测试 . 如果我遇到一个失败的测试,至少有一个通过测试我删除失败的测试(这将覆盖上面的案例2和3)
迭代所有失败的测试 . 如果我遇到先前失败的测试失败,我将删除当前失败的结果 . (这实际上将涵盖案例3和4) . 这也意味着如果有几个失败的结果,我将只保留第一个失败的结果 .
为了识别testresult,我使用以下简单的哈希函数:
这种方法也适用于数据提供者,但有一个小的限制!如果您使用具有随机值的dataproviders,您将遇到问题:
对于失败的测试,重新评估数据提供者 . 因此,您将获得一个新的时间戳,同一个mehod的result1和result2将导致不同的哈希值 . 解决方案是在getId()方法中包含parameterIndex而不是参数,但似乎这样的值不包含在ITestResult中 .
将此简单示例视为概念证明:
将屈服于:
我试过,尝试过并尝试过 . 但现在终于有效了
MyRetryAnalyzer.java
MyTestListenerAdapter.java
You test class
我的方法 Build 在Morvader's answer之上,但增加了定义重试分析器的能力,这些分析器遵循实际失败测试的原始意图,即使该方法在一些重试之后已经过去 .
我也没有发现需要倾向于onFinish()方法中的测试次数,数字在maven-surefire-plugin版本2.18中看起来很好
RetryListenerAdapter
IRetryAnalyzerWithSkip
Retry
我用这种方法:
ListenerApadter :
RetryAnalizer :
POM.xml -> Surefire Configuration:
这是你应该配置“覆盖”surefire监听器的地方,它有自己的计数器 .