本文转载自孔庆云kevin《TestNG监听器实现失败自动截图、重跑、自定义html结果文件功能》

使用Testng框架搭建自动测试框架,经常会需要增加失败自动截图,以及失败重跑功能,下面介绍一下不修改Testng的源码,通过监听器的方式来实现自动截图、重跑、自定义Html结果文件功能。

自动截图功能
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
    public void 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 void takeScreenShot(ITestResult tr) {        SimpleDateFormat formatter = new SimpleDateFormat("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 {    private static Logger logger = Logger.getLogger(TestngRetry.class);
    private int retryCount = 1;
    private static int maxRetryCount;
    private static ConfigReader config;
    static {                //外围文件配置最大运行次数
        config = new ConfigReader(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、具体的测试类中添加失败重跑监听

@Test(description = "***", retryAnalyzer = TestngRetry.class)

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

首先解决TestNg生成的index.html文件中个数不对的问题,这个问题只需要在Testng监听器的onFinish方法中,等所有用例运行完之后,检查用例,按照class+method+dataprodiver的名称生成hashcode获取唯一id,如果fail的用例中存在重复的则在fail的用例中剔除掉,具体代码如下:

@Override
    public void onFinish(ITestContext testContext) {        super.onFinish(testContext);        // List of test results which we will delete later
        ArrayList<ITestResult> testsToBeRemoved = new ArrayList<ITestResult>();
        // collect all id's from passed test
        Set<Integer> passedTestIds = new HashSet<Integer>();
        for (ITestResult passedTest : testContext.getPassedTests().getAllResults()) {            logger.info("PassedTests = " + passedTest.getName());
            passedTestIds.add(getId(passedTest));
        }       Set<Integer> failedTestIds = new HashSet<Integer>();
        for (ITestResult failedTest : testContext.getFailedTests().getAllResults()) {            logger.info("failedTest = " + failedTest.getName());
            // id = class + method + dataprovider
            int failedTestId = getId(failedTest);          // if we saw this test as a failed test before we mark as to be deleted
            // or delete this failed test if there is at least one passed version
            if (failedTestIds.contains(failedTestId) || passedTestIds.contains(failedTestId)) {                testsToBeRemoved.add(failedTest);
            } else {                failedTestIds.add(failedTestId);
            }
        }       // finally delete all tests that are marked
        for (Iterator<ITestResult> iterator = testContext.getFailedTests().getAllResults().iterator(); iterator.hasNext();) {            ITestResult testResult = iterator.next();
            if (testsToBeRemoved.contains(testResult)) {                logger.info("Remove repeat Fail Test: " + testResult.getName());
                iterator.remove();
            }
        }   }   private int getId(ITestResult result) {        int id = result.getTestClass().getName().hashCode();
        id = id + result.getMethod().getMethodName().hashCode();
        id = id + (result.getParameters() != null ? Arrays.hashCode(result.getParameters()) : 0);
        return id;
    }

当前失败重跑也存在一些小问题:
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.java
2、针对源代码进行自己修改
3、在build.xml文件中关闭使用默认的监听器

 useDefaultListeners="false"
<testng outputDir="test-output" classpathref="http://kongqingyun123.blog.163.com/blog/runpath" haltonfailure="false" useDefaultListeners="false" >
 <xmlfileset dir="." includes="${testngxml}.xml" />
</testng>

4、在testng.xml文件中添加自己重写的监听器路径

TestNG监听器实现失败自动截图、重跑、自定义html结果文件功能相关推荐

  1. 局域网通讯工具_自动称重带无线通讯WIFI传输功能设备

    自动称重带无线通讯WIFI传输功能设备详情内容/ Content details 支持: 远程数据库功能,支持OPCUA协议,能实时上传各种称重信息:通过SQLServer等实现称重数据与记录的上传到 ...

  2. 【Katalon Studio】失败用例重跑

    文章目录 1开启retry 1.1 命令模式启动-python 1.2 界面开启 2 创建监听 1开启retry 1.1 命令模式启动-python python中运行命令,retry次数为2 重点看 ...

  3. 失败用例重跑机制-python装饰器

    def failrun(n=3):def decorator(func):def wrapper(*args,**kw):for i in range(n):try:r= func(*args,**k ...

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

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

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

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

  6. 如何解决testng执行用例失败自动重跑问题

    如何解决testng执行用例失败自动重跑问题 参考文章: (1)如何解决testng执行用例失败自动重跑问题 (2)https://www.cnblogs.com/cheese320/p/847864 ...

  7. TestNG测试框架之失败测试重跑

    前言 在案例执行过程中,往往需要对失败的案例进行重跑,TestNG亦提供相应的实现方案. 示例 当套件中的测试执行失败时,TestNG都会创建一个名为testng-failed.xml的文件,该XML ...

  8. testng重跑和框架亮点

    testng重跑设置: tr.setAttribute("RETRY", new Integer(count)); //次数 第一种重跑方式:实现retry listener Te ...

  9. selenium+python自动化81-html报告优化(饼图+失败重跑+兼容python23)

    优化html报告 为了满足小伙伴的各种变态需求,为了装逼提升逼格,为了让报告更加高大上,测试报告做了以下优化: 测试报告中文显示,优化一些断言失败正文乱码问题 新增错误和失败截图,展示到html报告里 ...

最新文章

  1. Input.GetTouch 获取触摸
  2. 清华大学孙茂松:自然语言处理一瞥,知往鉴今瞻未来
  3. iOS-APP提交上架流程(新手必看!2016年3月1日最新版)
  4. mysql error 1594_MySQL 1594 异常解决办法
  5. Tempter of the Bone(DFS + 奇偶剪枝,好题)
  6. 如果用编程语言参加战争,哪门语言才是程序员的最强武器?
  7. 小工匠聊架构-超高并发秒杀系统设计 04_流量削峰设计
  8. java实现int类型数组元素拷贝
  9. 什么是模拟量光端机?模拟光端机品牌有哪些?
  10. ip地址合不合法怎么看_到底醇基燃料合不合法呢?
  11. 计组之数据运算:4、移位运算
  12. matlab基础视频教程解压密码,价值上千元的MATLAB基础视频教程附源码请收下!
  13. 普林斯顿微积分读本篇十一:最优化和线性化
  14. 2.1 matlab特殊矩阵(零矩阵、幺矩阵、单位矩阵、魔方矩阵、范德蒙德矩阵和希尔伯特矩阵)
  15. MOSFET与三极管
  16. 单月营业额一个亿,任泉李冰冰黄晓明追着投钱!这家企业是谁
  17. string的查找字符串操作
  18. 我“胡汉三”又回来了。
  19. 好玩的小游戏网站推荐
  20. STM32CUBEMX开发GD32F303(12)----输出PWM及修改PWM频率与占空比

热门文章

  1. 英语KOREITE寿山石koreite单词
  2. Linux能ping通IP,ping不通域名
  3. CGLib中类Enhancer介绍
  4. 身份证照片获取个人信息与银行卡4要素验证
  5. PS学习-风光照片综合处理(二)--湛蓝雪山
  6. python文件函数_Python之文件操作及常用函数
  7. 最新版IDEA设置打开IDEA弹出新窗体
  8. dialog dismiss时键盘不消失的问题。
  9. 最大流——最大传输量
  10. 【大疆无人机OnboardSDK(三)妙算ssh远程控制台系统搭建】