JUnit4源码学习笔记

先上一个在Spring-test下运行的调用栈

 

自底向上:

JUnitStarter

IDEA对JUnit的支持,调用JUnitCore.run(Runner),将注解@RunWith指定的Runner作为参数传给JUnit。该方法注释“Do not use. Testing purposes only.”,

JUnitCore

运行JUnit测试的入口。通过调用run()方法启动测试。

Runner

testcase运行的容器。JUnit默认使用BlockJUnit4ClassRunner。

鼓励扩展实现自己的Runner。例如Spring-test扩展BlockJUnit4ClassRunner实现了SpringJUnit4ClassRunner。

RunNotifier

在testcase开始、结束、成功、失败、忽略时,通知JUnit。

RunListener

测试运行事件的监听器。默认只有一个listener,在Result类内部定义,用来记录测试开始时间、耗时、成功个数、失败个数。

如果需要自定义的listener,扩展RunListener,并通过JUnitCore.addListener()添加。

Runner.run()

看下run方法的实现

  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);
        }
    }

EachTestNotifier

没看懂这个类的用意,内部类也没有文档,可能是为了以后扩展留的吧。

Statement

一个Statement是运行测试时的一段指令。看下classBlock()的实现:

protected Statement classBlock(final RunNotifier notifier) {
    Statement statement = childrenInvoker(notifier);
    statement = withBeforeClasses(statement);
    statement = withAfterClasses(statement);
    statement = withClassRules(statement);
    return statement;
}

classBlock构建了一个Statement的责任链。

第一个statement: 将所有@Test标记的方法在RunnerScheduler中执行,默认的实现是串行执行的。有没有并行执行的实现?

第二个statement:将@BeforeClass标记的方法封装成Statement,并放在责任链第一位。

第三个statement:将@AfterClass标记的方法封装成Statement,并放在责任链第一位。但是RunAfters的实现会先执行fNext(即上一步封装的RunBefores),再执行自己封装的方法。这里的实现跟当初设计fNext这个域的初衷有点不一致。

第四个statement:@ClassRule注解,工作中没用过,改天再详细了解。

接下来就是依次执行statement链了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值