前面提到过Junit的核心之一就是Runner,它是具体跑测试用例的人。自然我们就要先分析这个东西。通过Runner的层级视图我发现了不少新东西。不过我知道4.1版本的Runner核心就是org.junit.internal.runners.JUnit4ClassRunner这个类,所以我就先进去看看它的变化。结果发现它已经被deprecated了。而现在4.7取而代之的是我们上一次提到过的org.junit.runners.BlockJUnit4ClassRunner。
看一下这个类的层级图:
会发现它上面还有一个叫ParentRunner的东西,Runner接口的Run方法就是这个类实现的。
来看看这个Run方法:
@Override
public void run(final RunNotifier notifier) {
EachTestNotifier testNotifier= new EachTestNotifier(notifier,getDescription());
try {
Statement statement= classBlock(notifier);
statement.evaluate();
} catch (AssumptionViolatedException e) {
testNotifier.fireTestIgnored();
} catch (StoppedByUserException e) {
throw e;
} catch (Throwable e) {
testNotifier.addFailure(e);
}
}
发现它所有的测试,现在是通过Statement类来调用的。看看classBlock(notifier)这个方法:
protected Statement classBlock(final RunNotifier notifier) {
Statement statement= childrenInvoker(notifier);
statement= withBeforeClasses(statement);
statement= withAfterClasses(statement);
return statement;
}
这个Statement会把一个测试会执行的所有方法都封装起来。其中从childrenInvoker这个方法命名来看,这次我们的junit会支持树级结构的测试哦,所以才会诞生了这次的ParentRunner。
来看看childrenInvoker方法及里面涉及到的一个runChildren:
protected Statement childrenInvoker(final RunNotifier notifier) {
return new Statement() {
@Override
public void evaluate() {
runChildren(notifier);
}
};
}
private void runChildren(final RunNotifier notifier) {
for (final T each : getFilteredChildren())
fScheduler.schedule(new Runnable() {
public void run() {
ParentRunner.this.runChild(each, notifier);
}
});
fScheduler.finished();
}
然后这个runChild(each,notifier)方法是由BlockJUnit4ClassRunner实现的:
@Override
protected void runChild(FrameworkMethod method, RunNotifier notifier) {
//每个测试运行时会往里面添加测试结果,后期这些结果会汇总然后显示出来
EachTestNotifier eachNotifier= makeNotifier(method, notifier);
//如果发现测试方法上面带有@Ignore注解,就忽略这个测试方法
if (method.getAnnotation(Ignore.class) != null) {
eachNotifier.fireTestIgnored();
return;
}
//通知测试引擎开始测试
eachNotifier.fireTestStarted();
try {
//执行方法
methodBlock(method).evaluate();
} catch (AssumptionViolatedException e) {
eachNotifier.addFailedAssumption(e);
} catch (Throwable e) {
eachNotifier.addFailure(e);
} finally {
//通知引擎测试已经完成
eachNotifier.fireTestFinished();
}
}
看看methodBlock:
protected Statement methodBlock(FrameworkMethod method) {
Object test;
try {
test= new ReflectiveCallable() {
@Override
protected Object runReflectiveCall() throws Throwable {
return createTest(); //这个方法只会去初始化只有一个构造函数的类!
}
}.run(); //进行测试实体的初始化
} catch (Throwable e) {
return new Fail(e);
}
//测试结果封装为InvokeMethod
Statement statement= methodInvoker(method, test);
//如果有@expected的话,封装为ExpectException
statement= possiblyExpectingExceptions(method, test, statement);
//如果有@timeout的话,封装为FailOnTimeout
statement= withPotentialTimeout(method, test, statement);
//如果测试中带有有@Rule注解的字段,没有一个规则就会进行一次特定的监控
statement= withRules(method, test, statement);
//如果测试类带有@Before注解,封装为RunBefores
statement= withBefores(method, test, statement);
//如果测试类带有@After注解,封装为RunAfters
statement= withAfters(method, test, statement);
//返回结果
return statement;
}
我发现除了传统的方法调用记过,ExpectException结果,RunBefores结果和RunAfters结果这些Statement对象外,还添加了Timeout和Rules的描述。Timeout就直接忽略了,这么简单应该大家都可以不言而喻,下面来重点研究一下这个前所未见的MethodRule规则。
明天继续,要去干其它事情了。。。
- 大小: 11.5 KB
- 大小: 9.8 KB
分享到:
相关推荐
Junit4.7是Java编程领域中一个非常重要的单元测试框架,它允许开发者对他们的代码进行自动化测试,确保代码的功能正确性。这个完整的jar包包含了Junit4.7的所有类和方法,使得开发者可以直接在项目中引用,进行单元...
其次,`junit-4.7-src.jar`包含的是JUnit 4.7的源代码,这对于学习和理解JUnit的工作原理非常有用。开发者可以直接查看源码,了解内部实现细节,也可以在遇到问题时参考源码寻找解决方案。这对于想要深入学习和定制...
JUnit 4.7是这个框架的一个版本,提供了许多增强的功能和改进,使得测试更加灵活和高效。 JUnit的核心概念是测试用例(Test Case),它是测试特定功能或方法的一组相关断言(Assertion)。在JUnit 4.7中,你可以...
JUnit 4.7 是一个广泛使用的Java编程语言的单元测试框架,它极大地简化了软件开发中的测试过程。这个版本是JUnit系列的一个重要迭代,引入了许多改进和新特性,旨在提高测试的效率和覆盖率。让我们深入了解一下JUnit...
JUnit 4.7作为早期版本4.x系列的一部分,引入了许多改进和新特性。 2. **主要特性** - **注解(Annotations)**:JUnit 4.7引入了注解,如`@Test`、`@Before`、`@After`等,用于标记测试方法和设置方法,使得测试...
首先,JUnit 4.7是JUnit系列的一个升级版,它在JUnit 4的基础上进行了增强。JUnit 4相较于之前的版本,最大的改变是引入了注解(Annotation)机制,使得测试代码更加简洁,更具可读性。例如,`@Test`注解标记在方法...
JUnit 4.7 是一个流行的开源测试框架,主要用于编写和执行Java程序的单元测试。它在软件开发过程中扮演着至关重要的角色,确保代码的质量和稳定性。这个版本的JUnit是在JUnit 4系列的一个更新,带来了许多改进和新...
9. **扩展性**:JUnit 4.7的设计允许开发者通过实现`Runner`接口创建自定义的测试执行策略,增强了框架的可扩展性。 在实际使用中,我们通常会配合构建工具如Maven或Gradle,以及IDE如Eclipse或IntelliJ IDEA来管理...
《深入理解JUnit 4.7:Java开发中的单元测试利器》 JUnit是Java开发者进行单元测试最常用的工具之一,尤其在版本4.7中,它提供了丰富的功能和改进,使得测试更加高效、易于理解和维护。本文将深入探讨JUnit 4.7的...
JUnit 4.7是该框架的一个版本,包含了对之前版本的改进和新功能。 在Java开发中,单元测试是对单个或小部分代码进行的功能验证,通常针对方法。通过单元测试,开发者可以确保代码的正确性,降低bug的出现,并且在...
1. **测试方法的编写**:通过`@Test`注解标记测试方法,测试类通常继承自`org.junit.runner.RunWith`,例如`RunWith(JUnit4.class)`,表明该类使用JUnit 4运行器。 2. **异常断言**:使用`assertThrows()`方法检查...
4. **断言改进**:JUnit 4.7 提供了更多的断言方法,如 `assertEquals`、`assertNull`、`assertTrue` 等,使得测试结果的判断更加直观和灵活。 5. **测试套件(Test Suites)**:通过 `@Suite` 注解,你可以将多个...
4. **异常测试**:可以使用`@Test(expected = Exception.class)`注解来检查方法是否抛出了预期的异常。 5. **测试监听器**:通过实现`TestListener`接口或使用`@Rule`注解,开发者可以定制测试执行过程中的行为,如...
JUnit 4.7 和 Hamcrest-Core-1.3 是两个重要的Java单元测试工具,它们在软件开发过程中扮演着至关重要的角色。JUnit 是一个开源的、基于Java的单元测试框架,而Hamcrest是一个匹配器库,提供了丰富的断言方法,使得...
junit-4.7-src.jar junit-4.7-src.jar junit-4.7-src.jar junit-4.7-src.jar junit-4.7-src.jar junit-4.7-src.jar junit-4.7-src.jar
junit-4.7.jar 用于java测试的包
深圳电信培训中心徐海蛟老师上课用的junit4.7 api chm 速查中文手册.吐血奉献o(∩_∩)o...哈哈
JUnit是Java编程语言中...虽然这个版本是快照版本,但仍然包含了JUnit 4系列的核心功能,对于学习和理解JUnit 4的用法具有很大的参考价值。在实际开发中,我们通常会选择正式发布的稳定版本以获得更好的稳定性和支持。
本文档主要介绍了如何将Struts2、Spring3.0、JUnit4.7和Maven2.2.1这几种技术框架整合在一起,以构建一个功能完善的Java EE项目。该文档的目标是帮助开发人员理解如何在实际项目中应用这些框架,并确保它们能够协同...