UI自动化脚本执行过程中存在非常多的不稳定性,例如网络的不稳定,浏览器无响应等等,这些失败往往并不是产品中的错误。那么这时我们往往需要对执行失败的测试用例进行多次重跑,确认其是否确实失败。 那么失败重跑我们可以通过TestNG的功能来实现。

一旦测试方法失败,就会调用TestNG的IRetryAnalyzer接口的retry方法。如果您想重新执行失败的测试用例,那么就让此方法返回true,如果不想重新执行测试用例,则返回false。

如下我们新建一个TestngRetry类,实现IRetryAnalyzer :

  1. import org.testng.IRetryAnalyzer;
  2. import org.testng.ITestResult;
  3.  
  4. /**
  5. * 用例失败自动重跑逻辑
  6. * @author Charlie.chen
  7. *
  8. */
  9. public class TestNGRetry implements IRetryAnalyzer {
  10. public LogUtil log = new LogUtil(this.getClass());
  11. private int retryCount = ;
  12. private int maxRetryCount=;
  13.  
  14. public boolean retry(ITestResult result) {
  15. if (retryCount <= maxRetryCount) {
  16. String message = "running retry for '" + result.getName() + "' on class " +
  17. this.getClass().getName() + " Retrying " + retryCount + " times";
  18. log.info(message);
  19. retryCount++;
  20. return true;
  21. }
  22. return false;
  23. }
  24. }

添加用例重跑监听器RetryListener,用例失败自动重跑功能

  1. import java.lang.reflect.Constructor;
  2. import java.lang.reflect.Method;
  3. import org.testng.IAnnotationTransformer;
  4. import org.testng.IRetryAnalyzer;
  5. import org.testng.annotations.ITestAnnotation;
  6.  
  7. /**
  8. * 添加用例重跑监听器,用例失败自动重跑功能
  9. *
  10. * @author Charlie.chen
  11. *
  12. */
  13.  
  14. public class RetryListener implements IAnnotationTransformer {
  15. public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
  16. IRetryAnalyzer retry = annotation.getRetryAnalyzer();
  17. if (retry == null) {
  18. annotation.setRetryAnalyzer(TestNGRetry.class);
  19. }
  20. }
  21. }

在testng.xml文件中配置自己编写的监听器

  1. <listeners>
  2. <listener class-name="com.dji.utils.RetryListener"/>
  3. </listeners>

查看testng报告时,发现失败的用例在报告里生成了多份,改进办法

需新建一个类TestNGListener继承TestListenerAdapter,然后重写onFinish方法

  1. @Override
  2. public void onFinish(ITestContext testContext) {
  3. log.info("Test Finish");
  4.  
  5. Iterator<ITestResult> listOfFailedTests = testContext.getFailedTests().getAllResults().iterator();
  6. while (listOfFailedTests.hasNext()) {
  7. ITestResult failedTest = listOfFailedTests.next();
  8. ITestNGMethod method = failedTest.getMethod();
  9. if (testContext.getFailedTests().getResults(method).size() > ) {
  10. listOfFailedTests.remove();
  11. } else {
  12. if (testContext.getPassedTests().getResults(method).size() > ) {
  13. listOfFailedTests.remove();
  14. }
  15. }
  16. }
  17.  
  18. }

selenium实现失败重运行的更多相关文章

  1. pytest - 失败重运行机制:rerun

    失败重运行机制 用例失败的情况下,可以重新运行用例 一旦用例失败,马上重新运行 安装插件:pip install pytest-rerunfailures 使用命令:--reruns 重试次数 如 - ...

  2. pytest框架之rerunfailures失败重运行机制

    web自动化测试中,稳定性在整个测试运行中都至关重要,但不能保证测试脚本或者测试环境一直都能够稳定,它牵扯到诸多因素,在这里就不赘述,pytest框架相较于unittest的一大优势就在于拥有用例失败 ...

  3. TestNG监听器实现用例运行失败自动截图、重运行功能

    注: 以下内容引自 http://blog.csdn.net/sunnyyou2011/article/details/45894089 (此非原出处,亦为转载,但博主未注明原出处) 使用Testng ...

  4. python3 unittest框架失败重跑加截图支持python2,python3

    github源码地址下载:https://github.com/GoverSky/HTMLTestRunner_cn.git 解压文件后取出/HTMLTestRunner_cn.py文件丢进C:\Py ...

  5. pytest 失败重跑截图

    1.环境准备 /*@param: 作者:流浪的python Date:2019/01/19 env:python 3.7(由于3.0-3.5以下部分pytest可能有部分兼容问题安装建议2.7-2.9 ...

  6. 【转载】扩展Robot Framework,实现失败用例自动再执行(失败重跑)

    使用自动化脚本进行测试,经常受环境影响等各方面导致本能成功的脚本失败,下面介绍了RFS框架下,失败重跑的方法: 通过改写RobotFramework源代码增加--retry选项,实现test级别的失败 ...

  7. testng增加失败重跑机制

    注: 以下内容引自 http://www.yeetrack.com/?p=1015 testng增加失败重跑机制 Posted on 2014 年 10 月 31 日 使用Testng框架搭建自动测试 ...

  8. pytest文档8-html报告报错截图+失败重跑

    前言 做web自动化的小伙伴应该都希望在html报告中展示失败后的截图,提升报告的档次,pytest-html也可以生成带截图的报告. conftest.py 1.失败截图可以写到conftest.p ...

  9. testng失败重跑

    重跑失败场景 1.要添加两个文件 背景:因为这里只是想单独展示失败的重跑的案例,所以先暂时把app这块的运行注释掉,只跑一个简单的demo,就一个简单类,类中就3个测试方法,失败重跑的原理是,运行方法 ...

随机推荐

  1. linux下对/sys/class/gpio中的gpio的控制 (转)

        在嵌入式设备中对GPIO的操作是最基本的操作.一般的做法是写一个单独驱动程序,网上大多数的例子都是这样的.其实linux下面有一个通用的GPIO操作接口,那就是我要介绍的 “/sys/clas ...

  2. 石子归并的三种打开方式——难度递增———51Node

    1021 石子归并    N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价.计算将N堆石子合并成一堆的最小代价.   ...

  3. Pandas之DataFrame——Part 1

    ''' [课程2.] Pandas数据结构Dataframe:基本概念及创建 "二维数组"Dataframe:是一个表格型的数据结构,包含一组有序的列,其列的值类型可以是数值.字符 ...

  4. 用VS2010编写的C++程序,在其他电脑上无法运行的问题

    问题:在自己电脑上用VS2010编写的VC++程序(使用MFC库),不能在其他电脑上运行.双击提示: “无法启动此程序,因为计算机中丢失mfc100u.dll 尝试重新安装该程序以解决此问题. 解决方 ...

  5. 昨天用到的一个sql查询。可取处,用max

    SELECT T_AssetInfos_ID, MAX(T_AssetConstruct_Name), MAX(T_AssetProperties_Name), SUM(CAST(PropertyVa ...

  6. 搜索水题四连发_C++

    特别声明:以下题目有部分为原创题,涉及版权问题,不得转载,违者追究 法律责任! 话说这是一套神题,只有你想不到,没有你做不到 题目更正后比 Pascal 跑得还快哈~ 一道特别裸,但是特别坑的搜索题 ...

  7. [ CodeVS冲杯之路 ] P1014

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1014/ 一道不用考虑价值的DP题,那么我们可以用 0 和 1 表示是否能够达到该步骤 #include<cstd ...

  8. median(NOIP模拟赛Round 3)

    也是神奇的题目.. 原题传送门 首先看到这道题目,很明显我们需要线性算法 1.前缀和+统计 2.DP+统计 对于第一种算法,我们可以对于任何一个a[i]对b进行比较,如果大于b标上1,等于b标上0,小 ...

  9. 两步完美解决 androud 模拟器太慢的问题

    androud 开发环境默认的 avd 管理器下载并启动的模拟器,运行速度非常慢,有时不可忍受,用下面两步可以解决这个问题: 下载 genymotion-2.3.1 (注意,最好是这个版本,试过2.4 ...

  10. nginx 根据url访问次数限制

    #获取日期 date=`date +"%y%m%d"` #设置日志路径 data="/data/logs/abc.com/access.log" #配置文件路径 ...