与此处TestNG retrying failed tests doesn't output the correct test results发布的解决方案类似,我正在尝试在onFinish(ITestContext上下文)期间使用测试监听器删除(重复的)测试结果。
尽管使用context.getFailedTests()。removeResult(result)删除结果似乎可以正常进行(实际上已删除了结果),但似乎仍有“其他地方”将结果从中拉出,因为构建仍然失败。
还要注意,当我运行以上文章中的示例测试时(有一个重复的失败要删除并且一个通过了测试),我在“测试结果”(未按预期进行清理)与“合适的结果”之间得到差异。 (按预期消除了重复故障)。
而且,报告从何处提取结果以决定是否使构建失败?还是只是在清除失败的测试之前就提取了结果...?
===============================================
Default test
Tests run: 3, Failures: 2, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 2, Failures: 1, Skips: 0
===============================================
编辑:为了澄清起见,我们正在使用maven运行这些测试,它们是IT,因此我们使用故障安全插件运行它们。问题是,即使看起来测试已删除,但mvn verify仍会失败,因为它认为无论如何都将发现构建失败。
而且,即使从Eclipse运行了这样的测试,即使删除了测试,套件完成后仍会在日志中打印失败。
关于RetryAnalyzer:我根本不会考虑使用RetryAnalyzer的最佳/最佳实践,但是如果您发现自己需要解决问题,例如如果您继承了依赖RetryAnalyzer的测试套件,则可能会发现它很有用。
最佳答案
尝试使用以下代码:
ListenerApadter :
public class MyTestListenerAdapter extends TestListenerAdapter {
@Override
public void onTestFailure(ITestResult result) {
if (result.getMethod().getRetryAnalyzer() != null) {
MyRetryAnalyzer retryAnalyzer = (MyRetryAnalyzer)result.getMethod().getRetryAnalyzer();
if(retryAnalyzer.isRetryAvailable()) {
result.setStatus(ITestResult.SKIP);
} else {
result.setStatus(ITestResult.FAILURE);
}
Reporter.setCurrentTestResult(result);
}
}
@Overrride
public void onFinish(ITestContext context) {
Iterator<ITestResult> failedTestCases =context.getFailedTests().getAllResults().iterator();
while (failedTestCases.hasNext()) {
System.out.println("failedTestCases");
ITestResult failedTestCase = failedTestCases.next();
ITestNGMethod method = failedTestCase.getMethod();
if (context.getFailedTests().getResults(method).size() > 1) {
System.out.println("failed test case remove as dup:" + failedTestCase.getTestClass().toString());
failedTestCases.remove();
} else {
if (context.getPassedTests().getResults(method).size() > 0) {
System.out.println("failed test case remove as pass retry:" + failedTestCase.getTestClass().toString());
failedTestCases.remove();
}
}
}
}
}
RetryAnalizer :
public class MyRetryAnalyzer implements IRetryAnalyzer {
private static int MAX_RETRY_COUNT = 3;
AtomicInteger count = new AtomicInteger(MAX_RETRY_COUNT);
public boolean isRetryAvailable() {
return (count.intValue() > 0);
}
@Override
public boolean retry(ITestResult result) {
boolean retry = false;
if (isRetryAvailable()) {
System.out.println("Going to retry test case: " + result.getMethod() + ", " + (MAX_RETRY_COUNT - count.intValue() + 1) + " out of " + MAX_RETRY_COUNT);
retry = true;
count.decrementAndGet();
}
return retry;
}
}
POM.xml-> Surefire配置:
在这里,您应该配置“覆盖” surefire监听器,该监听器具有自己的计数器。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<suiteXmlFiles><suiteXmlFile>${basedir}/testng.xml</suiteXmlFile></suiteXmlFiles>
<properties>
<property>
<name>listener</name>
<value>Utils.MyTestListenerAdapter,Utils.MyRetryAnalizer</value>
</property>
</properties>
关于java - 通过测试监听器删除(重复)失败的TestNG结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29104427/