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

当我从 Eclispe 运行测试并右键单击 suite.xml 时,它工作得很好——如果测试一开始失败但在重试时通过,则第一个结果不计为失败。

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

例如,运行一组 5 个测试,其中一个在第一次失败但在第二次尝试时通过,当作为 TestNG 套件运行时,我得到了这个输出:

Total tests run: 5, Failures: 0, Skips: 0

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

Tests run: 6, Failures: 1, Errors: 0, Skipped: 0

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

请您参考如下方法:

终于明白了。我使用这段代码:

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> 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!