【TestNG】(4) 重试机制与监听器的使用
在UI自动化测试用例执行过程中,经常会有很多不确定的因素导致用例执行失败,比如网络原因、环境问题等,所以我们有必要引入重试机制(失败重跑),来提高测试用例成功率。
在不写代码的情况没有提供可配置方式,需要自己实现TestNG提供的接口,并以监听器的方式提供出来才可使用。
一、结合监听器配置
step1:新建Java类TestngRetry实现IRetryAnalyzer接口,复写retry方法
IRetryAnalyzer接口作用:实现此接口可以让失败的用例运行重试机制
public class TestngRetry implements IRetryAnalyzer {private static Logger logger = Logger.getLogger(TestngRetry.class);// 表示当前所重试的次数public static int retryCount = 1;// 表示重试最大次数限制public int maxRetryCount = 2;@Overridepublic boolean retry(ITestResult result) {// TODO Auto-generated method stubif (retryCount <= maxRetryCount) {logger.info("开始重试第" + "【" + retryCount + "】次" );retryCount++;// 如果返回为true表示执行重试机制return true;}// 如果返回为false表示不执行重试机制return false;}
}
step2:新建Java类RetryListener实现IAnnotationTransformer接口,复写transform方法
IAnnotationTransformer接口作用:在TestNG执行过程中动态修改@Test注解的参数
public class RetryListener implements IAnnotationTransformer {@Overridepublic void transform(ITestAnnotation annotation, Class testClass, ConstructortestConstructor, Method testMethod) {// TODO Auto-generated method stubIRetryAnalyzer iRetryAnalyzer = annotation.getRetryAnalyzer();if (iRetryAnalyzer == null) {annotation.setRetryAnalyzer(TestngRetry.class);} }
}
step3:在testng.xml配置文件中添加RetryListener监听器即可
<listener class-name="com.lemon.listener.RetryListener"></listener>
引入的问题
在运行重试的机制的时候我们会发现一个问题:
如果有引入dataprovider,那么dataprovider的第二组数据以后的用例失败后是不会正常的运行重试机制的
原因:
TestNG自带BUG,新建类TestResultListener继承于TestListenerAdapter,重写里面的onTestSuccess()和onTestFailure方法,在里面将当前的重试次数给置为1
public class TestResultListener extends TestListenerAdapter{@Overridepublic void onTestSuccess(ITestResult tr) {// TODO Auto-generated method stubsuper.onTestSuccess(tr);System.out.println("当前用例执行成功");//修复了TestNG的bug:dataprovider和重试机制冲突问题//用例重试机制有这种情况:当他运行到第一次重试or第二次重试or第三次(没有达到最大的重试次数的时候),有可能执行成功//用例此时会成功TestngRetry.currentRetryCount=1; }@Overridepublic void onTestFailure(ITestResult tr) {// TODO Auto-generated method stubsuper.onTestFailure(tr);System.out.println("当前用例执行失败");TestngRetry.currentRetryCount=1; }@Overridepublic void onTestSkipped(ITestResult tr) {// TODO Auto-generated method stubsuper.onTestSkipped(tr);System.out.println("当前用例执行跳过");}
}
二、不配置监听器
public class MyRetry implements IRetryAnalyzer {private int retryCount = 0;private static final int maxRetryCount = 3;@Overridepublic boolean retry(ITestResult result) {if (retryCount < maxRetryCount) {retryCount++;return true;}//如果多个@Test方法中用了该注解,因为testng的bug,它new的是同一个MyRetry对象//那么count不清0会报错,因为是一个MyRetry对象,可以人为置为0,但是官网不推荐这么做retryCount = 0return false;}
}使用重试:
//在用例类里面 添加重试属性@Test(retryAnalyzer = MyRetry.class)public void failedLogin3() {}
相关文章:
【TestNG】(4) 重试机制与监听器的使用
在UI自动化测试用例执行过程中,经常会有很多不确定的因素导致用例执行失败,比如网络原因、环境问题等,所以我们有必要引入重试机制(失败重跑),来提高测试用例成功率。 在不写代码的情况没有提供可配置方式…...
“智农”-高标准农田
高标准农田是指通过土地整治、土壤改良、水利设施、农电配套、机械化作业等措施,提升农田质量和生产能力,达到田块平整、集中连片、设施完善、节水高效、宜机作业、土壤肥沃、生态友好、抗灾能力强、与现代农业生产和经营方式相适应的旱涝保收、稳产高产…...
利用 lxml 库的XPath()方法在网页中快速查找元素
XPath() 函数是 lxml 库中 Element 对象的方法。在使用 lxml 库解析 HTML 或 XML 文档时,您可以通过创建 Element 对象来表示文档的元素,然后使用 Element 对象的 XPath() 方法来执行 XPath 表达式并选择相应的元素。 具体而言,XPath() 方法是…...
nginx---------------重写功能 防盗链 反向代理 (五)
一、重写功能 rewrite Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一,重写功能(…...
unity shaderGraph实例-物体线框显示
文章目录 本项目基于URP实现一,读取UV网格,由自定义shader实现效果优缺点效果展示模型准备整体结构各区域内容区域1区域2区域3区域4shader属性颜色属性材质属性后处理 实现二,直接使用纹理,使用默认shader实现优缺点贴图准备材质准…...
分类问题经典算法 | 二分类问题 | Logistic回归:公式推导
目录 一. Logistic回归的思想1. 分类任务思想2. Logistic回归思想 二. Logistic回归算法:线性可分推导 一. Logistic回归的思想 1. 分类任务思想 分类问题通常可以分为二分类,多分类任务;而对于不同的分类任务,训练的主要目标是…...
redis实现分布式全局唯一id
目录 一、前言二、如何通过Redis设计一个分布式全局唯一ID生成工具2.1 使用 Redis 计数器实现2.2 使用 Redis Hash结构实现 三、通过代码实现分布式全局唯一ID工具3.1 导入依赖配置3.2 配置yml文件3.3 序列化配置3.4 编写获取工具3.5 测试获取工具 四、运行结果 一、前言 在很…...
Sora引发安全新挑战
文章目录 前言一、如何看待Sora二、Sora加剧“深度伪造”忧虑三、Sora无法区分对错四、滥用导致的安全危机五、Sora面临的安全挑战总结前言 今年2月,美国人工智能巨头企业OpenAI再推行业爆款Sora,将之前ChatGPT以图文为主的生成式内容全面扩大到视频领域,引发了全球热议,这…...
Android 14.0 Launcher3定制化之桌面分页横线改成圆点显示功能实现
1.前言 在14.0的系统rom产品定制化开发中,在进行launcher3的定制化中,在双层改为单层的开发中,在原生的分页 是横线,而为了美观就采用了系统原来的另外一种分页方式,就是圆点比较美观,接下来就来分析下相关…...
SemiDrive E3 MCAL 开发系列(3)– Wdg 模块的使用
一、 概述 本文将会介绍 SemiDrive E3 MCAL Wdg 模块的基本配置,并且会结合实际操作的介绍,帮助新手快速了解并掌握这个模块的使用,文中的 MCAL 是基于 PTG3.0 的版本,开发板是官方的 E3640 网关板。 二、 Wdg 模块的主要配置 …...
AI推荐算法的演进之路
推荐算法 基于大数据和AI技术,提供全流程一站式推荐平台,协助企业构建个性化推荐应用,提升企业应用的点击率留存率和永久体验。目前,主要的推荐方法包括:基于内容推荐、协同过滤推荐、基于关联规则推荐、基于效用推荐…...
Tomcat安装,配置文件、组件
一、Tomcat的基本功能 1.1.Tomcat是什么? Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。一般来说,T…...
精读《React Hooks 最佳实践》
简介 React 16.8 于 2019.2 正式发布,这是一个能提升代码质量和开发效率的特性,笔者就抛砖引玉先列出一些实践点,希望得到大家进一步讨论。 然而需要理解的是,没有一个完美的最佳实践规范,对一个高效团队来说&#x…...
varFormatter 数据格式化库 以性能优先的 快速的 内存对象格式转换
varFormatter 数据格式化 技术 开源技术栏 对象/变量格式化工具库,其支持将一个对象进行按照 JSON XML HTML 等格式进行转换,并获取到结果字符串! 目录 文章目录 varFormatter 数据格式化 技术目录介绍获取方式 使用实例格式化组件的基本使…...
基于PHP的在线英语学习平台
有需要请加文章底部Q哦 可远程调试 基于PHP的在线英语学习平台 一 介绍 此在线英语学习平台基于原生PHP开发,数据库mysql。系统角色分为学生,教师和管理员。(附带参考设计文档) 技术栈:phpmysqlphpstudyvscode 二 功能 学生 1 注册/登录/…...
基于微信小程序电影院订票选座系统 (后台JSP+JDBC+Mysql)答辩常规问题和如何回答(答辩指导)
博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程ÿ…...
C++知识点总结(22):模拟算法真题 ★★★☆☆《安全警报》
安全警报 1. 审题 题目描述 Z市最大的金融公司:太平洋金融遭到了入侵,一名黑客潜入到了公司中,公司紧急启动安保程序,将大楼封锁,并安排作为安全主管的你对楼层进行搜查。所以你准备写一个程序,输入搜查楼…...
蓝桥杯练习系统(算法训练)ALGO-993 RP大冒险
资源限制 内存限制:64.0MB C/C时间限制:200ms Java时间限制:600ms Python时间限制:1.0s 问题描述 请尽情使用各种各样的函数来测试你的RP吧~~~ 输入格式 一个数N表示测点编号。 输出格式 一个0~9的数。 样例输入 0 样…...
Unity的相机跟随和第三人称视角
Unity相机跟随和第三人称视角 介绍镜头视角跟随人物方向进行旋转的镜头视角固定球和人的镜头视角 思路跟随人物方向进行旋转的镜头视角固定球和人的镜头视角 镜头旋转代码人物移动的参考代码注意 介绍 最近足球项目的镜头在做改动,观察了一下实况足球的视角&#x…...
哪个超声波清洗机品牌值得入手?销量榜品牌值得选购!
在科技日益发展的今天,超声波清洗技术以其高效、便捷和深度清洁的特点,已经深入到生活的诸多领域,从精密仪器到珠宝首饰,从眼镜框到假牙,甚至是厨房用品的日常护理,都能见到超声波清洗机的身影。面对市场上…...
终极Walkway.js进阶教程:掌握复杂交互动画与响应式设计的完整指南
终极Walkway.js进阶教程:掌握复杂交互动画与响应式设计的完整指南 【免费下载链接】walkway An easy way to animate SVG elements. 项目地址: https://gitcode.com/gh_mirrors/wa/walkway Walkway.js是一款轻量级的SVG动画库,让开发者能够轻松为…...
Linux系统中的Postlog 命令详解
在 Linux 系统中,并没有一个标准的命令叫做 Postlog。这可能是因为在不同的上下文或者特定的软件中,Postlog 可能指的是不同的命令或者功能。不过,我们可以探讨几个与日志(logging)相关的概念和命令,这些可…...
实时口罩检测-通用开源大模型部署:ModelScope Hub一键部署
实时口罩检测-通用开源大模型部署:ModelScope Hub一键部署 1. 引言:为什么你需要一个开箱即用的口罩检测工具? 想象一下,你正在开发一个智能门禁系统,需要自动识别访客是否佩戴口罩;或者你是一家商场的运…...
GLM-4.1V-9B-Base实操手册:基于Prometheus+Grafana的GPU服务监控看板
GLM-4.1V-9B-Base实操手册:基于PrometheusGrafana的GPU服务监控看板 1. 模型与平台介绍 GLM-4.1V-9B-Base是智谱开源的视觉多模态理解模型,专注于图像内容识别、场景描述、目标问答和中文视觉理解任务。该模型已经完成Web化封装,可以直接用…...
Pixel Aurora Engine效果展示:从Prompt到像素画的10组高质量生成对比
Pixel Aurora Engine效果展示:从Prompt到像素画的10组高质量生成对比 1. 像素艺术的新纪元 在数字艺术创作领域,Pixel Aurora Engine带来了一场像素艺术的革命。这款基于AI扩散模型的工作站,将复古的8-bit美学与现代AI技术完美融合…...
从零构建嵌入式GUI:基于LVGL 8.1的Linux桌面项目实战解析
1. 为什么选择LVGL构建嵌入式GUI? 在嵌入式开发领域,图形用户界面(GUI)的实现一直是个让人头疼的问题。传统的解决方案要么太重(比如Qt),要么太简陋(比如直接操作framebuffer)。而LVGLÿ…...
多租户下的系统业务开发过程探讨俚
一、背景与问题缘起 MySQL 5.6.51 版本下 2000 万行核心业务表开展新增字段操作,需求为新增BIGINT(19) NOT NULL DEFAULT 0 COMMENT 注释(因业务实际需要存储大数值关联字段)。 表的核心特性为Java 多线程密集读写,业务请求持续高…...
【限时技术白皮书】全球首批通过MLPerf Inference v4.0弹性测试的6套扩缩容配置模板(含Qwen3-72B/Gemma3-27B实测参数)
第一章:大模型工程化自动化扩缩容策略 2026奇点智能技术大会(https://ml-summit.org) 大模型服务在生产环境中面临显著的负载波动:推理请求可能在秒级内激增数倍,而空闲时段又需快速释放资源以控制成本。工程化自动化扩缩容并非简单复用传统…...
CasRel关系抽取模型实战案例:跨境电商评论中商品-属性-情感极性三元组分析
CasRel关系抽取模型实战案例:跨境电商评论中商品-属性-情感极性三元组分析 1. 引言:从海量评论中挖掘商业洞察 如果你在跨境电商平台工作,每天面对成千上万条用户评论,是不是感觉头大?这些评论里藏着用户对商品的真实…...
Rails 7中的表单验证与错误处理
在Ruby on Rails开发中,表单验证是确保用户输入符合预期的重要机制。尤其在用户注册这样的场景中,如何优雅地处理错误信息并显示给用户,是一个不容忽视的细节。本文将结合实际代码示例,探讨在Rails 7中如何实现表单验证和错误处理。 问题背景 一位开发者在使用Rails 7开发…...
