注: 以下内容引自 http://www.yeetrack.com/?p=1015

testng增加失败重跑机制

使用Testng框架搭建自动测试框架,经常会需要增加失败自动截图,以及失败重跑功能,一般有两种方式,①修改testng的源码;②使用testng的listener。修改testng源码的方式不推荐;第二种方法,网易qa的一片文章介绍的比较全了,直接转过来,http://qa.blog.163.com/blog/static/19014700220138585422735/,不过解决失败重跑的case计入总case数的问题,代码写得较繁琐,修改了下。

自动截图功能

1、新建一个Java类继承TestListenerAdapter

2、重写onTestFailure、onTestSkipped等方法,在这些方法中加入截图操作

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

<listeners> <listener class-name=“***.testng.TestngListener” /> </listeners>

public class TestngListener extends TestListenerAdapter { private static Logger logger =Logger.getLogger(TestngListener.class); public static final String CONFIG = “config.properties”;@Override public void onTestFailure(ITestResult tr) { super.onTestFailure(tr); logger.info(tr.getName() +” Failure”); takeScreenShot(tr); } @Override public void onTestSkipped(ITestResult tr) {super.onTestSkipped(tr); logger.info(tr.getName() + ” Skipped”); takeScreenShot(tr); } @Override publicvoid onTestSuccess(ITestResult tr) { super.onTestSuccess(tr); logger.info(tr.getName() + ” Success”); }@Override public void onTestStart(ITestResult tr) { super.onTestStart(tr); logger.info(tr.getName() + ” Start”); } @Override public void onFinish(ITestContext testContext) { super.onFinish(testContext); } /** * 自动截图,保存图片到本地以及html结果文件中 * * @param tr */ private voidtakeScreenShot(ITestResult tr) { SimpleDateFormat formatter = newSimpleDateFormat(“yyyy_MM_dd_HH_mm_ss”); String mDateTime = formatter.format(new Date());String fileName = mDateTime + “_” + tr.getName(); String filePath =OrangeiOS.driver.getScreenshotAs(fileName); Reporter.setCurrentTestResult(tr);Reporter.log(filePath); //这里实现把图片链接直接输出到结果文件中,通过邮件发送结果则可以直接显示图片 Reporter.log(“<img src=\”../” + filePath + “\”/>”); }

失败自动重跑功能

1、新建Java类实现IRetryAnalyzer接口 public class TestngRetry implements IRetryAnalyzer { privatestatic Logger logger = Logger.getLogger(TestngRetry.class); private int retryCount = 1; private static intmaxRetryCount; private static ConfigReader config; static { //外围文件配置最大运行次数 config = newConfigReader(TestngListener.CONFIG); maxRetryCount = config.getMaxRunCount();logger.info(“maxRunCount=” + (maxRetryCount)); } @Override public boolean retry(ITestResult result) {if (retryCount <= maxRetryCount) { String message = “running retry for ‘” + result.getName() + “‘ on class “ + this.getClass().getName() + ” Retrying “ + retryCount + ” times”; logger.info(message);Reporter.setCurrentTestResult(result); Reporter.log(“RunCount=” + (retryCount + 1)); retryCount++;return true; } return false; } }

2、新建Java类实现IAnnotationTransformer接口 public class RetryListener implementsIAnnotationTransformer { @Override public void transform(ITestAnnotation annotation, Class testClass,Constructor testConstructor, Method testMethod) { IRetryAnalyzer retry =annotation.getRetryAnalyzer(); if (retry == null) { annotation.setRetryAnalyzer(TestngRetry.class); } } }

3、在build.xml或者testng.xml文件中添加RetryListener监听器 上面三步就可以实现失败自动重跑了,是不是比较方便,不过添加了重跑功能后会发现测试结果的邮件中用例的个数增加了,比如我只有一个用例,失败重跑了2次,一共运行3次,测试结果中显示的用例个数会是3个,那接下来就需要解决这个问题了。

首先解决TestNg生成的index.html文件中个数不对的问题,这个问题只需要在Testng监听器的onFinish方法中,等所有用例运行完之 后,检查用例,按照class+method+dataprodiver的名称生成hashcode获取唯一id,如果fail的用例中存在重复的则在 fail的用例中剔除掉,具体代码如下:这个网易qa的那篇文章写得比较繁琐,参考另一篇 http://martinholladay.wordpress.com/2013/11/16/testng-adjusting-test-counts-on-retry/ @Override public void onFinish(ITestContext iTestContext) { Iterator<ITestResult> listOfFailedTests = iTestContext.getFailedTests().getAllResults().iterator(); while (listOfFailedTests.hasNext()) { ITestResult failedTest = listOfFailedTests.next(); ITestNGMethod method = failedTest.getMethod(); if (iTestContext.getFailedTests().getResults(method).size() > 1) { listOfFailedTests.remove(); } else { if (iTestContext.getPassedTests().getResults(method).size() > 0) { listOfFailedTests.remove(); } } } }

在testng的xml中加入

<listener class-name="com.autonavi.traffic.test.TestngListener" />

当前失败重跑也存在一些小问题:

1、setup中出现的错误直接是skip的,不会重跑

2、如果存在dataprodiver,则第二组数据以后的用例是不会重跑的

3、testng自带生成的emailable-report.html文件中用例的个数也不对了,这个问题可以自行修改EmailableReporter.java文件

如何修改自定义emailable-report.html emailable-report.html是Testng运行完成后自动生成的,经常运行结束后我们会把这个文件作为邮件正文发送给收件人,如果我们要修改这个文件内容怎么办呢?

1、首先emailable-report.html文件的生成TestNG是实现了IReporter接口,那我们可以直接从源代码中取出这个文件源代码 https://github.com/cbeust/testng/blob/master/src/main/java/org/testng/reporters/EmailableReporter.java2、针对源代码进行自己修改

3、把修改后的源代码加入自己的工程

4、在build.xml文件中新增自定义的监听器,运行时就会调用自定义的监听器生成想要的html文件了 <testng outputDir=“test-output” classpathref=“http://qa.blog.163.com/blog/runpath” haltonfailure=“false”listeners=“com.****.CustomerEmailableReport” > <xmlfileset dir=“.” includes=“${testngxml}.xml” /></testng>

testng增加失败重跑机制的更多相关文章

  1. TestNg失败重跑—解决使用 dataProvider 参数化用例次数冲突问题

    问题背景 在使用 testng 执行 UI 自动化用例时,由于 UI自动化的不稳定性,我们在测试的时候,往往会加上失败重跑机制.在不使用 @DataProvider 提供用例参数化时,是不会有什么问题 ...

  2. testNG-失败用例重跑机制

    下面简单介绍下testNG的失败重跑的实现方法: 1.首先编写一个类,实现IRetryAnalyzer类,重写其中的retry方法. public class TestNGRetry implemen ...

  3. pytest失败重跑

    一.说明 平常在做功能测试的时候,经常会遇到某个模块不稳定,偶然会出现一些bug,对于这种问题我们会针对此用例反复执行多次,最终复现出问题来.自动化运行用例时候,也会出现偶然的bug,可以针对单个用例 ...

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

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

  5. testng失败重跑

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

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

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

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

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

  8. RF实现多次失败重跑结果合并的基础方法和优化方法

    实现思路:通过分次执行失败案例重跑,然后通过结果文件合并命令实现多次失败重跑结果文件的合并,并输出合并后的log和report文件: 说明:具体失败案例重跑命令和结果文件合并命令请参考本博客其他相关章 ...

  9. pytest 失败重跑截图

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

随机推荐

  1. obj-c编程10:Foundation库中类的使用(3)[文件管理]

    好吧,不管神马系统都无可避免的要说到文件,目录,路径(PATH)管理的内容,下面我们来看看在F库中对他们的支持.我简单看了下,不谈其他光从方法命名来说就多少显得有点复杂,如果和ruby相比就呵呵了. ...

  2. win32多线程学习笔记

    <多核程序设计技术> 第五章--线程api,一个使用windows事件的线程应用程序,vs2008下编译调试通过. // 线程通信机制.cpp : 定义控制台应用程序的入口点. // #i ...

  3. 关于gcc的一点小人性化提示

    现在对于大多数平台的C编译器来说都会有很多种选择,而gcc和clang无疑是2个非常优秀的C编译器.当然他们也不只是C编译器.我最近用clang的比较多,原因有很多.不过一些小的细节很让我喜欢,比如O ...

  4. javascript 调试 & console.table()

    通过console.table()打印数组.对象 一般我们都是通过console.log()打印数组或对象,但console.table()打印数组.对象更直观: console.table(empi ...

  5. mongodb3.6 (四)net 客户端如何连接、访问mongodb集群

    前言 在是一篇文章mongodb如何做数据备灾 中已经介绍mongodb集群是如何工作,可能很多人都有这样一个疑问:客户端如何知道主服务挂了呢?这一篇文章将介绍如何在net中访问这个集群. 第一步.安 ...

  6. left join 原理分析

    left join 原理分析 [转贴 2006-11-15 16:19:50]     字号:大 中 小 案例分析 user表:  id   | name --------- 1   | libk   ...

  7. 一步一步设置Joomla!开发环境

    转载自:http://h2appy.blog.51cto.com/609721/373414 虽然是英文,可是写的非常浅显易懂,再配合截图,更是明了. http://docs.joomla.org/S ...

  8. 关于Spring的HibernateTemplate的findByExample方法使用时的一点注意。

    此前我们已经介绍了HibernateTemplate的使用配置方法,但是对其使用没有仔细说明.因为最近比较忙,我先不去介绍,而是重点说明一下容易引起问题的findByExample方法. 我尝试反编译 ...

  9. 使用pypi-server搭建简单的PyPI源

    pypiserver 是一个最基本的PyPI服务器实现, 可以用来上传和维护python包. 本文介绍 pypiserver 在ubuntu上的基本安装, 配置和使用. 1. 基本安装和使用 1.1 ...

  10. NoHttp封装--03 缓存

    1.Default模式,也是没有设置缓存模式时的默认模式 这个模式实现http协议中的内容,比如响应码是304时,当然还会结合E-Tag和LastModify等头. StringRequest req ...