junit3和junit4是两个非常不同的版本,二者的内部实现有很大的不同。所有的testcase都是在Runner下执行的, 可以将Runner理解为junit运行的容器, 默认情况下junit会使用BlockJUnit4ClassRunner作为所有testcase的执行容器。 如果要定制自己的junit, 则可以实现自己的Runner,最简单的办法就是JUnit4ClassRunner继承。
以下是在eclipse里面运行的stack
对以下几个类做简单分析
ClassRequest继承自Request,Request是对于一次测试的抽象描述,旧版本的junit是不需要Request的,从junit4开始,主要是为了支持一些扩展的功能,比如filter, sorting等
再回到ClassRequest, 创建Runner
@Override
public Runner getRunner() {
return new AllDefaultPossibilitiesBuilder(fCanUseSuiteMethod).safeRunnerForClass(fTestClass);
}
AllDefaultPossibilitiesBuilder继承自RunnerBuilder,
@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;
}
RunnerBuilder是构建runner的策略基类,
ignoredBuilder 会检查测试类是不是标记@Ignore,如果是的话,会创建IgnoredClassRunner, 说明这个测试类是被忽略的,所有的test case都不用运行
annotatedBuilder 会检查测试类是不是标记@RunWith,如果是的话,会创建IgnoredClassRunner,@RunWith注解告诉JUnit它使用org.junit.runner.Suite。这个运行机允许你手工地构建一个包含测试(可能来自许多类)的测试集。
junit3Builder判断测试类是否是pre-junit4的测试用例,是的话,创建JUnit38ClassRunner,
junit4Builder 创建junit3Builder BlockJUnit4ClassRunner
下面主要说一下Runner