iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >TestNG测试用例重跑分析
  • 667
分享到

TestNG测试用例重跑分析

2023-06-04 22:06:47 667人浏览 薄情痞子
摘要

这篇文章主要讲解了“TestNG测试用例重跑分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“TestNG测试用例重跑分析”吧!测试用例运行稳定性是自动化质量的一个重要指标,在运行中需要尽可

这篇文章主要讲解了“TestNG测试用例重跑分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“TestNG测试用例重跑分析”吧!

测试用例运行稳定性是自动化质量的一个重要指标,在运行中需要尽可能的剔除非bug造成的测试用例执行失败,对于失败用例进行重跑是常用策略之一。一种重跑策略是所有用例运行结束后对失败用例重跑,另一种重跑策略是在运行时监控用例运行状态,失败后实时重跑。

下面,详细介绍TestNG如何对失败测试用例实时重跑并解决重跑过程中所遇到问题的实践和解决方案。对失败测试用例进行实时重跑,有以下几个方面需求:

  1. 测试用例运行失败,监听到失败后立即进行重跑

  2. 测试用例通过dependsOnMethods/dependsOnGroups标记依赖其他测试用例,在被依赖的测试用例重跑运行成功后,该测试用例可以继续运行

  3. 对于重跑多次的测试用例,只记录最后一次运行成功或失败结果

第一部分 测试用例重跑

1.1 retryAnalyzer注解方式

对于希望测试用例中的少量易失败,不稳定的测试用例进行重跑,可采用这种方式。 

1.1.1 原理

以下是TestNG处理测试用例运行结果的部分代码。

IRetryAnalyzer retryAnalyzer = testMethod.getRetryAnalyzer();boolean willRetry = retryAnalyzer != null && status == ITestResult.FaiLURE && failure.instances != null && retryAnalyzer.retry(testResult);if (willRetry) {  resultsToRetry.add(testResult);  failure.count++;  failure.instances.add(testResult.getInstance());  testResult.setStatus(ITestResult.SKIP);} else {  testResult.setStatus(status);  if (status == ITestResult.FAILURE && !handled) {    handleException(ite, testMethod, testResult, failure.count++);  }

分析以上代码,其中,接口IretryAnalyzer的方法retry()的返回值作为是否对失败测试用例进行重跑的一个条件。如果retry()结果为true,则该失败测试用例会重跑,同时将本次失败结果修改为Skip;如果结果为false,则失败的测试用例保持失败结果,运行结束。因此,如果你希望失败测试用例重跑的话,需要把IretryAnalyzer的retry()方法重写,插入自己定义的逻辑,设置返回值为true

1.1.2 代码

创建类RetryImpl,重写retry()方法,设置失败测试用例的重跑次数,代码如下,:

public class RetryImpl implements IRetryAnalyzer {    private int count = 1;    private int max_count = 3;   // Failed test cases could be run 3 times at most    @Override    public boolean retry(ITestResult result) {        System.out.println("Test case :"+result.getName()+",retry time: "+count+"");        if (count < max_count) {            count++;            return true;        }        return false;    }}

1.1.3 实例

public class TestNGReRunDemo {    @Test(retryAnalyzer=RetryImpl.class)        public void test01(){        Assert.assertEquals("success","fail");        System.out.println("test01");    }}

以上测试用例test01可重复运行3次。

1.2 实现接口IAnnotationTransfORMer方法

如果希望所有失败的测试用例都进行重跑,采用retryAnalyzer注解方式对每个测试用例进行注解就比较麻烦。通过实现IAnnotationTransformer接口的方式,可以对全量测试用例的重试类进行设置。 该接口是一个监听器接口,用来修改TestNG注解。IAnnotationTransformer监听器接口只有一个方法:transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod). 上文中,我们自定义了类RetryImpl 实现接口IRetryAnalyzer。TestNG通过transfrom()方法修改retryAnalyzer注解。以下代码对retryAnalyzer注解进行修改设置。

1.2.1代码

创建类RetryListener,代码如下。

public class RetryListener implements IAnnotationTransformer {    public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {        IRetryAnalyzer retry = annotation.getRetryAnalyzer();        if (retry == null) {            annotation.setRetryAnalyzer(RetryImpl.class);          }    }}

1.2.2 配置Listener

TestNG可以在配置文件或者测试类中对Listener类进行配置。

  • 方法一:在TestNG的配置XML中进行以下配置

<listeners>    <listener class-name="PackageName.RetryListener"></listener></listeners>
  • 方法二在测试类中通过@Listeners配置

@Listeners({RetryListener.class})   public class TestNGReRunDemo {    @Test    public void test01(){        Assert.assertEquals("success","fail");        System.out.println("test01");    }}

配置完成后,运行测试用例test01,运行结果显示test01将重跑次数3次。

第二部分 被依赖的测试用例重跑结果处理

进一步分析TestNG的运行代码,其在对失败运行用例重跑时,逻辑如下图。TestNG测试用例重跑分析对于通过dependsOnMethods 或dependsOnGroups注解依赖于其他测试用例的测试用例来讲,测试用例执行分为两种情况:

  • alwaysRun=true,则无论所依赖的测试用例执行情况如何,该测试用例都会执行,即所依赖的测试用例重跑不会影响该测试用例的执行。

  • alwaysRun=false,或者保持缺省值(false),依赖于其他测试用例或测试用例组的测试结果,在运行时TestNG获取所依赖的测试用例的运行结果,检查依赖的测试用例是否全部执行成功,如果不全部成功,则把该测试用例结果设置为Skipped。

2.1 场景分析:场景一

被依赖的测试用例失败后进行了重跑,并重跑成功。(注:在RetryImpl类中,已设置最大重跑次数max_count = 3

public static int number =0;@Testpublic void test01(){number++;System.out.println(String.valueOf(number));Assert.assertEquals(number,2);    System.out.println("test01");}@Test(dependsOnMethods = "test01")    // alwaysRun = false by defaultpublic void test02(){    System.out.println("test02 is running only if test01 is passed.");}
1、TestNG测试报告

TestNG测试用例重跑分析

2、问题
测试用例运行次数运行情况测试报告
Test012第一次:skipped ; 第二次:passed在Skipped 和Passed的统计数量中,test01被分别记录一次
Test020Skipped记录一次Skipped
  • 测试报告:test01运行结果全部被记录,而用例重跑,只希望记录最后的结果。

  • 运行情况:测试用例test02依赖于测试用例test01运行结果,在test01重跑成功后,测试用例test02没有执行,不符合需求预期。

2.2 场景分析:场景二

被依赖的测试用例失败后进行了重跑,并且重跑没有成功。(注:在RetryImpl类中,已设置最大重跑次数max_count = 3)

public static int number =0;@Testpublic void test01(){number++;System.out.println(String.valueOf(number));Assert.assertEquals(number,10);         System.out.println("test01");}@Test(dependsOnMethods = "test01")    // alwaysRun = false by defaultpublic void test02(){    System.out.println("test02 is running only if test01 is passed.");}
1、TestNG测试报告

TestNG测试用例重跑分析

2、问题
测试用例运行次数运行结果测试报告
Test013第一次:skipped;第二次:skipped;第三次:failed在Skipped统计数量中,test01被被记录两次在failed统计中,test01被记录一次
Test020Skipped记录一次Skipped
  • 运行情况:测试用例test02依赖于测试用例test01运行结果,在test01重跑失败后,测试用例test02没有执行,这种情况符合需求预期。

  • 测试报告:同场景一,test01重跑失败,运行结果全部被记录,而用例重跑,只希望记录最后的结果。

第三部分 优化解决方案

以下方案解决重跑测试用例成功后后继测试用例无法继续运行的问题,并对测试报告进行优化。

3.1 TestListenerAdapter方法重写

根据上面分析的TestNG逻辑,在对依赖测试用例的结果进行检查时,如果忽略重跑的中间结果只检查最后一次的运行结果,可以达到需求的目的。对于测试报告,同样的处理方式,忽略所有中间的测试用例运行结果,只记录最后结果。 测试用例的中间运行结果为Skipped,下面的代码通过重写TestListenerAdapteronTestSuccess()onTestFailure()方法,对测试用例的中间结果skipped进行了删除。代码如下:

public class ResultListener extends TestListenerAdapter {    @Override    public void onTestFailure(ITestResult tr) {        if(tr.getMethod().getCurrentInvocationCount()==1)        {            super.onTestFailure(tr);            return;        }        processSkipResult(tr);        super.onTestFailure(tr);    }    @Override    public void onTestSuccess(ITestResult tr) {       if(tr.getMethod().getCurrentInvocationCount()==1)        {            super.onTestSuccess(tr);            return;        }        processSkipResult(tr);        super.onTestSuccess(tr);    }   // Remove all the dup Skipped results    public void processSkipResult(ITestResult tr)    {        ITestContext iTestContext = tr.getTestContext();        Iterator<ITestResult> processResults = iTestContext.getSkippedTests().getAllResults().iterator();        while (processResults.hasNext()) {            ITestResult skippedTest = (ITestResult) processResults.next();            if (skippedTest.getMethod().getMethodName().equalsIgnoreCase(tr.getMethod().getMethodName()) ) {                processResults.remove();            }        }    }}

3.2 配置结果处理Listener类

在配置文件进行全局设置或者在测试类中标记。

  • 方法一:在TestNG的配置XML中进行以下配置

<listeners>    <listener class-name="PackageName.ResultListener"></listener></listeners>
  • 方法二:在测试类中通过@Listeners配置

@Listeners({ResultListener.class})   public class TestNGReRunDemo {    @Test    public void test01(){        Assert.assertEquals("success","fail");        System.out.println("test01");    }}

3.3 场景一

1、 结果验证

TestNG测试用例重跑分析

2、结果分析:
测试用例运行次数运行结果测试报告
Test012第一次:skipped;第二次:passed只在Passed的统计数量中test01被记录一次
Test021Passed记录一次passed

3.4 场景二

1、结果验证

TestNG测试用例重跑分析

2、结果分析:
测试用例运行次数运行结果测试报告
Test013第一次:skipped;第二次:skipped;第三次:failedtest01只在failed统计中被记录一次
Test021Skipped依赖用例执行失败,test02结果为Skipped,只记录一次结果Skipped

感谢各位的阅读,以上就是“TestNG测试用例重跑分析”的内容了,经过本文的学习后,相信大家对TestNG测试用例重跑分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: TestNG测试用例重跑分析

本文链接: https://www.lsjlt.com/news/240093.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • TestNG测试用例重跑分析
    这篇文章主要讲解了“TestNG测试用例重跑分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“TestNG测试用例重跑分析”吧!测试用例运行稳定性是自动化质量的一个重要指标,在运行中需要尽可...
    99+
    2023-06-04
  • 网站测试重要性的示例分析
    这篇文章将为大家详细讲解有关网站测试重要性的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。网站不稳定的情况我们在浏览网站时,在浏览的过程中,有时会出现错误代码提示,或许是连接不上,或者是找不到所要...
    99+
    2023-06-10
  • TiDB实例测试分析
    本文小编为大家详细介绍“TiDB实例测试分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“TiDB实例测试分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 ...
    99+
    2024-04-02
  • Stream性能测试实例分析
    本篇内容主要讲解“Stream性能测试实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Stream性能测试实例分析”吧!目录一、反馈问&#xff1a;stream比for循环慢5倍...
    99+
    2023-06-29
  • vue单元测试的示例分析
    小编给大家分享一下vue单元测试的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!为什么要引进单元测试?现今时代,各种编程语言,开发框架,集成工具蓬勃发展,然而软件工程师们却仍然挣扎在第一线,被bug、遗留代码、技术...
    99+
    2023-06-14
  • SpringCloud-Spring Boot Starter使用测试实例分析
    这篇文章主要介绍了SpringCloud-Spring Boot Starter使用测试实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringCloud-Spring ...
    99+
    2023-07-02
  • 测试VS2010代码的示例分析
    这篇文章主要介绍测试VS2010代码的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!VS 2008中的代码智能提示为帮助示范这个VS 2010代码中的智能提示的改进,让我们先来在VS 2008中做一个简单的例...
    99+
    2023-06-17
  • Go语言单元测试与性能测试示例分析
    这篇文章主要讲解了“Go语言单元测试与性能测试示例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言单元测试与性能测试示例分析”吧!概述测试不是Go语言独有的,其实在很多语言都有测试...
    99+
    2023-06-25
  • Sysbench基准测试的示例分析
    这篇文章给大家分享的是有关Sysbench基准测试的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 Sysbench和TPCC-MySQL一样...
    99+
    2024-04-02
  • Java微服务应用测试的示例分析
    小编给大家分享一下Java微服务应用测试的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! package com.jeanron.licensesservice.domain; public class Licen...
    99+
    2023-06-04
  • laravel9和laravels性能测试实例分析
    这篇文章主要介绍“laravel9和laravels性能测试实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“laravel9和laravels性能测试实例分析”文章能帮助大家解决问题。配置 l...
    99+
    2023-07-04
  • Angular中单元测试的示例分析
    这篇文章给大家分享的是有关Angular中单元测试的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。第一个测试用例当创建Angular应用后,在package.json文件...
    99+
    2024-04-02
  • java内部测试类的示例分析
    这篇文章将为大家详细讲解有关java内部测试类的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。我们一般使用的java内部类有4种形式:一般内部类、局部内部类、匿名内部类、静态内部类。以下是我作的一...
    99+
    2023-05-30
    java
  • selenium自动化测试的示例分析
    本篇文章为大家展示了selenium自动化测试的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。下载驱动器http://chromedriver.storage.googleapis.com/...
    99+
    2023-06-26
  • Web性能测试实例设计分析
    本篇内容介绍了“Web性能测试实例设计分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先,为什么要进行性能测试?性能不佳的应用通常无法实...
    99+
    2023-06-05
  • Go语言单元测试和基准测试实例代码分析
    本篇内容主要讲解“Go语言单元测试和基准测试实例代码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言单元测试和基准测试实例代码分析”吧!背景测试的出现是为了避免项目中出现重大事故测试是...
    99+
    2023-07-05
  • 如何测试测试用例?
    编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天编程网就整理分享《如何测试测试用例?》,文章讲解的...
    99+
    2024-04-05
  • TestNG如何通过自定义Listener形式实现用例失败重试
    TestNG如何通过自定义Listener形式实现用例失败重试,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。标签形式实现用例失败重试前面的...
    99+
    2024-04-02
  • Vue组件单元测试的示例分析
    这篇文章将为大家详细讲解有关Vue组件单元测试的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。关于 Vue 组件单元测试最常见的问题就是“我究竟应该测试什么?”虽...
    99+
    2024-04-02
  • HTML元素属性测试的示例分析
    这篇文章给大家分享的是有关HTML元素属性测试的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。code 元素的含义(语义)为“代码内容”,FireFox 在渲染该元素时,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作