前段时间在网络上看到通过重写TestNG的接口,可以再次执行失败的测试用例,于是学习了,我之前的做法是当自己的脚本中碰到异常,就自动调用方法本身来达到再次执行用例的目的,这个过程中有设定重试的次数

对于TestNG,首先重写接口IRetryAnalyzer,重写该接口中的retry方法,自定义需要重试的次数maxReTryNum,如果一个用例失败,自动进入retry方法,在此方法中判断已经重试的次数是否小于等于maxReTryNum,如果是,则返回true,则自动再次执行失败的用例,如果是失败的用例再次执行还是失败,那么还是自动调用retry方法,直到到重试次数大于设定的maxReTryNum了,则返回false,那么系统就是判定该方法失败了

public class OverrideIReTry implements IRetryAnalyzer {
public static Logger logger=Logger.getLogger(OverrideIReTry.class);
public int initReTryNum=1;
public int maxReTryNum=3;
@Override
public boolean retry(ITestResult iTestResult) {
if(initReTryNum<=maxReTryNum){
String message="方法<"+iTestResult.getName()+">执行失败,重试第"+initReTryNum+"次";
logger.info(message);
Reporter.setCurrentTestResult(iTestResult);
Reporter.log(message);
initReTryNum++;
return true;
}
return false;
}
}
    当我们重写了TestNG的IRetryAnalyzer 接口,那么就需要让系统调用我们重写的接口,需要让TestNG调用,还需要对TestNG.xml中的注解接口进行重写。先判断TestNG.xml中是否有重试分析器,如果没有,则调用我们自己重写类
public class OverrideIAnnotationTransformer implements IAnnotationTransformer{
@Override
public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) {
IRetryAnalyzer iRetryAnalyzer= iTestAnnotation.getRetryAnalyzer();
if(iRetryAnalyzer==null){
iTestAnnotation.setRetryAnalyzer(OverrideIReTry.class);
}
}
}
 
    我们可以定义了2个方法test1和test2,代码如下,其中test1方法执行是正确,test2执行一定是会报异常的,那么预期的结果是,test2方法失败后,会被再次执行3次
public class ReTryTest {
@Test
public void test1(){
System.out.println(1/1);
}
@Test
public void test2(){
System.out.println(1/0);
}
}
    此时,我们就可以在TestNG.xml中直接声明监听重试的函数了,并且调用test1和test2来验证重写IRetryAnalyzer是否会对失败的用例重新执行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="casual">
<listeners>
<listener class-name="reTry.OverrideIAnnotationTransformer"></listener>
</listeners>
<test name="test">
<classes>
<class name="reTry.ReTryTest">
<methods>
<include name="test1"/>
<include name="test2"/>
</methods>
</class>
</classes>
</test>
</suite>
    直接编译后,我们可以看到log中是显示这个的,说明了我们的重写是可以正确的
[INFO ] main 2015-08-29 09:55:13,030                  reTry.OverrideIReTry     - 方法<test2>执行失败,重试第1次
[INFO ] main 2015-08-29 09:55:13,031 reTry.OverrideIReTry - 方法<test2>执行失败,重试第2次
[INFO ] main 2015-08-29 09:55:13,032 reTry.OverrideIReTry - 方法<test2>执行失败,重试第3次

testng对执行失败的用例,再次执行的更多相关文章

  1. pytest学习8-运行上次执行失败的用例

    该插件提供了两个命令行选项,用于重新运行上次pytest调用的失败: --lf,--last-failed- 只重新运行上次失败的用例,如果没有失败则全部运行 --ff,--failed-first- ...

  2. unity执行顺序问题(如何再次执行start方法)

    2016-09-08 20:13 2084人阅读 评论(1) 收藏 举报  分类: unity3D(66)  版权声明:本文为博主原创文章,未经博主允许不得转载. unity执行顺序的文章已经很多了, ...

  3. 【转】mysql触发器的实战(触发器执行失败,sql会回滚吗)

    1   引言Mysql的触发器和存储过程一样,都是嵌入到mysql的一段程序.触发器是mysql5新增的功能,目前线上凤巢系统.北斗系统以及哥伦布系统使用的数据库均是mysql5.0.45版本,很多程 ...

  4. jenkin 不必要的Execute shell执行失败,导致jenkins都失败的解决

    问题:jenkins里配置了多个执行shell,且有后续的执行job任务.但其中一个Execute shell执行失败了导致后续的shell都不执行了 而这个失败的shell并不是一定要执行   解决 ...

  5. testng优化:失败重跑,extentReport+appium用例失败截图,测试报告发邮件

    生成的单html方便jenkins集成发邮件,= = 构建失败发邮件 参考:https://blog.csdn.net/galen2016/article/details/77975965 步骤: 1 ...

  6. TestNG设置用例循环执行

    曾经做过一需求,需要单个集成测试用例循环执行N次,或许你会说for循环就可以了,这当然是可以的.那有没有逼格更高点的方法,当然也是有的.下面我们就说下使用TestNG注解功能实现用例的循环执行. 1. ...

  7. TestNG入门教程-12-Java代码执行testng.xml和失败后重跑

    前面我们都在IDEA上右键testng.xml文件来运行testng用例,这个在编写测试用例过程是 可以这么做,但是,如果测试用例写完了,也是这么做吗?有没有什么方法,例如自动化去实现.测试脚本维护后 ...

  8. Oracle 11g RAC 第二节点root.sh执行失败后再次执行root.sh

    Oracle 11g RAC 第二节点root.sh执行失败后再次执行root.sh前,要先清除之前的crs配置信息 # /u01/app/11.2.0/grid/crs/install/rootcr ...

  9. pybot执行多条用例时,某一个用例执行失败,停止所有用例的执行

    问题: pybot执行多条用例时,某一个用例执行失败,停止所有用例的执行 解决办法: pybot -exitonfailure E:\robot\呼送项目\测试用例\基本流程\主流程.txt 参考文章 ...

随机推荐

  1. Cenos6.6 升级 python3.5.2 安装配置 django1.10

    1 准备编译环境(环境如果不对的话,可能遇到各种问题,比如wget无法下载https链接的文件) yum groupinstall 'Development Tools' yum install zl ...

  2. check the manual that corresponds to your MySQL server version for the right syntax to use near

    一.问题 mysql插入数据时报错 sql如下 insert into t_sysconfig (servercode,key,value,remark,updatetime) values (&qu ...

  3. browser-sync 文件监听失败的解决方案

    问题 为了方便实时预览前端开发过程中修改源码后的页面,我在全球最大的同性交友网Github中找到了一个非常实用的工具,browser-sync. 安装使用方式请自行到官网https://browser ...

  4. Bootstrap学习笔记(3)--表格\表单\图片

    Bootstrap表格   表格类:    .table只会在表行之间增加横线;    .table-striped会在表格行之间增减斑马线;    .table-hover会给表设置鼠标悬停状态; ...

  5. 发现一个很N且免费的html5拓扑图 关系图 生成组件

    传送门:http://visjs.org/ demo代码 <!doctype html> <html> <head> <title>vis.js new ...

  6. Eclipse的汉化问题

    最近看了很多我周围的同学,也都是刚开始接触Eclipse,但是都头疼于eclipse的汉化问题. 好在的是,Eclipse的汉化比较简单,不用到网上自己下载汉化包,而且关于这个软件的汉化也非常的多,所 ...

  7. 怎么使用Spring配置事务 ?

    Spring同时支持编程式事务策略和声明式事务策略,大部分时候都采用声明式事务策略. 声明式事务管理的配置方式,通常有以下4种: (1) 使用TransactionProxyFactoryBean为目 ...

  8. 180804-Spring之动态注册bean

    Spring之动态注册bean 什么场景下,需要主动向Spring容器注册bean呢? 如我之前做个的一个支持扫表的基础平台,使用者只需要添加基础配置 + Groovy任务,就可以丢到这个平台上面来运 ...

  9. 初学者浅度剖析eShopOnContainers 里面用到的MediatR .

    一.介绍 简单了解下开源项目 MedatR, eShopOnContainers, MediatR作者Jimmy Bogard : Simple mediator implementation in ...

  10. java中文显示乱码的解决方式

    myeclipse 10 import 源文件后java文件中文乱码问题,*.java文件中的中文不能显示,都是乱码 解决方法(网上找的,已经过验证): 一.将整个project设置编码UTF-8(U ...