​在运行测试用例时,有时候希望本次运行结束后自动运行失败的测试用例,以排除结果由于网络或其他连接原因导致的偶发抖动。通过参考查阅资料,有以下几种方法可以达到目的:

***1、maven的surefire 插件,有rerun功能

参考官方文档:http://maven.apache.org/components/surefire/maven-surefire-plugin/examples/rerun-failing-tests.html

***2、junit自定义注解,针对单个case做重试

参考:http://stackoverflow.com/questions/8295100/how-to-re-run-failed-junit-tests-immediately

***3、junit添加testRule规则,针对单个case做重试

***4、junit多线程,扫描测试日志,查找失败的case,记录到Map文件,运行失败的测试用例后将日志写回到原日志中

参考:http://blog.csdn.net/neven7/article/details/43529569

由于项目需要,本篇文章主要介绍第一种方法!

一、maven surefire plugin

1、我这里用的是Version: 2.18.1,该版本支持Re-run Failing Tests,要求Junit 4.X版本

运行命令如下,rerunFailingTestsCount为重试tests次数,设为0或小于0时,参数会被忽略

mvn -Dsurefire.rerunFailingTestsCount=2 test

2、控制台输出结果:

1)如果测试在第一次就成功,则rerun设置将被忽略

3)如果测试在某次rerun成功,则停止rerun,并在最后一次rerun输出PASS, 如:

  Run 1: ...Run 2: PASSTests run: 2, Failures: 0, Errors: 0, Skipped: 0, Flakes: 1  ------ Flakes表示有一次rerun

2)如果测试重试count次后仍失败,则结果没有Flake字段,且结果为:

  Run 1: ...Run 2: ...Run 3: ...

2、.xml测试报告结果:

1)Rerun后通过

‍<testcase name=".." classname=".." time="0.1">

  <flakyFailure message="" type=""> flaky failure stack trace<system-out> flaky failure </system-out></flakyFailure><system-out> success </system-out>
</testcase>

2)Rerun后仍未通过

<testcase name=".." classname=".." time="0.1">

  <failure message="" type=""> first failure stack trace </failure><system-out> first failure </system-out><rerunFailure message="" type=""> rerun failure stack trace<system-out> rerun failure </system-out></rerunFailure>
</testcase>

二、一段简单的代码示例:

‍@Test    public void unRerunTest() {
        System.out.println("这是不需要重试机制测试case");
    @Testpublic void unRerunTest() {System.out.println("这是不需要重试机制测试case");boolean bool = false;Assert.assertFalse("应该为false", bool);}@Testpublic void rerunTest1() {boolean first = false;long time = System.currentTimeMillis();System.out.println("这是第一个需要重试机制测试case,time:" + time + ", first=" + first);Assert.assertTrue("first应该为true", first);}@Testpublic void rerunTest2() {boolean first = true;long time = System.currentTimeMillis();System.out.println("这是第二个需要重试机制测试case,time:" + time + ", first=" + first);Assert.assertFalse("first应该为false", first);}
pom.xml配置:  <build>  <plugins>  <plugin>    <groupId>org.apache.maven.plugins</groupId>    <artifactId>maven-surefire-plugin</artifactId>    <version>2.18.1</version>    <dependencies>      <dependency>        <groupId>org.apache.maven.surefire</groupId>        <artifactId>surefire-junit47</artifactId>        <version>2.18.1</version>      </dependency>    </dependencies>  </plugin></plugins> </build>

1、控制台输出结果:

这是不需要重试机制测试case这是第一个需要重试机制测试case,time:1433940475436, first=false这是第二个需要重试机制测试case,time:1433940475439, first=trueTests run: 3, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec <<< FAILURE! - in com.xiaomi.testteam.rerun_test.MavenRerunTestrerunTest1(com.xiaomi.testteam.rerun_test.MavenRerunTest)  Time elapsed: 0 sec  <<< FAILURE!java.lang.AssertionError: first应该为true   at org.junit.Assert.fail(Assert.java:88) at org.junit.Assert.assertTrue(Assert.java:41)   at com.xiaomi.testteam.rerun_test.MavenRerunTest.rerunTest1(MavenRerunTest.java:30)

rerunTest2(com.xiaomi.testteam.rerun_test.MavenRerunTest)  Time elapsed: 0.001 sec  <<< FAILURE!java.lang.AssertionError: first应该为false   at org.junit.Assert.fail(Assert.java:88) at org.junit.Assert.assertTrue(Assert.java:41)   at org.junit.Assert.assertFalse(Assert.java:64)  at com.xiaomi.testteam.rerun_test.MavenRerunTest.rerunTest2(MavenRerunTest.java:42)

这是第一个需要重试机制测试case,time:1433940475443, first=false这是第二个需要重试机制测试case,time:1433940475444, first=trueTests run: 2, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 0.014 sec <<< FAILURE! - in com.xiaomi.testteam.rerun_test.MavenRerunTest

rerunTest1(com.xiaomi.testteam.rerun_test.MavenRerunTest)  Time elapsed: 0 sec  <<< FAILURE!java.lang.AssertionError: first应该为true    at org.junit.Assert.fail(Assert.java:88) at org.junit.Assert.assertTrue(Assert.java:41)   at com.xiaomi.testteam.rerun_test.MavenRerunTest.rerunTest1(MavenRerunTest.java:30)

rerunTest2(com.xiaomi.testteam.rerun_test.MavenRerunTest)  Time elapsed: 0 sec  <<< FAILURE!java.lang.AssertionError: first应该为false   at org.junit.Assert.fail(Assert.java:88) at org.junit.Assert.assertTrue(Assert.java:41)   at org.junit.Assert.assertFalse(Assert.java:64)  at com.xiaomi.testteam.rerun_test.MavenRerunTest.rerunTest2(MavenRerunTest.java:42)Results :
Failed tests: com.xiaomi.testteam.rerun_test.MavenRerunTest.rerunTest1(com.xiaomi.testteam.rerun_test.MavenRerunTest)  Run 1: MavenRerunTest.rerunTest1:30 first应该为true  Run 2: MavenRerunTest.rerunTest1:30 first应该为true

com.xiaomi.testteam.rerun_test.MavenRerunTest.rerunTest2(com.xiaomi.testteam.rerun_test.MavenRerunTest)  Run 1: MavenRerunTest.rerunTest2:42 first应该为false  Run 2: MavenRerunTest.rerunTest2:42 first应该为false

Tests run: 3, Failures: 2, Errors: 0, Skipped: 0

可以看出,测试是在运行整个suite第一次结束之后,检查fail的测试用例并再次运行,直到count次重试之后,测试Case依旧fail,则打印所有重试的结果!

如果把test增加时间设置,结果则变成:

  @Testpublic void rerunTest1() {boolean first = false;long time = System.currentTimeMillis();if (time % 2 == 0) {// 用于测试在count内rerun通过,打印结果对比first = true;}System.out.println("这是第一个需要重试机制测试case,time:" + time + ", first=" + first);Assert.assertTrue("first应该为true", first);}@Testpublic void rerunTest2() {boolean first = true;long time = System.currentTimeMillis();if (time % 2 == 0) {first = false;}System.out.println("这是第二个需要重试机制测试case,time:" + time + ", first=" + first);Assert.assertFalse("first应该为false", first);}
这是第一个需要重试机制测试case,time:1433928323102, first=true这是第二个需要重试机制测试case,time:1433928323103, first=trueTests run: 3, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec <<< FAILURE! - in com.xiaomi.testteam.rerun_test.MavenRerunTestrerunTest2(com.xiaomi.testteam.rerun_test.MavenRerunTest)  Time elapsed: 0 sec  <<< FAILURE!java.lang.AssertionError: first应该为false at org.junit.Assert.fail(Assert.java:88) at org.junit.Assert.assertTrue(Assert.java:41)   at org.junit.Assert.assertFalse(Assert.java:64)  at com.xiaomi.testteam.rerun_test.MavenRerunTest.rerunTest2(MavenRerunTest.java:41)

这是第二个需要重试机制测试case,time:1433928323109, first=trueTests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.01 sec <<< FAILURE! - in com.xiaomi.testteam.rerun_test.MavenRerunTestrerunTest2(com.xiaomi.testteam.rerun_test.MavenRerunTest)  Time elapsed: 0 sec  <<< FAILURE!java.lang.AssertionError: first应该为false   at org.junit.Assert.fail(Assert.java:88) at org.junit.Assert.assertTrue(Assert.java:41)   at org.junit.Assert.assertFalse(Assert.java:64)  at com.xiaomi.testteam.rerun_test.MavenRerunTest.rerunTest2(MavenRerunTest.java:41)

这是第二个需要重试机制测试case,time:1433928323112, first=falseTests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.017 sec - in com.xiaomi.testteam.rerun_test.MavenRerunTest

Results :Flaked tests: com.xiaomi.testteam.rerun_test.MavenRerunTest.rerunTest2(com.xiaomi.testteam.rerun_test.MavenRerunTest)  Run 1: MavenRerunTest.rerunTest2:41 first应该为false  Run 2: MavenRerunTest.rerunTest2:41 first应该为false  Run 3: PASS

maven失败测试用例rerun插件使用方法相关推荐

  1. go插件 vscode 报错_MacOS中 VSCode 安装 GO 插件失败问题的快速解决方法

    问题重现 Installing golang.org/x/tools/cmd/guru FAILED Installing golang.org/x/tools/cmd/gorename FAILED ...

  2. maven执行原理及插件解析

    maven执行原理及插件解析 1. 博文说明 2. 命令的解析及插件路由映射 2.1 谈谈mvn.cmd 2.2 maven插件路由映射 1. 博文说明 本文讲maven插件,不单单是插件本身,而是要 ...

  3. Eclipse中 Junit 正常运行完了 可是方法覆盖率全红 解决办法 (附带②EclEmma插件安装方法④覆盖率抽出与合并)

    ■前言 今天修改完代码之后,修改对应的Junit. 对于目前这个工程,之前有一次案件对于,在整个工程中,使用Junit4 + JMockit方式,来实现Junit. 之前修改的测试类,都是通过以下方式 ...

  4. Maven中不能引入ojdbc解决方法:com.oracle:ojdbc6:jar:11.2.0.3

    Missing artifact com.oracle:ojdbc6:jar:11.2.0.3 Maven中不能引入ojdbc解决方法,错误 今天从服务器检出Maven项目的时候,遇到了一个问题,就是 ...

  5. jenkins之插件下载方法

    jenkins插件下载方法有两种,在线下载和离线下载方式 在线下载 就是在安装好了jenkins之后,进入jenkins的插件管理页面,搜索想要的插件,点击安装即可 例如:安装git插件 问题:有时候 ...

  6. idea中maven依赖引入不进来解决方法

    idea中maven依赖引入不进来解决方法 1.注释到pom中的依赖,更新maven,在取消掉pom中的注释,然而失败 2.删除本地仓库中的jar包,重新拉依赖,然而还是失败 3.先是对图上的两个位置 ...

  7. Sublime Text 3安装常用插件的方法及使用报错方法总结

    常用安装方法 Sublime必备插件 必备的:Alignment,JsFormat,CSSComb,CTags,DocBlockr,Emmet,FileDiffs,SASS,LESS,SASS Bui ...

  8. maven项目多模块相互调用方法

    maven项目多模块相互调用方法 问题背景 解决方法 方法1 方法2 问题背景 maven项目包括多个子模块,类似下图: 现在[web]模块某个类想要调用[service]模块的某个类的某个方法. 如 ...

  9. [Android]上传到多个Maven仓库的Gradle插件RapidMavenPushPlugin

    博客搬迁至https://blog.wangjiegulu.com RSS订阅:https://blog.wangjiegulu.com/feed.xml RapidMavenPushPlugin 用 ...

最新文章

  1. 设置Button控件创建完毕时触发的事件.
  2. 如何使用cmd进入打印机选项_怎样用命令行方式添加打印机端口? (已解决)
  3. 检查型异常(Checked Exception)与非检查型异常(Unchecked Exception)
  4. mysql 硬负载_为啥单机MySQL又遭遇瓶颈?MySQL主从复制替你解决单机问题
  5. markdown 流程图js_MarkDown 流程图示例
  6. java开发用怎么软件开发_Java 9中的5个功能将改变您开发软件的方式(还有2个不会)...
  7. [html] 切页面时,每次都动手刷新看效果很麻烦,如果要让你写一个实时刷新预览的工具你该怎么写?
  8. go爬虫和python爬虫_爬虫练手-豆瓣top250(go版以及python版)
  9. 【英语学习】【医学】无机化学 - 化合物命名(1) - 离子化合物
  10. java 安装包_手机也可以编写Java程序代码?这些黑科技你值得拥有!
  11. 推荐一款好用的消息推送服务WxPusher
  12. nginx发布静态目录备忘
  13. sqoop连接mysql_Sqoop jdbc 连接 MySQL 驱动包com.mysql.cj.jdbc.Driver 问题解决方法
  14. 2015年上半年 系统分析师 案例分析真题
  15. 再梳理一下seqtoseq,encoder-decoder,attention,transformer的概念
  16. html怎么设置div只读,html怎么设置只读状态
  17. React的非受控组件和受控组件
  18. UnixBench测试服务器性能
  19. 一个博士在华为的22年!
  20. 克制授信,蚂蚁集团将严控年轻人额度

热门文章

  1. 又整理了一些面试相关的:视频教程,面试经验,简历模板,写简历的技巧等
  2. writeup-passcode
  3. 单片机定时器(65536-x)/256
  4. 7月26日 select单表查询基础语句
  5. kali Linux 2021 新版安装
  6. 阿里云IOT设备数据接入 (从阿里云IOT云平台获取设备数据)
  7. ECCV2022 | 开源:基于可分离级联查找表的实时图像增强方法
  8. ADOConnection 打开EXCEL
  9. java基于ssm+jsp的抑郁症心理健康科普交流网站
  10. 解决tf报Graph disconnected错误