如何解决TestNG Retry的问题
更新时间:2023-09-30 23:11:01 阅读量: 综合文库 文档下载
我们使用TestNG来作为自动化测试框架的基础。在运行一批test case之后呢,我们希望能够自动Retry failed的test case。TestNG提供了一个IRetryAnalyzer的接口,在@Test annotation里面可以指定使用Retry类来执行retry的功能。 @Test(retryAnalyzer = TestRetryAnalyzer.class)
TestRetryAnalyzer类实现了IRetryAnalyzer接口。
实现逻辑为:在retry方法里,判断Retry次数是否已经超过指定的最大retry次数。如果没有返回true,否则返回false。
_______________________________________________________________________________ importorg.testng.IRetryAnalyzer; importorg.testng.ITestResult;
public class TestRetryAnalyzer implements IRetryAnalyzer { private static final String TEST_RETRY_COUNT = \ privateint count = 1; privateintmaxCount = 1; publicTestRetryAnalyzer() { String retryMaxCount = System.getProperty(TEST_RETRY_COUNT); if (retryMaxCount != null) { maxCount = Integer.parseInt(retryMaxCount); } } publicintgetCount() { returnthis.count; } publicintgetMaxCount() { returnthis.maxCount; } public synchronized boolean retry(ITestResult result) { String testClassName = String.format(\ .getRealClass().toString(), result.getMethod().getMethodName()); if (count <= maxCount) { result.setAttribute(\ Logging.log(\ + \ count += 1; return true;
} return false; } }
_______________________________________________________________________________
然后,我们需要定义一个TestNGListener,来处理TestCase Retry的状态。在onTestFailure方法里,未达到最大retry次数的失败Case,我们把它的状态设置为SKIP,这样TestNG不会把它统计为Failed的test case。
在OnFinish方法里面处理最后TestCase的Result。
public class RetryTestListener extends TestListenerAdapter {
publicsynchronizedvoidonTestFailure(ITestResult arg0) {
public void onFinish(final ITestContext arg0) {
if(isRetryHandleNeeded)
}
{ { }
skippedCases = arg0.getSkippedTests(); failedCases = arg0.getFailedTests();
removeIncorrectlySkippedTests(arg0,failedCases); removeFailedTestsInTestNG(arg0);
}
}
isRetryHandleNeeded = true;
if (arg0.getMethod().getRetryAnalyzer() != null) {
TestRetryAnalyzertestRetryAnalyzer = (TestRetryAnalyzer)
if (testRetryAnalyzer.getCount() <= } else
failedCases.addResult(arg0, arg0.getMethod()); arg0.setStatus(ITestResult.SKIP); Reporter.setCurrentTestResult(null);
arg0.getMethod().getRetryAnalyzer();
testRetryAnalyzer.getMaxCount()) {
}else
TestNG可能会把TestCase同时放在Skipped和Failed里面,所以我们在Skipped的testcase里面剔除真正Failed的Test Case(最后一次Retry失败的Case)
protectedIResultMapremoveIncorrectlySkippedTests(ITestContexttest,IResultMap map)
IResultMap只提供了删除某个方法的removeResult(Method)方法,如果使用了
Dataprovider,我们不能直接调用此方法在FailedResult里面直接删除该方法的结果。这会造成test case结果的混淆。同一个TestMethod可能一个Data的结果Pass,另一个Data的结果Failed。所以我们使用failedCases来记录真正失败的result。同时我们在for(ITestResult result : returnValue.getAllResults()) {
for(ITestResultresultToCheck : map.getAllResults()) {
if(resultToCheck.getMethod().equals(result.getMethod())) {
failsToRemove.add(resultToCheck.getMethod()); break; } }
for(ITestResultresultToCheck : {
if(resultToCheck.getMethod().equals(result.getMethod())) {
failsToRemove.add(resultToCheck.getMethod()); break; } } }
for(ITestNGMethod method : failsToRemove) {
returnValue.removeResult(method); }
skippedCases = returnValue;
returnreturnValue; } {
List
test.getPassedTests().getAllResults())
自己的Report中把FailedCases显示出来。
在下面这个方法里面,我们在failedTests里面查找,如果failedCases里面没有该方法,就把该方法的结果删除掉。这样确保TestNG能够报告Suite的整体Pass/Fail状态。有些同学问,为什么要这么做?我们之前不是把testcase设置为skip了么?还记得我们前面提过的,TestNG可能会把result放在两个Map里面了,所以还是需要做这一步来确保正确。
privatevoidremoveFailedTestsInTestNG(ITestContext test) … }
test.getFailedConfigurations().removeResult(result.getMethod()); } } }
System.out.println(\+result.getMethod().getMethodName());
isFailed = true; break; } }
if(!isFailed) {
returnValue.removeResult(result.getMethod()); {
IResultMapreturnValue = test.getFailedTests();
for(ITestResult result : returnValue.getAllResults()) {
for(ITestResultresultToCheck : failedCases.getAllResults()) {
if(result.getMethod().equals(resultToCheck.getMethod())) {
booleanisFailed = false;
我们这么做了之后,基本能够保证报告的正确性。但是TestNG的Retry对DataProvider的支持不够好,详情参考https://groups.google.com/forum/#!msg/testng-users/7S9BFshqivk/R0dCG14kSccJ
另外,此代码基于TestNG 6.7 之上。
CI 中也需要做修改,否则Retry成功了,CI仍然会报告失败。
正在阅读:
如何解决TestNG Retry的问题09-30
酒店员工素养三规范05-02
合同管理之预警机制的建立03-11
职高高一上学期期末数学试题03-15
土木工程概论知识点08-18
贫困村退出标准和退出程序及贫困户的识别标准和退出程序03-18
银行职业规划职业规划【优秀9篇】03-26
垃圾渗滤液处理工艺的现状与分析07-22
《泥人张》阅读答案08-07
高三物理二轮复习策略02-06
- 党课
- 抽水试验方案
- 吴赣昌版高数第六章定积分的应用
- 广东省国土资源厅关于“三旧”改造工作实施意见的通知
- 华南理工 网络网上学习指南随堂练习
- 摩西的休妻律法和耶稣的休妻论
- 《清稗类钞》着述类 性理类 经术类
- 责任心是加强执行力建设的关键
- 数字高清COFDM车载无线图像传系统
- 2011年中考思想品德热点专题
- 2016年云南省中考物理试卷
- 2017中考语文专项复习 现代文阅读专题
- C区施工组织设计(400T) - 图文
- 房屋维修施工组织设计
- 七年级英语(上)一二单元检测(含听力)
- 10年嘉祥三诊测试 - 图文
- 借鉴行为主义学习观,提升文言文教学效率
- IX35提车检查表
- 辽宁省信息系统集成服务商名录2018版1241家 - 图文
- 仿人型机器人总体及臂手部结构设计7
- 解决
- TestNG
- 如何
- 问题
- Retry
- 2005年细胞生物学试试题及答案 - 图文
- 2019-2020年五年级科学下册 我是怎样出生的4教案 苏教版
- 加快发展新郑旅游产业
- 2009—2010学年度上学期九年级物理期末考试质量分析
- 社区综合
- WireShark抓包工具使用流程 - 图文
- 心理沙龙活动策划书
- 向莆铁路隧道施工作业要点手册 - 图文
- 2008年台州市考试录用公务员需求计划申报表
- 中国与澳大利亚文化差异之我见
- 公共营养师基础部分第七章复习提示7
- 四则运算练习器的实现文件
- 税收筹划作业2016
- 土力学试卷及答案(b)
- 配套K122018-2019学年中考数学专题复习 平方差公式及其应用(含解析)
- 军事理论答案(江西高校出版社)(最新版)
- 马克思复习提纲-最终
- 綦江区瑞恩幼儿园工作手册(完整版)
- 刚性悬挂作业指导书(客专) - 图文
- 季氏将伐颛臾练习卷