java - 通过测试监听器删除(复制)失败的 TestNG 结果

标签 java maven testng maven-failsafe-plugin

类似于此处发布的解决方案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();
            }
        }
    }
   }
}

重试分析器:

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/

相关文章:

java - JSF:导航

java - 如何在 Python 测试框架中实现 TestNG 监听器?

java - 使用 JUnit 测试服务器

Java map 匹配键

java - Selenium 在 Java Web 项目上运行时抛出 "NoSuchMethodError"

java - 使用 Maven 插件提取使用 Spring 注入(inject)的参数

testing - 如何在@DataProvider 方法中检索@Test 方法参数?

android-studio - 如何在 Gradle 中添加 Android Studio 插件作为依赖项?

java - 如何在新选项卡中打开 PDF 并在浏览器中显示(不要求下载)?

java - Maven - 如何使用本地文件夹中的 Artifact ?