我们每晚运行一组UI测试,有时一些测试由于网络故障而失败。为了避免假阴性测试结果,我使用IRtetryAnalyzer
重新运行失败的测试最多3次。
当我从Eclispe右键单击suite.xml运行测试时,它非常有效 - 如果测试最初失败但是在重试时通过,则第一个结果不计入失败。
但是当作为Maven
构建的一部分运行相同的测试时,如果任何测试失败,构建将失败,即使成功通过重试也是如此。
例如,运行一套5个测试,其中一个失败,但第二次尝试失败,在TestNG
套件运行时给出了这个输出:
总测试运行:5,失败:0,跳过:0
但是对于Maven,结果是不同的:
测试运行:6,失败:1,错误:0,跳过:0
有没有办法让Maven
不将重新运行测试计为失败?
答案 0 :(得分:1)
终于明白了。我使用这段代码:
<强> 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 - &gt; Surefire配置:
这是您应该配置&#34;覆盖&#34; 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>
答案 1 :(得分:0)
我仍然无法从所有测试计数中删除失败和重试的测试结果,但如果测试在第二次或第三次执行时传递,则至少我的版本不会失败。