首页 > 其他分享 >testng重试机制

testng重试机制

时间:2023-04-14 17:47:24浏览次数:33  
标签:currentCount 次数 testng 重试 用例 重跑 机制 执行

  操作步骤   1.实现(implements)IRetryAnalyzer接口,重写(override)retry方法   2.实现(implements)IAnnotationTransformer接口,重写(override)transform方法   3.在testng.xml文件中设置监听    实现步骤   新建一个类TestCaseRetry,implements IRetryAnalyzer接口。该类的作用是设定失败的用例重跑需要重新运行的次数,设定一个运行次数,设定一个最大执行次数,当运行次数超过最大执行次数的时候,说明重跑完成。   retry方法返回值如果为true说明重跑未完成,返回值为false,说明重跑完成

public class TestCaseRetry implements IRetryAnalyzer {
 
private Logger logger = Logger.getLogger(TestCaseRetry.class);
//当前正在进行的重试次数
public static int currentCount = 1;
//允许重试的最大次数
private int maxCount = 2;
 
@Override
//如果返回为true的话,则执行retry
public boolean retry(ITestResult iTestResult) {
logger.info("当前重试次数是【" + currentCount + "】");
if (currentCount <= maxCount) {
logger.info("当前测试方法【" + iTestResult.getName() + "】执行失败,进入失败用例重试模式,正在进行第【" + currentCount + "】次重试");
currentCount++;
return true;
}
return false;
 
}
 
}

 

  新建一个类RetryListener,implements IAnnotationTransformer接口。该类的作用是用来监听所有的测试方法是否有retryAnalyzer注解属性,如果有该属性则不会执行我们设定的重跑机制(局部重跑的优先级比全局的高)。
public class RetryListener implements IAnnotationTransformer {
@Override
public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) {
//1.初始化IRetryAnalyzer对象
IRetryAnalyzer iRetryAnalyzer = iTestAnnotation.getRetryAnalyzer();
//判断测试方法是否设置重跑属性
if (iRetryAnalyzer == null) {
//为空说明用例方法里面未设置重跑,则按照全局设置进行用例重跑
//如果用例方法设置了注解属性retryAnalyzer,则按照注解的重跑
iTestAnnotation.setRetryAnalyzer(TestCaseRetry.class);
}
}
}

 

将监听类RetryListener添加到testng.xml文件中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="app_auto">
<test name="login">
<classes>
<class name="cases.LoginTest"></class>
</classes>
</test>
<!--配置监听器-->
<listeners>
<!--监听用例执行情况-->
<listener class-name="包.CustomListener"></listener>
<!--对用例方法执行进行监听是否需要重试-->
<listener class-name="包.RetryListener"></listener>
</listeners>
 
</suite>

 

  但是运行到这里的时候,会有一个问题:那就是在第一步设定重跑次数的时候,没有设定什么时候把正在重跑的次数(currentCount)还原为初始值,这样就会导致只有在执行第一个失败用例的时候会进行重跑,遇到第二个失败用例,因为当前的运行次数已经超过最大次数了,但是并没有进行还原,所以后面的失败用例永远不会进入重跑。   解决方法:   失败的用例在执行重跑的时候,要么重跑成功,要么依然失败(当前不考虑skip,但是也可以加上),那我们监听用例的执行结果,在用例执行有结果以后,我们重置执行次数就可以了。   新建一个CustomListener类,implements TestListenerAdapter接口,重写其中的onTestFailure和onTestSuccess方法。这两个方法为用例执行以后失败和成功分别调用的方法,比如用例执行失败需要截图,就可以在onTestFailure方法里面去实现,这样用例执行失败以后,会进入该方法完成截图操作。而我们只需要在这两个方法里面将对面的运行重跑次数恢复初始值即可。这样不管重跑几次的失败用例执行结果是成功还是失败都必然会让重跑次数恢复默认值,其他失败用例再次执行重跑的时候就可以不受影响。
public class CustomListener extends TestListenerAdapter {
Logger logger = Logger.getLogger(CustomListener.class);
@Override
public void onTestFailure(ITestResult tr) {
super.onTestFailure(tr);//如果测试用例执行完所有重试以后依然失败的话,重新设置currentCount为初始值,方便其他用例执行重试
logger.info("用例执行失败,重试机制的次数恢复初始值");
TestCaseRetry.currentCount = 1;
}
 
@Override
public void onTestSuccess(ITestResult tr) {
//如果测试用例执行重试的时候,执行成功了,也需要设置currentCount为初始值,方便其他用例执行重试
logger.info("用例执行成功,重试机制的次数恢复初始值");
TestCaseRetry.currentCount = 1;
super.onTestSuccess(tr);
}
}

 

 

标签:currentCount,次数,testng,重试,用例,重跑,机制,执行
From: https://www.cnblogs.com/paisen/p/17319057.html

相关文章

  • 使用Java反射机制将类的属性名和属性值打印出来
    可以使用Java反射机制来读取类的属性名和属性值。以下是一个示例代码,可以输出指定类的所有属性及其对应的值:1publicstaticvoidprintFields(Objectobj){2Classclazz=obj.getClass();3Field[]fields=clazz.getDeclaredFields();4for(Fieldfie......
  • Struts_token的令牌机制
       通常在普通的操作当中,我们不需要处理重复提交的,而且有很多方法来防止重复提交。比如在登陆过程中,通过使用redirect,可以让用户登陆之上重定向到后台首页界面,当用户刷新界面时就不会触发重复提交了。或者使用token,隐藏在表单中,当提交时进行token验证,验证失败也不让提交。这......
  • Mysql_快速返回机制的实现
    MYSQLJDBC快速查询响应的方法,快速返回机制的实现Oracle的快速返回机制,虽然结果集很多,可是它能很快的显示第一个结果,虽然通过MYSQl的客户端可以做到,但是通过JDBC却不行。今天用了1个多小时,终于搞定此问题,希望对广大Java朋友在处理数据库时有个参考。来由:   通过命令行客户端加......
  • 【计算机网络-数据链路层】流量控制与可靠传输机制
    目录1停止-等待协议1.1无差错情况1.2有差错情况——数据帧出错或丢失1.3有差错情况——ACK丢失1.4有差错情况——ACK迟到1.5性能分析1.6相关例题2后退N帧协议(GBN)2.1无差错情况2.2超时重传、回退N帧2.3相关例题3选择重传协议(SR)3.1有差错情况3.2相关例题4总结......
  • python版 异常重试的次数,间隔的装饰器涵数
    fromfunctoolsimportwrapsfromthreadingimportEventdefretry_exception(retry_count=0,interval_wait=0):defwrap(f):@wraps(f)deffunc(*args,**kwargs):try:returnf(*args,**kwargs)exc......
  • Linux操作系统ARM体系结构处理器机制原理与实现
    ARM的概念ARM(AdvancedRISCMachine),既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。ARM公司并不生产芯片也不销售芯片,它只出售芯片技术授权。其合作公司针对不同需求搭配各类硬件部件,比如UART、SDI、I2C等,从而设计出不同的SoC......
  • 基于产消者模式的主动配电网能量共享机制
    基于产消者模式的主动配电网能量共享机制摘要:代码提出了一种基于产消者和家用储能设备的能源共享机制。首先,考虑家用储能设备的充放电效用以及产消者的生产和消费效用,建立了消费者的交易决策模型。然后,基于集中式社会福利最大化能量共享问题,通过交替方向乘法器(ADMM)算法构建了主......
  • 【js】js内置对象Error(错误机制)
    Error:基类型;ReferenceError:找不到对象时抛出;SyntaxError:语法错误;TypeError:类型错误时抛出;EvalError:eval()函数发生异常时抛出;InternalError:js引擎内部发生的错误;RangeError:数值超出范围时触发;URIError:URI格式不正确时抛出,常发生在encodeURI或者decodeURI调用时;DOMExcept......
  • Java集成工作流审批机制,多个项目实际运用优化版本(干货)
    前言activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。一、项目形式springboot+vue+activiti集成了activiti在线编辑器,流行的前后端分离部署开发模式,快速开发平台,可插拔工作流服务。工作......
  • tomcat 双亲委托机制
    tomcat著名的双亲委托机制就是有类需要加载时就委托父类去加载一直到顶级的Bootstrap都没有自己才加载,自己也没有就报错类加载器BootstrapClassLoader:JVM内置的类加载器,用来加载Java核心类库,例如rt.jar、resources.jar等等。ExtensionClassLoader:用来加载Java扩展类......