如何优化 testng 和 selenium 测试

2024-03-16

在我的实习中,我必须使用 TestNG 和 selenium 来测试 Web 应用程序。但我有一个问题,有时硒或浏览器由于某种随机原因无法工作,因此工作测试被标记为“失败”。为了避免这种情况,我可以使用注释@Test(invocationCount = 4, successPercentage = 25),那么如果测试成功一次,测试就被标记为“成功”,这很好,但问题是这个解决方案将测试时间乘以 4,这不是很有效。

我可以做的来减少测试时间,就是编写一些规则“如果测试失败,则重新运行此测试(并且仅当测试失败时),如果第二次、第三次或第四次有效,则将此测试标记为“成功”“这样我就可以避免这些随机错误。但我还没有找到如何编写这个规则,我看到我们可以添加一个监听器,所以我们有一个名为“onTestFailure“这样当测试失败时我可以做一些事情,但我不知道如何重新运行测试。

我还发现 testng-failed.xml 保存了所有失败的测试,因此我们可以运行此 xml 文件来重新运行这些测试,但这会删除之前第一次运行的报告,但我只想标记失败的测试如果第二次运行成功,则为“成功”。 (我已经将 testNG/selenium 集成到 Jenkins 中,所以我有一个包含所有测试的图表,所以这个方法不是很适应,但是这个方法不会将测试时间乘以 4,这就是我想要的)

因此,如果您知道如何做到这一点,那就太好了。


您可以使用 IRetryAnalyzer、侦听器和自定义报告器的组合来完成您想要的操作。

IRetry分析器:

public class RetryAnalyzer implements IRetryAnalyzer  { 
private int count = 0; 
// this number is actually twice the number
// of retry attempts will allow due to the retry
// method being called twice for each retry
private int maxCount = 6; 
protected Logger log;
private static Logger testbaseLog;

static {
    PropertyConfigurator.configure("test-config/log4j.properties");
    testbaseLog = Logger.getLogger("testbase.testng");
}

public RetryAnalyzer()
{
    testbaseLog.trace( " ModeledRetryAnalyzer constructor " + this.getClass().getName() );
    log = Logger.getLogger("transcript.test");
}

@Override 
public boolean retry(ITestResult result) { 
    testbaseLog.trace("running retry logic for  '" 
            + result.getName() 
            + "' on class " + this.getClass().getName() );
        if(count < maxCount) {                     
                count++;                                    
                return true; 
        } 
        return false; 
}
}

重试监听器:

public class RetryTestListener extends TestListenerAdapter  {
private int count = 0; 
private int maxCount = 3; 

@Override
public void onTestFailure(ITestResult result) {     
    Logger log = Logger.getLogger("transcript.test");
    Reporter.setCurrentTestResult(result);

    if(result.getMethod().getRetryAnalyzer().retry(result)) {    
        count++;
        result.setStatus(ITestResult.SKIP);
        log.warn("Error in " + result.getName() + " with status " 
                + result.getStatus()+ " Retrying " + count + " of 3 times");
        log.info("Setting test run attempt status to Skipped");                 
    } 
    else
    {
        count = 0;
        log.error("Retry limit exceeded for " + result.getName());
    }       

    Reporter.setCurrentTestResult(null);
}

@Override
public void onTestSuccess(ITestResult result)
{
    count = 0;
}

然而,TestNG 中似乎存在一个错误,实际上导致一些测试结果被报告为跳过和失败。为了防止这种情况,我建议您重写您想要使用的任何 Reporter 并包含如下方法:

private IResultMap removeIncorrectlyFailedTests(ITestContext test)
{     
  List<ITestNGMethod> failsToRemove = new ArrayList<ITestNGMethod>();
  IResultMap returnValue = test.getFailedTests();

  for(ITestResult result : test.getFailedTests().getAllResults())
  {
    long failedResultTime = result.getEndMillis();          

    for(ITestResult resultToCheck : test.getSkippedTests().getAllResults())
    {
        if(failedResultTime == resultToCheck.getEndMillis())
        {
            failsToRemove.add(resultToCheck.getMethod());
            break;
        }
    }

    for(ITestResult resultToCheck : test.getPassedTests().getAllResults())
    {
        if(failedResultTime == resultToCheck.getEndMillis())
        {
            failsToRemove.add(resultToCheck.getMethod());
            break;
        }
    }           
  }

  for(ITestNGMethod method : failsToRemove)
  {
      returnValue.removeResult(method);
  }  

  return returnValue;
}

完成所有这些后,您可以使用 .addListener 添加报告器,并在 @Test 注释中指定 retryAnalyzer。

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

如何优化 testng 和 selenium 测试 的相关文章

  • 如何在由子控件组成的 SWT 复合材料上跟踪鼠标?

    我创建了自己的控件 我想跟踪鼠标并添加一个MouseTrackListener 很遗憾MouseEnter and MouseLeave当鼠标移动到我的合成部分 即标签和按钮 上时 也会生成事件 Mouse enter mouse ente
  • 如何在 JavaFX 中连接可观察列表?

    我所说的串联是指获得一个新列表 该列表侦听所有串联部分的更改 方法的目的是什么FXCollections concat ObservableList
  • 两个整数乘积的模

    我必须找到c c a b mod m a b c m 是 32 位整数 但 a b 可以超过 32 位 我正在尝试找出一种计算 c 的方法 而不使用 long 或任何 gt 32 位的数据类型 有任何想法吗 如果m是质数 事情可以简化吗 注
  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • 为什么即使我的哈希码值相同,“==”也会返回 false

    我写了一个像这样的课程 public class HashCodeImpl public int hashCode return 1 public static void main String args TODO Auto generat
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • 如何在 Jenkins 中安排构建?

    如何安排 Jenkins 构建 使其只能在每天的特定时间进行构建 例如下午 4 点开始 0 16 1 7 我理解为 每个月周一到周日下午 0 分钟 下午 4 点 但是它每分钟都会构建 如果有任何建议 我将不胜感激 谢谢 Update 请阅读
  • 提供节点名或服务名,或未知 Java

    最近我尝试运行我的 Java 项目 每当我运行它并将其打开到我得到的服务器地址时 Unable to determine host name java net UnknownHostException Caused by java net
  • 如何在 Spring 中使 @PropertyResource 优先于任何其他 application.properties ?

    我正在尝试在类路径之外添加外部配置属性资源 它应该覆盖任何现有的属性 但以下方法不起作用 SpringBootApplication PropertySource d app properties public class MyClass
  • Android 无法解析日期异常

    当尝试解析发送到我的 Android 客户端的日期字符串时 我得到一个无法解析的日期 这是例外 java text ParseException 无法解析的日期 2018 09 18T00 00 00Z 位于 偏移量 19 在 java t
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • 将人类日期(当地时间 GMT)转​​换为日期

    我正在服务器上工作 服务器正在向我发送 GMT 本地日期的日期 例如Fri Jun 22 09 29 29 NPT 2018在字符串格式上 我将其转换为日期 如下所示 SimpleDateFormat simpleDateFormat ne
  • Akka 与现有 java 项目集成的示例

    如果我已经有现有的javaWeb 应用程序使用spring and servlet容器 将 Akka 集成到其中的正确方法是什么 就像我将会有Actor1 and Actor2互相沟通的 开始使用这些演员的切入点是什么 例如 1 把它放在那
  • 提高 PostgreSQL 1 亿数据左连接查询性能

    我在用Postgresql 9 2 version Windows 7 64 bit RAM 6GB 这是一个Java企业项目 我必须在我的页面中显示订单相关信息 有三个表通过左连接连接在一起 Tables TV HD 389772 行 T
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • 错误:找不到模块“jasmine-core”

    我安装了以下内容进行测试 devDependencies jasmine core 2 4 1 karma 0 13 22 karma jasmine 0 3 7 karma phantomjs launcher 1 0 0 运行后karm
  • 轻松的反应

    我有一个与这里描述的类似的案例 动态更改RESTEasy服务返回类型 https stackoverflow com questions 3786781 dynamically change resteasy service return
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack

随机推荐

  • 在 haskell 中定义一个新的 monad 不会引发 Applicative 的实例

    我正在尝试定义一个新的 monad 但遇到了一个奇怪的错误 纽莫纳德 hs newtype Wrapped a Wrap unwrap a instance Monad Wrapped where gt gt Wrap x f f x re
  • ASP.NET MVC 通过文件/文件路径确定 mime 类型

    我正在使用 ASP NET MVC 3 该应用程序的目标是 net 4 0 我试图将虚拟路径作为参数传递给控制器 的操作并返回文件 而不检查服务器上的实际物理路径并提供基本授权 不幸的是 我无法找到合适的 File 方法重载来生成适当的 A
  • Plotly-R:如何制作有间隙的 y 轴?

    Is it possible to create a plotly bar chart e g any chart from the following website https plotly com r bar charts https
  • 在 Java 中将数字转换为灰度颜色

    我试图弄清楚如何将 1 到 50 之间的数字转换为可以在此处使用的灰度颜色 g setColor MyGreyScaleColour 1 表示最亮 白色 50 表示最暗 黑色 e g Color intToCol int colNum co
  • 控制风扇速度

    我想用C 控制风扇速度 我尝试了 WMI 但它对我不起作用 我有配备 Intel Core i5 的 HP ProBook Windows 7 HomePremium 64 位 还有其他方法可以控制风扇速度 获取温度 将风扇速度设置为更高或
  • 使用 ZF 使 Zend_Rest_Server 返回 JSON 而不是 XML

    Zend Rest Server 可以返回 Json 吗 如果没有 有什么替代方案 其他库建议也可以 Zend Rest Server 输出 XML 尽管文档中没有明确指定 有一些替代方案 您可以利用 Zend Framework 提供的整
  • 如何停止谷歌云数据流中的流管道

    我有一个正在运行的流数据流来读取 PUB SUB 订阅 一段时间后或者可能是在处理一定量的数据后 我希望管道自行停止 我不希望我的计算引擎实例无限期地运行 当我通过数据流控制台取消作业时 它显示为失败的作业 有办法实现这一点吗 我错过了什么
  • Mono 编译错误 - 无法从程序集“System”加载类型“System.Runtime.CompilerServices.ReferenceAssemblyAttribute”

    我在编译 CSharp Mono 应用程序时遇到问题 我的Mono版本是2 10 2 这是我收到的错误 程序集 home tmc AcctTerm System dll 中缺少方法 ctor 类型为 System Runtime Compi
  • TinyMCE v4 关闭 blob

    我不想tinymce使用斑点来处理小图像 因为我正在转换它们data images到真实图像 我正在替换img src 当我有了真实的图像之后 我怎样才能做到只得到data image图片 是否可以 我试过 automatic upload
  • 如何在 OS X 中使用 Java 查找用户的“文档”文件夹?

    我想在用户的 文档 文件夹中创建一个目录 但到目前为止我只找到了如何获取用户的主目录 javax swing JFileChooser fr new javax swing JFileChooser javax swing filechoo
  • scipy 偏态分布的随机变量

    尝试从 SciPy 的分布中抽取随机数 就像使用 stats norm rvs 一样 然而 我试图从我拥有的经验分布中获取数字 这是一个倾斜的数据集 我想将倾斜和峰度合并到我正在绘制的分布中 理想情况下 我只想调用 stats norm r
  • functools.partial 不能与 multiprocessing.Pool.map 一起使用吗?

    我的代码经过简化 如下所示 run functools partial run grep options grep print only options print only force options force if not optio
  • 错误:getaddrinfo EAI_AGAIN(docker、nginx)

    我知道此错误与 DNS 查找超时错误相关 意味着它是网络连接错误或代理相关错误 但是我不知道如何解决它 我使用 docker compose yml 里面有 3 个容器 这是我的 docker compose yml 作为链接 docker
  • 数据表加载速度非常慢

    我使用数据表作为页面上某些下拉列表的数据源 但注意到页面在回发期间非常慢 我已经追踪到这里 DataTable dt new DataTable dt Load sqlCmd ExecuteReader this takes ages sq
  • 如何使用百分比作为参数调整 HTML 中的图像大小?

    我想调整我网站上的图像大小 我知道如何通过之前调整图像大小或计算宽度和高度并以像素为单位设置值来做到这一点 但我多次使用不同尺寸的同一张图片 因此如果我可以相对于图像本身的大小调整图像的大小 那么我会花费更少的时间 img src imag
  • 数组按字母顺序排序?

    假设我有两个字符串数组 名为 arrayone 和 arraytwo 我将如何按照字母顺序 从 A 到 Z 对 arrayone 进行排序 同时仍然保持与第二个数组的关系 如果您想知道 arrayone 和 arraytwo 中的内容 1
  • 通过数据库链接立即执行

    是否可以通过数据库链接在远程数据库上执行动态 PL SQL 我正在寻找类似的东西 l stmt begin null end execute immediate l stmt dblink 上面的语法显然是错误的 我明白了PLS 00201
  • 为什么要选择 64 位操作系统? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 关于这些问题 哪个 Vista 版本最适合开发人员计算机 https stackoverflow com questions 17653
  • Azure 删除用户对 API 的同意

    从我的前端应用程序中 当我请求访问令牌时 我传递了两个需要与令牌一起返回的范围 我没有在 Azure 门户中向应用程序授予这些同意 相反 用户必须从弹出窗口明确表示同意 一旦用户授予同意 我就会获得具有所需范围的访问令牌 但如何撤销 Azu
  • 如何优化 testng 和 selenium 测试

    在我的实习中 我必须使用 TestNG 和 selenium 来测试 Web 应用程序 但我有一个问题 有时硒或浏览器由于某种随机原因无法工作 因此工作测试被标记为 失败 为了避免这种情况 我可以使用注释 Test invocationCo