阅读本文大约需要10分钟
背景
执行自动化测试用例时,经常会因为网络、环境等不确定因素导致执行结果不稳定。
为解决该问题,TestNG提供了失败用例立即重试的机制,此处的立即,指的是1个用例失败后,用户可以自定义操作之后决定是否重新执行该用例;执行完指定次数的重试或者在指定次数内成功之后,再执行下1个用例。上述描述只需要编写自定义的Retry类implements IRetryAnalyzer即可快速实现。已经有很多成功的案例,直接网上搜索即可快速找到教程,此处不再赘述。
然而,ci流水线上,大部分情况下,如果1个用例在某一时刻(秒级别)是失败的,再次重试80%以上也会是失败的。面对这种情况,我们一般都是在本地重试这些失败的case,往往又是可以成功通过的。那么,我们是否可以在ci流水上模拟这种操作,等所有的用例执行完毕之后,重置环境,再统一重试执行失败的用例呢?
由此需要先看看TestNG的源码的执行原理。
源码解读
GitHub下载TestNG最新源码
执行入口
TestNG.run()方法
由以上代码可知,只要将所有失败的case设置到一个新的xmlSuite上,调用TestNG.run()方法即可重试失败的case。
失败结果重置
众所周知,自定义listener implements ITestListener可以监听测试结果,onFinish方法中,能够获取到所有用例的执行结果。只要重写这个方法,就能够将失败后重试成功的用例结果重置。
报告修改
原生的报告是由XMLReporter.java生成的,从源码中不难看出,xml报告是基于ITestContext生成的。而ITestContext这个熟悉的对象,不正是上一步监听器中刚刚出现过吗?将源码中的XMLReporter.java复制出来,稍作修改,即可将覆盖原生的报告。也可以使用开源框架,或者自己编写代码生成自定义格式的报告。
批量重试关键代码
重试配置类
TestRetryConfig.java,主要用来储存重试的一些配置及过程数据,如当前重试次数、重试最大次数、每次执行的ITestContext等。
1 | public class TestRetryConfig { |
执行指定用例类
TestNgController.java,根据指定的Method,设置suite,并使用TestNG.run()方法执行用例。
1 |
|
结果监听器
TestListener.java,主要记录每次执行完毕的结果,以及遇到失败时调用TestNgController进行执行失败case。
1 |
|
xml报告监听器
XMLReporter.java,从源码中复制出来,稍作修改。
1 | /** |
html报告监听器
HtmlReporter,使用开源框架extentreports生成html报告。
1 |
|
测试类
1 |
|
1 | public class Test2 { |
xmlsuit
1 | <?xml version="1.0" encoding="UTF-8"?> |
Jenkins相关配置
pom.xml配置
1 | <plugin> |
构建命令
增加构建后操作
生成TestNG报告,报告pattern:“target/surefire-reports/testng-results.xml”