maven失败测试用例rerun插件使用方法
在运行测试用例时,有时候希望本次运行结束后自动运行失败的测试用例,以排除结果由于网络或其他连接原因导致的偶发抖动。通过参考查阅资料,有以下几种方法可以达到目的:
***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插件使用方法相关推荐
- go插件 vscode 报错_MacOS中 VSCode 安装 GO 插件失败问题的快速解决方法
问题重现 Installing golang.org/x/tools/cmd/guru FAILED Installing golang.org/x/tools/cmd/gorename FAILED ...
- maven执行原理及插件解析
maven执行原理及插件解析 1. 博文说明 2. 命令的解析及插件路由映射 2.1 谈谈mvn.cmd 2.2 maven插件路由映射 1. 博文说明 本文讲maven插件,不单单是插件本身,而是要 ...
- Eclipse中 Junit 正常运行完了 可是方法覆盖率全红 解决办法 (附带②EclEmma插件安装方法④覆盖率抽出与合并)
■前言 今天修改完代码之后,修改对应的Junit. 对于目前这个工程,之前有一次案件对于,在整个工程中,使用Junit4 + JMockit方式,来实现Junit. 之前修改的测试类,都是通过以下方式 ...
- Maven中不能引入ojdbc解决方法:com.oracle:ojdbc6:jar:11.2.0.3
Missing artifact com.oracle:ojdbc6:jar:11.2.0.3 Maven中不能引入ojdbc解决方法,错误 今天从服务器检出Maven项目的时候,遇到了一个问题,就是 ...
- jenkins之插件下载方法
jenkins插件下载方法有两种,在线下载和离线下载方式 在线下载 就是在安装好了jenkins之后,进入jenkins的插件管理页面,搜索想要的插件,点击安装即可 例如:安装git插件 问题:有时候 ...
- idea中maven依赖引入不进来解决方法
idea中maven依赖引入不进来解决方法 1.注释到pom中的依赖,更新maven,在取消掉pom中的注释,然而失败 2.删除本地仓库中的jar包,重新拉依赖,然而还是失败 3.先是对图上的两个位置 ...
- Sublime Text 3安装常用插件的方法及使用报错方法总结
常用安装方法 Sublime必备插件 必备的:Alignment,JsFormat,CSSComb,CTags,DocBlockr,Emmet,FileDiffs,SASS,LESS,SASS Bui ...
- maven项目多模块相互调用方法
maven项目多模块相互调用方法 问题背景 解决方法 方法1 方法2 问题背景 maven项目包括多个子模块,类似下图: 现在[web]模块某个类想要调用[service]模块的某个类的某个方法. 如 ...
- [Android]上传到多个Maven仓库的Gradle插件RapidMavenPushPlugin
博客搬迁至https://blog.wangjiegulu.com RSS订阅:https://blog.wangjiegulu.com/feed.xml RapidMavenPushPlugin 用 ...
最新文章
- 设置Button控件创建完毕时触发的事件.
- 如何使用cmd进入打印机选项_怎样用命令行方式添加打印机端口? (已解决)
- 检查型异常(Checked Exception)与非检查型异常(Unchecked Exception)
- mysql 硬负载_为啥单机MySQL又遭遇瓶颈?MySQL主从复制替你解决单机问题
- markdown 流程图js_MarkDown 流程图示例
- java开发用怎么软件开发_Java 9中的5个功能将改变您开发软件的方式(还有2个不会)...
- [html] 切页面时,每次都动手刷新看效果很麻烦,如果要让你写一个实时刷新预览的工具你该怎么写?
- go爬虫和python爬虫_爬虫练手-豆瓣top250(go版以及python版)
- 【英语学习】【医学】无机化学 - 化合物命名(1) - 离子化合物
- java 安装包_手机也可以编写Java程序代码?这些黑科技你值得拥有!
- 推荐一款好用的消息推送服务WxPusher
- nginx发布静态目录备忘
- sqoop连接mysql_Sqoop jdbc 连接 MySQL 驱动包com.mysql.cj.jdbc.Driver 问题解决方法
- 2015年上半年 系统分析师 案例分析真题
- 再梳理一下seqtoseq,encoder-decoder,attention,transformer的概念
- html怎么设置div只读,html怎么设置只读状态
- React的非受控组件和受控组件
- UnixBench测试服务器性能
- 一个博士在华为的22年!
- 克制授信,蚂蚁集团将严控年轻人额度