Junit4.x扩展:运行指定方法
相信很多道友搞开发的一般都会用到Junit单元测试工具,不知道大家有没有遇到一个这样的问题:
有的单元测试用例有很多@Test方法,甚至有的方法会执行很长时间,只能空等执行。而实际上我们只需要运行其中的某一些方法就可以了。然后有人会说不是有ingore注解么,可ingore需要为许多的方法添加,当测试方法达到一定数量级的时候,改起来会很烦躁,如果commit到代码服务器上甚至可能会影响别人工作。己所不欲...
之前有朋友跟我说过TestNG是支持指定执行哪些方法,本人没有亲自去实验,因为公司统一使用Junit,所以没打算在这上面花费学习成本,没有固定测试框架的朋友不妨自己了解一下。下面开始扩展:
项目下载:
实现思路
1、在正常运行的情况下,Junit被触发会调用org.junit.runners.BlockJUnit4ClassRunner类,加载测试类文件,执行before after childrenInvoker等方法,有兴趣的道友可以自己看下这个类的结构,今天的主角是childrenInvoker方法,这个方法调用了测试类文件的@Test方法并执行,我们要做的就是重写这个方法,根据我们自己的规则选择执行哪些方法。
2、根据上一条我们要扩展一个R我unner继承自BlockJUnit4ClassRunner,在这里进行参数过滤。
3、我们可能希望方法可以模糊匹配,也可能希望可以指定某几个固定的写法,所以需要引入一种过滤规则,这里采用正则表达式。过滤规则的传递采用注解,因为我觉得简洁,忘记注解使用的朋友可以点击这里。
4、Junit4开始提供了RunWith注解,以便让用户自定义扩展Runner,我们的实现就是基于它的这个特性。比较有名的应该大家都比较熟悉spring的Junit扩展。
代码实现:
1、定义注解
package com.array7.annotations; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface FilterMethods {
String[] methods();
}
2、定义Runner
package com.array7.runner; import java.util.HashSet;
import java.util.Set;
import java.util.regex.Pattern; import org.junit.runner.notification.RunNotifier;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.Statement; import com.array7.annotations.FilterMethods; public class SpecialMethodsRunner extends BlockJUnit4ClassRunner {
private FilterMethods filter;
public SpecialMethodsRunner(Class<?> clazz) throws InitializationError {
super(clazz);
filter = clazz.getAnnotation(FilterMethods.class);
} /**
* EnterPoint
*/
@Override
protected Statement childrenInvoker(final RunNotifier notifier) {
if (filter == null) { // keep original runner alone.
return super.childrenInvoker(notifier);
}
return new Statement() {
@Override
public void evaluate() throws Throwable {
runMethodsWithFilter(notifier, filter);
}
};
}
/**
* Filter the methods could be run.
* @param notifier
* @param filterMethods
*/
private void runMethodsWithFilter(final RunNotifier notifier, final FilterMethods filterMethods) {
String[] filters = filterMethods.methods();
if (filters == null || filters.length == 0) {
throw new IllegalArgumentException(
"Wrong parameters!Please check Annotation FilterMthods parameters...");
} Set<Pattern> patternSet = new HashSet<Pattern>();
for (String filter : filters) {
patternSet.add(Pattern.compile(filter));
} for (FrameworkMethod method : getChildren()) {
for (Pattern pattern : patternSet) { // loop all patterns
if (pattern.matcher(method.getName()).matches()) { // if matches ...break;
runChild(method, notifier);
break;
}
}
}
} }
3、使用实例:
package junit_ext; import org.junit.Test;
import org.junit.runner.RunWith; import com.array7.annotations.FilterMethods;
import com.array7.runner.SpecialMethodsRunner; @RunWith(SpecialMethodsRunner.class)
@FilterMethods(methods = { "^.*2$", "^m.*", "ab21"})
public class DemoTest {
@Test
public void m1() {
System.out.println(123);
} @Test
public void mmm2() {
System.out.println(456);
} @Test
public void a2() {
System.out.println(791);
} @Test
public void ab21() {
System.out.println(7890);
}
}
4、pom.xml依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
5、代码经过测试,文章亦可随意转载,唯请保留出处。
Junit4.x扩展:运行指定方法的更多相关文章
- [Xcode 实际操作]八、网络与多线程-(18)PerformSelector消息处理方法:由运行时系统,负责去调用对象的指定方法
目录:[Swift]Xcode实际操作 本文将演示PerformSelector消息处理方法. 在项目文件夹上点击鼠标右键弹出文件菜单. [New File]->[Swift File]-> ...
- 最新解决Chrome(版本76.0.3809.100) “请停用以开发者模式运行的扩展程序”的方法
最新解决Chrome(版本76.0.3809.100) “请停用以开发者模式运行的扩展程序”的方法 最近在远景论坛上发现了最新的解决Chrome浏览器提示:请停用以开发者模式运行的扩展程序的问题.该方 ...
- 打开Excel时提示"您尝试打开的文件**.xls的格式与文件扩展名指定的格式不一致"
问题描述: 系统安装了WPS时,Analyzer导出excel时候,会提示"您尝试打开的文件**.xls的格式与文件扩展名指定的格式不一致",这是Excel的安全问题, ...
- Excel:您尝试打开的文件的格式与文件扩展名指定的格式不一致
报错信息: 打开文件时提示"您尝试打开的文件xxx.xls的格式与文件扩展名指定的格式不一致.打开文件前请验证文件没有损坏且来源可信.是否立即打开该文件?",卸载Office 20 ...
- 正确的 Composer 扩展包安装方法
问题说明 我们经常要往现有的项目中添加扩展包,有时候因为文档的错误引导,如下图来自 这个文档 的: composer update 这个命令在我们现在的逻辑中,可能会对项目造成巨大伤害. 因为 com ...
- Composer 扩展包安装方法
问题说明 我们经常要往现有的项目中添加扩展包,有时候因为文档的错误引导,如下图来自 这个文档 的: composer update 这个命令在我们现在的逻辑中,可能会对项目造成巨大伤害. 因为 com ...
- 无需重新编译php加入ftp扩展的解决方法
无需重新编译php加入ftp扩展的解决方法 本文为大家介绍无需重新编译php加入ftp扩展的方法,有需要的朋友可以参考下 首先,进入源码目录cd php-5.2.13/ext/ftp #运行p ...
- 【原创】打开Excel时提示"您尝试打开的文件**.xls的格式与文件扩展名指定的格式不一致"
问题描述: 系统安装了WPS时,Analyzer导出excel时候,会提示"您尝试打开的文件**.xls的格式与文件扩展名指定的格式不一致",这是Excel的安全问题, ...
- 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格式不一致的解决办法
-----转载:http://blog.csdn.net/sgear/article/details/7663502 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格 ...
随机推荐
- 在.net中为什么第一次执行会慢?
众所周知.NET在第一次执行的时比第二第三次的效率要低很多,最常见的就是ASP.NET中请求第一个页面的时候要等上一段时间,而后面任意刷新响应都非常迅速,那么是什么原因导致的呢?为什么微软不解决这个问 ...
- Javascript基础系列之(五)关键字和保留字 (keyword)
关键字不可以作为变量名或者函数名 break case catch continue default delete do else finally for function if in instanc ...
- Daily Scrum – 1/6
Meeting Minutes 确认修复了一个bug,即变方的: 分配了以后的任务: 确认将速度写入了用户的设置文件 Burndown Progress part 组员 今日工作 Time ...
- Android开发环境的调研
在大二下,由于课程需要,就去自学Java,当时就借了一本java面向对象的书来看,根据书上的说明搭建环境,下载了JDK1.6和eclipse.但从来没有用过eclipse,java也就只是刚入门而已. ...
- 如何在Dreamweaver中使用emmet
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=3666 一.emmet ...
- zabbix 的学习应用之路
1.zabbix server的安装 http://www.cnblogs.com/smail-bao/p/5643136.html 2.zabbix agent的安装 h ...
- Cas_Java客户端登录相关过滤器的处理流程
首先了解一下CAS登录原理: 1.CAS结构中一般包含CAS服务器(Cas验证服务器).应用服务器(程序所在服务器).客户端(web浏览器)三个部分. 2.客户端向应用服务器发出请求,由于未登录,会被 ...
- OpenJudge 7627 鸡蛋的硬度
描述 最近XX公司举办了一个奇怪的比赛:鸡蛋硬度之王争霸赛.参赛者是来自世 界各地的母鸡,比赛的内容是看谁下的蛋最硬,更奇怪的是XX公司并不使用什么精密仪器来测量蛋的硬度,他们采用了一种最老土的办法- ...
- dto
dto dto- datatransfer object(数据传输对象):dto在设计之初的主要考量是以粗粒度的数据结构减少网络通信并简化调用接口. http://www.cnblogs.com/wu ...
- ci中与类名相同 的方法 index控制器 下面index方法 会输出两份
与类名相同的会被认为是构造方法, 会输出两次 等同于 __construct();