Junit4.x扩展:运行指定方法

JUnit 4到JUnit 5迁移实战:从注解替换到扩展模型详解 单元测试是软件质量保障的核心环节,它通过验证代码单元的行为是否符合预期来确保系统可靠性。JUnit作为Java领域最主流的测试框架,其从JUnit 4到JUnit 5的演进不仅是版本升级,更是一次架构层面的现代化重构。JUnit 5引入了模块化设计,将测试平台、编程模型和向后兼容性分离,提供了更灵活的测试生命周期管理、强大的参数化测试支持以及基于扩展模型的插件化能力。这些改进显著提升了测试代码的可维护性和表达力,使得开发者能够更高效地编写覆盖各种场景的测试用例。在实际工程实践中,迁移过程涉及注解替换、断言A 阅读详情

    相信很多道友搞开发的一般都会用到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、代码经过测试,文章亦可随意转载,唯请保留出处。

最后,喜欢讨论技术的道友可以加入我的QQ技术群80466913,Java相关为主,希望您喜欢技术,希望您对底层源码有一定了解(NIO / CONCURRENT / NETTY / 设计模式 / NOSQL / HADOOP / TCP/IP等),期待共同进步,此群上限只会维持到100人左右。



从JUnit 4迁移到JUnit 5:完整指南与实战经验分享 单元测试是软件质量保障的核心环节,它通过验证代码单元的行为是否符合预期来确保系统可靠性。在Java生态中,JUnit作为事实上的标准测试框架,其版本演进直接影响着开发者的测试实践。JUnit 5作为新一代测试框架,采用了模块化架构设计,将平台、核心API和向后兼容引擎分离,提供了更清晰的关注点分离和更强的扩展能力。其技术价值在于引入了基于Lambda表达式的断言、参数化测试的全面增强以及全新的扩展模型,这些特性显著提升了测试代码的表达力和可维护性。在工程实践中,JUnit 5的扩展模型取代了传统的Runne 阅读详情

相关推荐

深入剖析Java领域JUnit的运行机制

JUnit如何发现和执行测试用例测试生命周期各阶段的处理逻辑注解驱动的测试执行原理扩展机制的工作原理研究范围涵盖JUnit 5.x版本的核心架构,重点分析junit-jupiter-engine模块的实现。本文首先介绍JUnit的基本概念,然后深入分析其架构设计和核心组件,接着通过源码解析运行机制,最后探讨实际应用和扩展方法。测试引擎(TestEngine): JUnit的核心接口,负责发现和执行测试测试描述符(TestDescriptor): 描述测试的元数据对象。

AI开发架构师 926

【Spring Boot】配置文件加载及JUnit测试类的使用

一、配置文件的加载 application.properties/yml 文件 : Spring Boot的启动类一定会加载这个文件。properties的优先级比yml更高,也就是说当同时存在application.properties和application.yml文件 (在同个目录下) 时,SpringBoot会选择加载application.properties。 补充 : 就算用了yml文件,Spring Boot在底层还是会将yml文件转成properties文件。 applicatio

一顿输出 6698

junit-extension:JUnit扩展

junit-extension 背景 原生的Junit无法满足我们在自动化测试实践过程中的碰到一些需求,比如 管理人员希望统计测试组每个成员开发的用例数目, 要是每个用例都能够有注释 在本地调试测试用例时,测试工程师希望只运行于自己开发的用例 系统测试时需要执行全量用例,回归测试时希望跑High优先级的用例 测试用例运行失败后能够有自动重试的机制 junit产生的测试报告希望与内部系统集成,有一些定制需求 ...... 注解 @Author注解测试用例的作者 @Priority注解测试用例的优先级,有High.class, Middle.class, Low.class可选 @Comment注解测试用例的注释 以上三种注解和Junit build-in的注解@Test配合使用,示例如下 import org.junit.Test; import org.sdet.junit.extens

springBoot JunitTest的使用以及如何在junit启动前加载

springBoot JunitTest的使用 @SpringBootTest(classes = {Application.class},webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @TestExecutionListeners(listeners = {TestListener.class, DependencyInj...

一个想写小说的程序员 4450

Mac本地大模型实战指南:Ollama+Metal+Apple Silicon深度优化

大语言模型(LLM)本地化部署正成为开发者关键技术能力,其核心在于推理效率、硬件适配与成本控制。Apple Silicon凭借统一内存架构(UMA)和Neural Engine,为本地LLM运行提供了独特优势;Metal加速则显著提升GPU计算吞吐,使Gemma 4、Qwen 3.5等模型在M系列Mac上实现低延迟、高精度、离线可用的工程落地。相比云端API,本地方案规避了token计费、网络依赖与数据外泄风险,特别适用于企业文档处理、实时语音分析、私有知识库检索等强隐私、低时延场景。本文聚焦Mac平台,系

weixin_33443333的博客 354

感应加热电源设计避坑指南:半桥LC串联谐振的5个关键问题

本文深入解析半桥LC串联谐振在感应加热电源设计中的5个关键问题,包括均压电阻选型、功率管驱动时序、谐振频率补偿等实战经验。通过真实故障案例和解决方案,帮助工程师避开常见设计陷阱,提升电路稳定性和效率,特别适合从事桥感应加热电源开发的工程师参考。

weixin_27013291的博客 510

通过JUnit启动spring加载配置

/**  * 测试类  *TestServiceTest.java  */ @Transactional @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SpringTestConfig.class) public class TestServiceTest  extends Abstra

lwjshuai的专栏 2171

Python入门基础教程(非常详细)

Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,坚持「极简主义」。Python类库(模块)极其丰富,这使得Python几乎无所不能,不管是传统的Web开发、PC软件开发、Linux运维,还是当下火热的机器学习、大数据分析、网络爬虫,Python都能胜任。这套Python基础教程不是教科书,不会玩弄概念,而是力求口语化和通俗化,让读者尽快入门。如果有小朋友出于兴趣学习Python,请引导他阅读本教程的前半部分,这是基础,可以降低学习成本;...

Yuki1127918的博客 34万+

junit只运行某一方法

在Package Explorer中选择测试类,点击测试类左边的+,从中选择要测试的testxxxx,单击右键run as,选择JUint test

common programmer 1425

103.在 Vue 3 中使用 OpenLayers 控制图层来显示/隐藏地图

是一个强大的开源库,可以用于构建各种地理信息系统应用。在 Vue 3 中,我们可以结合。方法,可以直接控制某个图层是否可见,而不需要删除或重新创建图层。在开始之前,确保你已经搭建了 Vue 3 项目,并安装了。本文将详细介绍如何在 Vue 3 组合式 API (,并实现按钮控制地图的显示/隐藏功能。会导致 OSM 瓦片地图无法加载。方法控制地图图层的显示与隐藏。安装完成后,即可开始编写代码。在本教程中,我们介绍了如何在。来实现地图的显示/隐藏功能。来实现交互式地图,并通过。在 WebGIS 开发中,

小彭的博客 1561

1. 迈进 SAP UI5 开发世界的第一步 - Hello World

SAP UI5 是一个用于开发企业级 Web 应用的前端框架,基于 HTML 和 JavaScript. 作为教程的第一步,我们需要了解最基础的 HTML 知识。 请大家在电脑上任意新建一个文件夹,将其命名,比如我取的名称为 Walkthrough. 进入 Walkthrough 文件夹,再新建一个文件夹名叫 01,代表本教程的第一个步骤。 进入 01 文件夹,新建一个 webapp 文件夹。这个名称是 web 应用约定俗成所使用的,大家都倾向于用这个名称,当然你要是想用其他名称也没有问题。......

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 9012

junit学习(二)——junit自动生成Test Method

上一篇中CalculateTest中的四个方法都是手敲的,要是方法比较少还好,要是比较多得敲到什么时候啊?下面说个半自动生成Test method的方法。 在MyEclipse的左侧视图中选中Calculate.java----&gt;右击----&gt;New----&gt;Other....----&gt;JUnit Test Case----&gt;Next,然后就会弹出形如以下的图:...

总有一天,你的日积月累,会成为别人的望尘莫及 2325

K230目标识别数字提问:模型只能识别近距离的目标,稍远一点就无法正确检测...如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1901

扩展 junit 框架_JUnit 5 –扩展模型

扩展 junit 框架 我们已经对Java最普遍的测试框架的下一个版本了解很多。 现在,让我们看一下JUnit 5扩展模型,该模型将允许库和框架将自己的实现添加到JUnit中。 总览 建立 基本 建筑 扩展模型 条件 注射 … 在新兴的《 JUnit 5用户指南》中可以找到您将在此处阅读的更多内容以及更多内容。 请注意,它基于Alpha版本,因此可能会发生变...

最佳 Java 编程 1624

C#串口通信从入门到精通(27)——高速通信下解决数据处理慢的问题(20ms以内)

本文介绍如何在高速通信情况下解决串口接收的数据来不及处理的问题,由高级工程师多年经验总结而成,绝对是串口领域的实战经验!

qq_34059233的博客 6814

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

JUnit5.x详解

目录JUnit5.x1、概述1.1、简介1.2、Maven依赖1.3、核心概念2、Junit4迁移到JUnit Jupiter3、生命周期方法4、@TestInstance(生命周期模式)5、显示测试名称5.1、@DisplayName5.2、@DisplayNameGeneration6、条件测试6.1、操作系统条件6.2、Java运行环境条件6.3、系统属性条件6.4、环境变量条件6.5、自定义条件7、执行顺序7.1、@TestMethodOrder(方法顺序)7.2、@TestClassOrder(类

吴声子夜歌的博客 1695

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JUnit 5 系列:扩展模型(Extension Model)

JUnit 4 的扩展模型 我们先来看看 JUnit 4 中是如何实现扩展的。在 JUnit 4 中实现扩展主要是通过两个,有时也互有重叠的扩展机制:运行器(Runners)和规则(Rules)。 运行器(Runners) 测试运行器负责管理诸多测试的生命周期,包括它们的实例化、setup/teardown 方法的调用、测试运行、异常处理、发送消息等。在 JUnit 4 提供的运行器实现中,它负责...

1804

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JUnit4学习笔记(四):利用Rule扩展JUnit

一、Rule简介 Rule是JUnit4中的新特性,它让我们可以扩展JUnit的功能,灵活地改变测试方法的行为。JUnit中用@Rule和@ClassRule两个注解来实现Rule扩展,这两个注解需要放在实现了TestRule借口的成员变量(@Rule)或者静态变量(@ClassRule)上。@Rule和@ClassRule的不同点是,@Rule是方法级别的,每个测试方法执行时都会调用被注解...

haibin369 702

JUnit 5 –扩展模型

我们已经对Java最普遍的测试框架的下一个版本了解很多。 现在让我们看一下JUnit 5扩展模型,该模型将允许库和框架将自己的实现添加到JUnit中。 总览 设定 基本 建筑 扩展模型 条件 注射 … 在新兴的《 JUnit 5用户指南》中可以找到您将在此处阅读的更多内容以及更多内容。 请注意,它基于Alpha版本,因此可能会发生变化。 确实,我们鼓励...

最佳 Java 编程 225

Junit4功能

JUnit 是JAVA语言事实上的标准测试库。JUnit 4是三年以来最具里程碑意义的一次发布。它的新特性主要是针对JAVA5中的标记(annotation)来简化测试,而不是利用子类、反射或命名机制。本文将讲述如何使用JUnit 4,当前前提是你最好具有JUnit的使用经验.  JUnit, 由Kent Beck 和 Erich Gamma开发,几乎是JAVA开发最重要的第三方工具。正如Ma

applehoney的专栏 3359

Spring Boot - Junit4 / Junit5 / Spring Boot / IDEA 关系梳理

迁移到 JUnit 5 需要一些工作,特别是如果你的项目已经使用了 JUnit 4。最佳选择取决于你的具体需求和项目的情况。如果你正在开始一个新项目,那么考虑使用 JUnit 5,因为它提供了更多的功能和灵活性。如果你的项目已经使用 JUnit 4,那么可以逐步迁移到 JUnit 5,以便利用新功能和改进。当然了1.0.0.RELEASE ~ 1.0.3.RELEASE的版本也是使用的 junit4 (版本不同) ,只是没有提供 @SpringBootTest注解。我这里用的是 2022。

小工匠 1万+

Java高级特性 第11节 JUnit 3.x和JUnit 4.x测试框架

一、软件测试   1.软件测试的概念及分类   软件测试是使用人工或者自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。它是帮助识别开发完成(中间或最终的版本)的计算机软件(整体或部分)的正确度、完全度和质量的软件过程。   软件测试过程:      2.软件测试的分类   按是否关心软件内部结构和具体实现角度来分: 黑盒...

weixin_30856725的博客 268

Junit4X系列--hamcrest的使用

OK,在前面的一系列博客里面,我整理过了Assert类下面常用的断言方法,比如assertEquals等等,但是org.junit.Assert类下还有一个方法也用来断言,而且更加强大。这就是我们这里要这里的: Assert的AssertThat()方法和Hamcrest匹配器 1,断言抛出的异常 2,现在让我们来认真的看下AssertThat()和Hamcrest匹配器吧

LinkinPark的博客 4493
上一篇: Windows下Cygwin添加右键菜单
下一篇: 设计模式学习笔记五:抽象工厂模式
七郎
博客等级 码龄14年 31粉丝 44原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值