【问题标题】:Rerunning Selenium tests make Maven build fail重新运行 Selenium 测试使 Maven 构建失败
【发布时间】:2014-03-10 18:01:44
【问题描述】:

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

当我从 Eclispe 右键单击​​ suite.xml 运行测试时,它运行良好 - 如果测试一开始失败但重试时通过,则第一个结果不计为失败。

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

例如,运行一个包含 5 个测试的套件,其中一个第一次失败但第二次尝试通过,当以 TestNG 套件运行时,我会得到以下输出:

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

但是有了 Maven,结果就不同了:

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

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

【问题讨论】:

    标签: selenium testng maven-surefire-plugin


    【解决方案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();
                }
            }
        }
       }
    }
    

    重试分析器

    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>
    

    【讨论】:

      【解决方案2】:

      我在this thread找到了部分解决方案

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

      【讨论】:

      • 我复制了文件,但构建仍然失败(mvn 测试)。有什么想法吗?。
      最近更新 更多