与此处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/

10-14 10:13
查看更多