通过测试侦听器删除(重复)失败的 TestNG 结果

2023-12-01

类似于这里发布的解决方案TestNG 重试失败的测试不会输出正确的测试结果,我尝试在 onFinish(ITestContext context) 期间使用测试侦听器删除(重复的)测试结果。

尽管使用 context.getFailedTests().removeResult(result) 删除结果似乎工作正常(结果实际上已删除),但似乎有“其他地方”正在从中提取结果,导致构建仍然失败。

另请注意,当我运行上面文章中的示例测试(其中有一个重复的失败需要被删除并且一个通过测试)时,我得到了“测试结果”(未按预期清理)与“套件结果”的差异(重复的失败已按预期删除)。

并且,报告从哪里提取结果来决定构建是否失败?或者只是在我清理失败的测试之前它正在提取结果......?

===============================================
    Default test
    Tests run: 3, Failures: 2, Skips: 0
===============================================

===============================================
Default suite
Total tests run: 2, Failures: 1, Skips: 0  
===============================================

EDIT:澄清一下,我们使用 Maven 运行这些测试,它们是 IT,所以我们使用故障安全插件运行它们。问题是,即使看起来测试已被删除,mvn verify 仍然会使构建失败,因为它认为无论如何都会发现构建失败。

而且,如果从 Eclipse 运行这样的测试,即使测试被删除,当套件完成时,失败仍然会打印在日志中。

关于重试分析器:我根本不认为使用 RetryAnalyzer 是好的/最佳实践,但如果您发现自己处于需要解决问题的情况,例如如果您继承了一个依赖于 RetryAnalyzer 的测试套件,您可能会发现这很有用。


尝试使用此代码:

监听适配器:

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>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过测试侦听器删除(重复)失败的 TestNG 结果 的相关文章

随机推荐

  • 在 Scala 中提取两个字符串之间的字符串

    我有一个像这样的字符串序列 val foo Seq bar scala baz bar java baz bar python baz 我需要提取之间的所有内容bar and baz这样我就会得到这样的东西 val foobarbaz Se
  • mySQL - 我应该非规范化吗?

    Overview 抱歉 它含糊不清 我认为如果我讲得更详细 事情就会变得过于复杂 我有三个表 表一包含一个 id 表二包含其自己的 id 和表一的 id 表三包含其自己的 id 和表二的 id 我花了很多时间思考 我认为表三也包含相关表的
  • Excel合并总和产生不同列总计

    我有两列 如下所示 Make Model Parc Abarth 500 15 Abarth 500 19 Abarth 500 2 Abarth 500 14 Abarth 500 15 Abarth 500 25 Abarth 500
  • 如何通过 docker run 将参数传递给 Shell 脚本

    我是码头工人世界的新手 我必须调用一个 shell 脚本 该脚本通过 docker 容器获取命令行参数 例如 我的 shell 脚本如下所示 bin bash echo 1 Dockerfile 看起来像这样 FROM ubuntu 14
  • 如何扩展最终类?(Reflection,Javassist)

    我有一个 JAR 文件 它有大量的类 一 我需要的被设置为最终的 所以我不能扩展它 有一种方法 我基本上必须扩展和修复 否则一切都会崩溃 我怎样才能做到这一点 我知道 Reflection 和 Javassist 可以用于此目的 但我不知道
  • 使用 AngularJS 跟踪 Google Analytics 页面浏览量

    我正在使用 AngularJS 作为前端来设置一个新应用程序 客户端的一切都是通过 HTML5 Pushstate 完成的 我希望能够在 Google Analytics 中跟踪我的页面浏览量 如果您正在使用ng view在你的 Angul
  • SystemJS:加载构建文件

    我的 SystemJS 文件如下所示 function global map tells the System loader where to look for things var map angular2 boot app dist a
  • iOS 7 - viewDidLoad 和 viewDidAppear 之间的区别

    抱歉 这本身可能不是一个编程问题 而更多的是对 iOS 生命周期函数性质的询问 我有一个应用程序 其中有一个函数可以创建四个数组并通过数据库查询填充它们 首先 我从viewDidLoad函数 但是 每当加载视图时 视图实际显示之前都需要一段
  • 使用 JAXB 进行灵活编组

    我希望有一种灵活的方式来编组对象 单个对象的详细版本和多个对象版本的不太详细版本 例如 考虑我的部门模型 获取 位置 1
  • 对结构队列进行排序

    我目前有一个队列 其中包含用户指定数量的结构 称为Process 进程由 pid 突发和到达组成 我想按到达时间对队列进行排序 但我完全不知道从哪里开始 这是一些伪代码来帮助说明我想说的内容 struct Process int pid i
  • cmake找不到java,但是已经安装了

    我正在尝试使用 cmake 构建一个项目 这个项目主要使用java 问题是在代码中 find package Java REQUIRED 我收到以下错误 CMake Error at usr share cmake 2 8 Modules
  • 将日期字符串格式化为适合 Google 日历作为参数

    我有一个代表 2014 July 2014 等数据的字符串 我正在 javacript 中格式化此日期 以便我可以将其用作 Google 日历图表的参数 E g var x 2014 July 12 var splitted x spilt
  • 从 Blob 保存到本地文件

    我有一个难题要问你 我已经为此苦苦挣扎了一段时间 我正在寻找一种解决方案 我可以将文件保存到用户计算机 而无需本地存储 因为本地存储有 5MB 限制 我想要 保存到文件 对话框 但我想要保存的数据只能在 JavaScript 中使用 我想阻
  • Java String.replace/replaceAll 不工作

    因此 我试图解析 Java 中包含 左 方括号的字符串输入 我有str replace 但这绝对没有任何作用 我试过了replaceAll另外 具有多个不同的正则表达式 但输出始终保持不变 我想知道这是否可能是由于我所有的反斜杠字符都显示为
  • 影响 d3.js 中多个单独图表的交互?

    我正在尝试在 d3 js 中创建一个数据可视化 其中包含两个图表 一个平行轴图和水平颜色条图 我只是起了这个名字 但它基本上是一系列彩色矩形 平行轴图中的每条线都与颜色条图中的一组矩形相关联 现在 将鼠标悬停在给定的线上会突出显示该行 并将
  • 将 docker-compose 与 docker swarm 结合使用

    我在用着docker 1 12 1我有一个简单的 docker compose 脚本 version 2 services jenkins slave build slave image jenkins slave 1 0 restart
  • React-Native:无法在 Android 设备上以发布模式显示远程图像

    我正在我的 Android 设备 三星 9 Android 9 API 28 中运行一个简单的反应本机应用程序 因此在调试模式下 使用此命令行可以正常工作 react native run android 这是结果 但在释放模式下 reac
  • Jersey/REST--NoSuchMethodError:com.sun.jersey.core.reflection.ReflectionHelper.getContextClassLoaderPA()Ljava/security/Privilege

    当尝试使用 jersey 构建 REST 服务时 我收到 NoSuchMethodError 错误 任何帮助将非常感激 我的 POM xml
  • GetExtendedTcpTable 不返回与 netstat -ano 相同的结果

    我使用此代码来获取我的电脑中打开的端口的列表以及使用每个端口的应用程序 string Port GetListOfTcpPorts string ApplicationName string result string aux string
  • 通过测试侦听器删除(重复)失败的 TestNG 结果

    类似于这里发布的解决方案TestNG 重试失败的测试不会输出正确的测试结果 我尝试在 onFinish ITestContext context 期间使用测试侦听器删除 重复的 测试结果 尽管使用 context getFailedTest