重新运行Selenium测试使Maven构建失败

时间:2014-03-10 18:01:44

标签: selenium testng maven-surefire-plugin

我们每晚运行一组UI测试,有时一些测试由于网络故障而失败。为了避免假阴性测试结果,我使用IRtetryAnalyzer重新运行失败的测试最多3次。

当我从Eclispe右键单击suite.xml运行测试时,它非常有效 - 如果测试最初失败但是在重试时通过,则第一个结果不计入失败。

但是当作为Maven构建的一部分运行相同的测试时,如果任何测试失败,构建将失败,即使成功通过重试也是如此。

例如,运行一套5个测试,其中一个失败,但第二次尝试失败,在TestNG套件运行时给出了这个输出:

  

总测试运行:5,失败:0,跳过:0

但是对于Maven,结果是不同的:

  

测试运行:6,失败:1,错误:0,跳过:0

有没有办法让Maven不将重新运行测试计为失败?

2 个答案:

答案 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)

我在this thread

中找到了部分解决方案

我仍然无法从所有测试计数中删除失败和重试的测试结果,但如果测试在第二次或第三次执行时传递,则至少我的版本不会失败。