自动化测试过程中存在很多的不稳定性,例如网络的不稳定,浏览器无响应等等,这些失败往往并不是产品中的错误。那么这时我们需要对执行失败的场景恢复重新执行,确认其是否确实失败。

以前使用QTP的时候也使用了场景恢复,那么testng的场景恢复怎么做呢?

一、查看testng现在接口

首先,我们来看一下TestNG的IRetryAnalyzer接口(因为我的项目是用maven管理,所以接口位置是:Maven Dependencies-testng.jar-org.testng-IRetryAnalyzer.class)

package org.testng;

/**
* Interface to implement to be able to have a chance to retry a failed test.
*
* @author tocman@gmail.com (Jeremie Lenfant-Engelmann)
*
*/
public interface IRetryAnalyzer { /**
* Returns true if the test method has to be retried, false otherwise.
*
* @param result The result of the test method that just ran.
* @return true if the test method has to be retried, false otherwise.
*/
public boolean retry(ITestResult result);
}
这个接口只有一个方法:
  public boolean retry(ITestResult result);
  一旦测试方法失败,就会调用此方法。如果您想重新执行失败的测试用例,那么就让此方法返回true,如果不想重新执行测试用例,则返回false。
 
二、实现testng失败重跑的接口IRetryAnalyzer

  添加类TestngRetry,实现如下:

/**
* @author Helen
* @date 2018年5月19日
*/
package common; import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
import org.testng.Reporter; /**
* 描述:重写testngRetry接口,设置场景恢复
*/
public class TestngRetry implements IRetryAnalyzer {
private int retryCount = 1;
private static int maxRetryCount = 3;// 最大重新执行场景的次数 /*
* 场景恢复设置,重新执行失败用例的次数
*/
public boolean retry(ITestResult result) {
if (retryCount <= maxRetryCount) {
String message = "Retry for [" + result.getName() + "] on class [" + result.getTestClass().getName()
+ "] Retry " + retryCount + " times";
Reporter.setCurrentTestResult(result);
Reporter.log(message);//报告中输出日志
retryCount++;
return true;
}
return false;
} }

三、添加监听

  这时我们还要通过接用IAnnotationTransformer来实现监听,添加类TestngRetryListener,代码如下:

/**
* @author Helen
* @date 2018年5月19日
*/
package common; import java.lang.reflect.Constructor;
import java.lang.reflect.Method; import org.testng.IAnnotationTransformer;
import org.testng.IRetryAnalyzer;
import org.testng.annotations.ITestAnnotation; /**
* 描述:实现IAnnotationTransformer接口,设置监听
*/
public class TestngRetryListener implements IAnnotationTransformer{ public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
IRetryAnalyzer retry = annotation.getRetryAnalyzer();
if (retry == null) {
annotation.setRetryAnalyzer(TestngRetry.class);
} } }

四、配置testng监听器

最后,我们只要在testng.xml里面设置监听就可以了,在testng.xml中添加如下配置:

    <listeners>
<!-- 添加场景恢复的监听器 -->
<listener class-name="common.TestngRetryListener"></listener>
</listeners>

五、结果展示

  执行完结果后,查看测试报告,测试是有失败的。

  

  在 log输出中,我们可以看到TClassManageTest中的方法inputClassList是重跑了三次的。

  

testng实现场景恢复的更多相关文章

  1. QTP 场景恢复– 函数调用

    创建自动化测试是为了实现无人值守下运行,但也给开发人员带来一些问题.假如你离开办公室前启动测试,想要让它通宵运行.然而,由于不可预见的错误,您的测试会在某一点停止,中断了测试结果.因此QTP中引入场景 ...

  2. UFT场景恢复

    场景恢复: 在脚本运行中可能会出现一些非预期事件.错误.程序崩溃等情况,阻止脚本继续执行下去,在此情况下脚本可能暂停执行, 直到某些界面被操作之后才会继续执行下去,为了处理这一类事件因此存在场景恢复. ...

  3. Oracle丢失重做日志的几种场景恢复

    实验环境:RHEL6.4 + Oracle 11.2.0.4 一.丢失重做日志组中成员 1.1 故障模拟 1.2 处理方法 1.3 实际处理过程 二.丢失重做日志组 2.1 丢失INACTIVE重做日 ...

  4. 实验Oracle数据文件被误删除的场景恢复

    环境:RHEL 5.4 + Oracle 11.2.0.3 背景:数据库没有备份,数据库文件被误操作rm,此时数据库尚未关闭,也就是对应句柄存在,如何快速恢复? 1.某个普通数据文件被删除 2.所有数 ...

  5. oracle rm -fr datafile 数据文件被误删的场景恢复(没有rman备份)

    环境: Linux release 7.5 oracle19c (无pdb,从11.2.0.4升级上去的) 一:单个非系统表空间的数据文件被删除 我先备份一下,虽然是测试环境. [oracle@19c ...

  6. QTP场景恢复函数

    public Function RecoveryFunction1(Object, Method, Arguments, retVal) Dim FileName ,TimeNow, ResPath ...

  7. OCP考点实战演练01-备份恢复篇

    本系列宗旨:真正掌握OCP考试中所考察的技能,坚决不做Paper OCP! 实验环境:RHEL 6.4 + Oracle 11.2.0.4 OCP考点实战演练01-备份恢复篇 1.数据库开启归档 2. ...

  8. QTP场景恢复之用例失败自动截图

    以下代码是在QC里运行QTP来执行脚本过程,当执行过程中发现用例失败后就会自动截图,然后把用例返回到最初始的状态,模拟了场景恢复的机制 Class QCImageErrorCapture Dim qt ...

  9. 【QTP-场景恢复】Post-Recovery Test Run Options Screen

    Post-Recovery Test Run Options Screen When you clear the Add another recovery operation check box in ...

随机推荐

  1. 打开Visual Studio 2010,左下角显示正在从包...加载工具箱内容,卡住5、6秒!!!

    在VS2010命令提示符用 devenv /ResetSkipPkgs 或者 devenv /ResetSettings

  2. Windows7驱动调试小Tips

    v:* { } o:* { } w:* { } .shape { }p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-botto ...

  3. MT6592 经验积累

    1.build/target/product/xxxx.mk  新项目clone后,需要修改这里 如:build/target/product/x160v.mk PRODUCT_MODEL :=Phi ...

  4. Android的Binder的起源-android学习之旅(100)

    George Hoffman任职1991年Be公司的工程师,他启动了一个"openBinder"的项目,该项目的宗旨是研究一个高效的信号传递工具,允许多个软件相互合作,构成一个软件 ...

  5. linux下由带-开头文件想到的

    如果要删除文件-aaa,使用rm -aaa是不行的,rm会认为-后面的是参数.2种办法: 1 带明确路径指示 rm ./-aaa 2 使用 -- :rm -- -aaa 因为命令如果发现参数中有--, ...

  6. javascript内置对象速查(二)

    Window对象 每个浏览器窗口或框架都对应于一个Window对象,它是随body或frameset元素的每个实例一起创建的对象. function status_text(){ window.sta ...

  7. JAVA_Lock

    今天是毕业入职的第一个周末,一直对多线程并发方面的知识比较感兴趣,因为目前我手里的项目并没有涉及到并发方面的知识,所以怕以后遗忘,也便于以后复习和使用,所以总结了一下Lock里面的一些类的方法.具体的 ...

  8. H5页面转成图片并下载到本地

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. jsJqGrid

    /*展开收起*/ $(function() { initGridTable(); }); function change() { var flag = $("#searchTitle&quo ...

  10. mysql 2003错误

    mysql安装好经常发现无法正常启动碰到最多的是error 2003的错误,以下为解决方法: mysqld -nt -remove mysqld -nt -install 重新启动mysql net ...