Junit 源码解析(一)之junit运行容器
package org.junit.runner;
public abstract class Runner implements Describable
Runner是JUNIT的运行容器,它是各种Junit运行容器的父类。我们可以把它理解成web容器,spring容器,就是单元测试类所在运行环境。
我们在跑单元测试时,单元测试用例的生命周期就是由runner来控制的。这和其他容器一样。
首先是选择容器,在跑单元测试时,最先构建的是Runner容器。源代码如下:
见AllDefaultPossibilitiesBuilder下的public Runner runnerForClass(Class<?> testClass) throws Throwable
@Override
public Runner runnerForClass(Class<?> testClass) throws Throwable {
List<RunnerBuilder> builders= Arrays.asList(
ignoredBuilder(),
annotatedBuilder(),
suiteMethodBuilder(),
junit3Builder(),
junit4Builder());
for (RunnerBuilder each : builders) {
Runner runner= each.safeRunnerForClass(testClass);
if (runner != null)
return runner;
}
return null;
}
builders是容器的创建者,它是一个list,创建ignoredBuilder(),annotatedBuilder(),suiteMethodBuilder(),junit3Builder(),junit4Builder());
遍历builders,因为list是有序的,当某一个junit容器创建成功,则跳出循环,不再创建其他容器。而创建好的Runner容器就负责执行单元测试用例。
下面说一下各个容器的作用和特点
(1)IgnoredBuilder,
public Runner runnerForClass(Class<?> testClass) {
if (testClass.getAnnotation(Ignore.class) != null)
return new IgnoredClassRunner(testClass);
return null;
}
当在你的单元测试类前面加@Ignore的时候,这个容器就会被创建。这个容器不会执行单元测试方法。
这也就是当我们有些单元测试用例类跑不过时,加类上面加注解@Ignore,通过忽略通过的原因。
(2)AnnotatedBuilder
@Override
public Runner runnerForClass(Class<?> testClass) throws Exception {
RunWith annotation= testClass.getAnnotation(RunWith.class);
if (annotation != null)
return buildRunner(annotation.value(), testClass);
return null;
}
在JUNIT已经提供了自己的容器,当在生产开发中,如果觉得JUNIT提供的容器已经不能满足需求时,可以自己创建个性化的容器。在类的声名加上注解RunWith,指定你自己创建容器。像在spring中,它提供了自己的单元测试容器。
请见Spring测试的基类AbstractJUnit4SpringContextTests,在它的类注解中加了RunWith,指定它的测试容器SpringJUnit4ClassRunner。
一般情况我们并不会用到这个容器。这里想说明的是JUNIT做为一个框架,它通过AnnotatedBuilder提供了可扩展的接口
(3)SuiteMethodBuilder 略
(4)JUnit3Builder
public class JUnit3Builder extends RunnerBuilder {
@Override
public Runner runnerForClass(Class<?> testClass) throws Throwable {
if (isPre4Test(testClass))
return new JUnit38ClassRunner(testClass);
return null;
}
boolean isPre4Test(Class<?> testClass) {
return junit.framework.TestCase.class.isAssignableFrom(testClass);
}
}
这是Junit的早期版本使用的容器,那时写单元测试类需要继承TestCase,现在我们不用再继承这个类了。为兼容老版本。当你的单元测试用例继承了TestCase这个容器就会被创建。isPre4Test方法判断你所写的测试用例类是否是TestCase的子类。记得好像3.8之后的版还是4.0之后的版就可以不用继承TestCase了。
(5)JUnit4Builder
@Override
public Runner runnerForClass(Class<?> testClass) throws Throwable {
return new BlockJUnit4ClassRunner(testClass);
}
创建最新的Junit自带的测试容器。这个容器是我们现在最常用的,虽然我们并不了解它,但平常写的测试用例类都是在BlockJUnit4ClassRunner下运行的。由于版本原因,这里的BlockJUnit4ClassRunner是比较新容器。之前版本的容器是JUnit4ClassRunner,现在这个类已经打上@Deprecated注解,不再推荐使用。当然你也可以通过上面提到的RunWith来使用这个容器。
针对现在最常用BlockJUnit4ClassRunner,在下一个章节来看他的源码。
分享到:
相关推荐
JUnit是Java领域最广泛使用的单元测试框架之一,它极大地简化了测试代码的编写。Runner是JUnit中的一个重要概念,它是执行测试的核心组件。本篇文章将深入到JUnit的源码中,探讨Runner的实现原理,帮助开发者更好地...
**Junit源码分析(圣思园)** Junit是Java编程语言中最广泛使用的单元测试框架,它使得开发者能够方便地编写和运行可重复的、可靠的测试用例。本篇文章将深入探讨Junit的源码,揭示其内部工作原理,帮助我们更好地...
自定义JUnit源码是一个对Java开发人员非常有帮助的主题,特别是对于那些想要深入理解测试框架工作原理或希望根据自身需求定制测试工具的开发者。JUnit是一个广泛使用的单元测试框架,它简化了编写和运行针对Java代码...
10. **持续集成**:JUnit源码也揭示了如何将测试集成到持续集成(CI)系统,如Jenkins、Travis CI等,确保每次代码变更后都能自动运行测试并获取反馈。 总的来说,分析《JUnit in Action》的源码,不仅可以帮助我们...
《Junit Recipes 源码》是一份宝贵的资源,它包含了一系列与单元测试相关的实践案例,主要用于学习和应用JUnit测试框架。JUnit是Java编程语言中最常用的单元测试工具,它为开发者提供了一种简单且强大的方式来编写可...
2. **JUnit框架**:JUnit源码在NetBeans中的实现意味着我们可以看到如何在IDE内部封装和扩展JUnit的API。这可能涉及到对`@Test`注解的处理,以及如何触发测试执行和显示测试结果。 3. **事件监听和API调用**:...
《深入理解JUnit 4.12:源码解析与应用实践》 JUnit是Java编程语言中最流行的单元测试框架,它的存在极大地推动了敏捷开发和持续集成的实践。本篇文章将聚焦于JUnit 4.12版本,通过源码解析和实际应用,带你深入...
4. 源码解析 在 "java-junit-jenkins-master" 压缩包中,我们可以看到一个示例项目的源码,它演示了如何配置 Jenkins 来运行 JUnit 测试。这个项目可能包含以下关键组件: - `pom.xml`:Maven 项目配置文件,其中...
《深入解析JUnit源码》 JUnit是Java编程语言中最广泛使用的单元测试框架,它为开发者提供了编写和执行可重复测试的便利工具。本篇将基于"junit-example-源码.rar"这一压缩包中的源码,对JUnit的核心概念、工作原理...
【Junit单元测试完整案例】深入解析 在软件开发中,单元测试是验证代码功能是否正确、独立单元是否按预期工作的关键步骤。Junit作为Java领域最常用的单元测试框架,为开发者提供了简单易用的API来进行测试。本案例...
《深入解析JUnit 3.8.1源码》 JUnit是Java编程语言中广泛使用的单元测试框架,它为开发者提供了一种简洁、高效的方式来编写和运行测试用例,确保代码的质量。本文将深入探讨JUnit 3.8.1版本的源码,带你走进单元...
在持续集成环境中,如Jenkins、Travis CI等,Junit的XML报告格式可以被这些工具解析,以便于监控测试结果,确保每次提交都能通过所有测试。 总结,Junit是Java开发中的重要工具,掌握其使用方法和高级特性能够提升...
《深入解析JUnit测试框架——基于junit-demo-源码》 JUnit是一款广泛应用于Java编程语言中的单元测试框架,它为开发者提供了简洁、高效的测试工具,使得代码的质量得到了显著提升。通过对"junit-demo-源码"的分析,...
JUnit Platform为其他测试框架提供了一个运行时环境,JUnit Jupiter是JUnit 5的主要编程模型,而JUnit Vintage则用于兼容旧版本的JUnit。 在JUnit 5中,测试注解得到了显著增强。例如,`@Test`注解现在可以接受一个...
本教程将深入解析Junit 4 的各项功能和使用技巧,通过源码分析帮助读者更深入地理解其工作原理。 1. **基本注解** (eclipse-JunitBasicAnnotations.rar) - `@Test`: 这是标记测试方法的关键注解。每个包含此注解的...
在Android开发中,测试是不可或缺的一环,而JUnit作为Java领域广泛使用的单元测试框架,也在Android平台上得到了应用。"android-junit-report"项目便是针对Android环境优化的JUnit测试报告生成工具,旨在帮助开发者...
《深入理解JUnit——Java单元测试框架解析》 JUnit是一个广泛使用的Java编程语言的单元测试框架,它是开源项目,由Eclipse基金会维护。JUnit是 Extreme Programming(XP)实践中的一个重要工具,它鼓励程序员进行...
《深入解析JUnit 5:基于junit5-r5.3.1.zip的源码分析》 JUnit 5作为Java领域中最流行的单元测试框架之一,它的每次更新都备受开发者关注。在junit5-r5.3.1.zip这个压缩包中,我们得到了JUnit 5的源码,这为我们...
`HttpUnit` 是一个模拟浏览器行为的库,它可以发送 HTTP 请求并解析响应,从而帮助测试 Web 应用程序的客户端逻辑。它支持 HTML、JavaScript、Cookie、表单提交、AJAX 等功能,使得测试无需依赖于真实浏览器环境,...
JUnitReport是Ant的一个任务,它可以解析JUnit生成的XML测试结果,并将其转换为结构化的HTML报告,便于团队成员查看测试覆盖率、失败情况和错误信息。 具体操作步骤如下: 1. 首先,在Eclipse中创建JUnit测试类,...