junit 所有执行的结果都存放在 Result 中:
// 所有 case 数
private final AtomicInteger count;
// 忽略执行的 case 数(被打了 ignore)
private final AtomicInteger ignoreCount;
// 失败 case 数
private final AtomicInteger assumptionFailureCount;
// 所有失败 case 的结果
private final CopyOnWriteArrayList<Failure> failures;
// 执行时间
private final AtomicLong runTime;
// 开始时间
private final AtomicLong startTime;
Result 中内置了一个默认的来监听器,这个监听器会在每个 case 执行完成之后进行相应的回调,Listener 如下:
@RunListener.ThreadSafe
private class Listener extends RunListener {
// 设置开始时间
@Override
public void testRunStarted(Description description) throws Exception {
startTime.set(System.currentTimeMillis());
}
// 执行完所有 case
@Override
public void testRunFinished(Result result) throws Exception {
long endTime = System.currentTimeMillis();
runTime.addAndGet(endTime - startTime.get());
}
// 执行完某个 case
@Override
public void testFinished(Description description) throws Exception {
count.getAndIncrement();
}
// 执行完某个 case 失败
@Override
public void testFailure(Failure failure) throws Exception {
failures.add(failure);
}
// 执行完某个ignore case
@Override
public void testIgnored(Description description) throws Exception {
ignoreCount.getAndIncrement();
}
@Override
public void testAssumptionFailure(Failure failure) {
// Assumption 产生的失败
assumptionFailureCount.getAndIncrement();
}
}
JUnit 4 开始在测试中支持假设 Assumptions,在 Assumptions 中,封装了一组使用的方法,以支持基于假设的条件测试执行。假设实际就是指定某个特定条件,假如不能满足假设条件,假设不会导致测试失败,只是终止当前测试。这也是假设与断言的最大区别,因为对于断言而言,会导致测试失败。
所以 JUnit 通过监听器机制收集所有的测试信息,最终封装到 Result 中返回。
Junit 中有一些比较基本的概念,比如 Runner,statement 等;在初始化时,默认情况下 junit 会构建出 BlockJUnit4ClassRunner 这样的一个 Runner,并且在这个 Runner 中会持有被测试类的所有信息。Runner 运行测试并在执行此操作时将重要事件通知 RunNotifier。
也可以使用 RunWith 调用自定义 Runner,这里只要你的 Runner 是 org.junit.runner.Runner 子类即可;创建自定义运行程序时,除了在此处实现抽象方法外,还必须提供一个构造函数,这个构造函数将包含测试的类作为参数--如:SpringRunner。
Runner 的 run 方法内部就是构建和执行 Statement 链的过程,Statement 中描述了单元测试中需要执行的一系列操作,每个 case 均以 RunnerAfter -> TargetMethod -> RunnerBefore 的执行顺序依次执行;执行过程中,junit 通过监听器机制回调 case 调用的每个生命周期阶段,并将各个case 执行的信息进行收集汇总,最终返回执行结果 Result 。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理