前段时间在网络上看到通过重写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. 《Java 程序设计》课堂实践项目-简易计算器

    <Java 程序设计>课堂实践项目简易计算器 课后学习总结 目录 改变 简易计算器实验要求 课堂实践成果 课后思考 改变 修改了博客整体布局,过去就贴个代码贴个图很草率,这次布局和内容都有 ...

  2. sqlserver 索引优化 CPU占用过高 执行分析 服务器检查

    原文:sqlserver 索引优化 CPU占用过高 执行分析 服务器检查 1. 管理公司一台服务器,上面放的东西挺多的.有一天有个哥们告诉我现在程序卡的厉害.我给他说,是时候读点优化的书了.别一天到晚 ...

  3. 矩阵类的python实现

    科学计算离不开矩阵的运算.当然,python已经有非常好的现成的库:numpy. 我写这个矩阵类,并不是打算重新造一个轮子,只是作为一个练习,记录在此. 注:这个类的函数还没全部实现,慢慢在完善吧. ...

  4. 04-cookies 会话跟踪技术

    1.会话跟踪技术 1.Http协议的无状态保存 会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应 2 .会话路径技术使用Cookie或session完成 我们知道HTTP协 ...

  5. python爬虫之数据的三种解析方式

    一.正则解析 单字符: . : 除换行以外所有字符 [] :[aoe] [a-w] 匹配集合中任意一个字符 \d :数字 [0-9] \D : 非数字 \w :数字.字母.下划线.中文 \W : 非\ ...

  6. 修复bug有哪些更快的技术?做好这6点就够了

    你有没有想过为什么有时修复错误似乎比它应该花费更长的时间?当你终于找到问题时,事实证明你所需要的只是一个小小的改变.然而,花了很多时间才能找到正在发生的事情.这种情况比我想象的更频繁. 另一方面,当您 ...

  7. TPO-19 C2 Cafeteria's Food Policy

    TPO-19 C2 Cafeteria's Food Policy 第 1 段 1.Listen to a conversation between a student and the directo ...

  8. Datawhale MySQL 训练营 Task2 查询语句

    目录 MySQL 管理 MySQL 用户管理 参考 数据库管理 SQ查询语句 1. 导入示例数据库,教程 MySQL导入示例数据库 2. 查询语句 SELECT 3. 筛选语句 WHERE ,过滤 4 ...

  9. Cocos2dx源码赏析(2)之渲染

    Cocos2dx源码赏析(2)之渲染 这篇,继续从源码的角度来跟踪下Cocos2dx引擎的渲染过程,以此来梳理下Cocos2dx引擎是如何将精灵等元素显示在屏幕上的. 从上一篇对Cocos2dx启动流 ...

  10. Vue+webpack报错: listen EADDRINUSE: address already in use :::8080

    如果本地运行多个vue+webpack项目会报错:listen EADDRINUSE: address already in use :::8080: 提示含义:地址端口已经被占用 注:8080指的是 ...