相信很多道友搞开发的一般都会用到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扩展:运行指定方法的更多相关文章

  1. [Xcode 实际操作]八、网络与多线程-(18)PerformSelector消息处理方法:由运行时系统,负责去调用对象的指定方法

    目录:[Swift]Xcode实际操作 本文将演示PerformSelector消息处理方法. 在项目文件夹上点击鼠标右键弹出文件菜单. [New File]->[Swift File]-> ...

  2. 最新解决Chrome(版本76.0.3809.100) “请停用以开发者模式运行的扩展程序”的方法

    最新解决Chrome(版本76.0.3809.100) “请停用以开发者模式运行的扩展程序”的方法 最近在远景论坛上发现了最新的解决Chrome浏览器提示:请停用以开发者模式运行的扩展程序的问题.该方 ...

  3. 打开Excel时提示"您尝试打开的文件**.xls的格式与文件扩展名指定的格式不一致"

    问题描述:     系统安装了WPS时,Analyzer导出excel时候,会提示"您尝试打开的文件**.xls的格式与文件扩展名指定的格式不一致",这是Excel的安全问题,   ...

  4. Excel:您尝试打开的文件的格式与文件扩展名指定的格式不一致

    报错信息: 打开文件时提示"您尝试打开的文件xxx.xls的格式与文件扩展名指定的格式不一致.打开文件前请验证文件没有损坏且来源可信.是否立即打开该文件?",卸载Office 20 ...

  5. 正确的 Composer 扩展包安装方法

    问题说明 我们经常要往现有的项目中添加扩展包,有时候因为文档的错误引导,如下图来自 这个文档 的: composer update 这个命令在我们现在的逻辑中,可能会对项目造成巨大伤害. 因为 com ...

  6. Composer 扩展包安装方法

    问题说明 我们经常要往现有的项目中添加扩展包,有时候因为文档的错误引导,如下图来自 这个文档 的: composer update 这个命令在我们现在的逻辑中,可能会对项目造成巨大伤害. 因为 com ...

  7. 无需重新编译php加入ftp扩展的解决方法

    无需重新编译php加入ftp扩展的解决方法   本文为大家介绍无需重新编译php加入ftp扩展的方法,有需要的朋友可以参考下   首先,进入源码目录cd php-5.2.13/ext/ftp #运行p ...

  8. 【原创】打开Excel时提示"您尝试打开的文件**.xls的格式与文件扩展名指定的格式不一致"

    问题描述:     系统安装了WPS时,Analyzer导出excel时候,会提示"您尝试打开的文件**.xls的格式与文件扩展名指定的格式不一致",这是Excel的安全问题,   ...

  9. 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格式不一致的解决办法

    -----转载:http://blog.csdn.net/sgear/article/details/7663502 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格 ...

随机推荐

  1. Jenkins进阶之自动发送邮件的Default Content设置模板

    分享一个简洁实用的Jenkins项目邮件管理系统的"Default Content"设置模板 配置如下: <h1><center><font colo ...

  2. 『方案』《女友十年精华》 ORC 图片 文字识别 详解

    目的需求: 2008年,遇到一本电子书 <女友十年精华> 觉得很美,想 私藏 这些文章: >网络搜索文章 —— 没有找到: >反编译程序 —— 所有文字 都是图片格式(部分文章 ...

  3. Java学习笔记(十七)——java序列化

    [前面的话] 做项目总是要用到很多东西,遇到一个新的知识,并不是这个知识出来的时间短,而是对于自己来说是新的,所以就需要自己去学习,希望今后可以提高学习的效率. 这篇文章是关于Java 序列化的,选择 ...

  4. ARP 命令运行实现静态IP/MAC绑定

    公司网络出现本地无法连接,以前公司是分配的固定IP,结果还是无法连接网络,后来网管帮我设置了下,我也学习了下.解决办法如下: 1.首先以管理员身份运行CMD打开命令行程序 开始-程序-附件-命令提示符 ...

  5. DOM(七)使用DOM控制表格

    表格的css控制就先不说了,首先分享下表格常用的DOM 表格添加操作的方法常用的为insertRow()和insertCell()方法. row是从零开始计算起的,例如: var oTr = docu ...

  6. 改Bug

    一:新闻查询失败 1.velocity:R对象里的变量不区分大小写?  哦,应该是的! 2.表单的button是默认就有提交功能的哦! 3.velocity变量在页面上的解析:  为什么会出错呢? 难 ...

  7. java ee 中文乱码的问题

    java ee 中文乱码的问题 发生中文乱码的三种情况 (一) 表单form Post 方法 直接在服务器中设置 request.setCharacterEncoding("utf-8&qu ...

  8. Oracle数据库sys为什么只能以sysdba登录

    1.我们都知道,Oracle有两个具有dba角色的用户,分别是sys与system,他们都可以以sysdba身份登录数据库.既然system具有dba角色,为什么还分配他sysoper身份? [sys ...

  9. IntelliJ Idea13无法创建maven模板

    一.错误信息: -Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment v ...

  10. ECSHOP \admin\edit_languages.php GETSHELL Based On Injection PHP Code Into /languages/zh_cn/user.php

    目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 对于很多CMS网站来说,它们都需要保存很多的网站META信息,最常用的最佳实践是以 ...