org.junit.runner.Runner它是JUnit作业引擎。它在许多类型的支持下的。处理试验和生产(Description)、Failure和Result和其它输出。

Runner参见图主类层次结构。

Describable与Runner

为了保证Runner的子类都有一个Description(虚域模式)数据来源/成员变量,Runner implements Describable

package org.junit.runner;
public interface Describable {
/**
* @return a {@link Description} showing the tests to be run by the receiver
*/
public abstract Description getDescription();
}

依照凝视可知。runner.getDescription()将返回消息接收者runner将执行的測试的Description/測试树。JUnit中Runner是一个抽象类,

package org.junit.runner;
import org.junit.runner.notification.RunNotifier;
public abstract class Runner implements Describable {
//public abstract Description getDescription();//能够省略
public abstract void run(RunNotifier notifier);
public int testCount() {
return getDescription().testCount();
}
}

yqj2065不喜欢当中的廉价方法testCount(),或者说我更希望将Runner设计成接口。

ParentRunner<T>

排序和过滤临时不讨论。

<T>

ParentRunner<T>的取名,意味着本执行器是測试树的某个"parent node" 的执行器。然而对执行器而言,"parent node"仅仅有单元測试类和成组測试类,因而ParentRunner<T>有两个子类型BlockJUnit4ClassRunner和Suite。其它非父结点的Runner。有IgnoredClassRunner、ErrorReportingRunner等。

ParentRunner<T>的类型參数T。代表其某种孩子的类型。这是一个较别致的设计

private List<T> fFilteredChildren= null;

protected abstract List<T> getChildren();

protected abstract Description describeChild(T child);

protected abstract void runChild(T child, RunNotifier notifier);

BlockJUnit4ClassRunner针对一个单元測试类,它没有子执行器。因而此时T为FrameworkMethod

Suite针对一个成组測试类,它有若干子执行器。T为Runner

由此可知,执行器相应測试树也是一个树形结构,而一个单元測试类仅拥有一个BlockJUnit4ClassRunner。

这些抽象方法是ParentRunner<T>最重要的内容。

Must be overridden

RunnerScheduler

该接口表示运行測试方法时的时序调度策略,是顺序运行还是并行。在ParentRunner<T>中默认採用顺序运行。于是我们看见了难得一见的Runnable.run()的直接调用。

	private RunnerScheduler fScheduler= new RunnerScheduler() {
public void schedule(Runnable childStatement) {
childStatement.run();
} public void finished() {
// do nothing
}
};

也能够通过public void setScheduler(RunnerScheduler scheduler)来设置。

classBlock

正如【JUnit4.10源码分析】5.2 Rule所介绍的。TestRule声明工厂方法,TestRule的实现类将创建装饰模式中的Statement装饰对象。classBlock(final RunNotifier notifier)代码也创建一个复杂的Statement装饰对象,依照yqj2065的想法,应该将相关代码提取出来。然而。childrenInvoker(notifier)和withClassRules(statement)代码的抽取并不easy。

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

1.Statement statement= childrenInvoker(notifier);

给出了ParentRunner的基本操作,我们将private void runChildren(final RunNotifier notifier)内联后,代码为:

    protected Statement childrenInvoker(final RunNotifier notifier) {
return new Statement() {
@Override public void evaluate() {
for (final T each : getFilteredChildren())
fScheduler.schedule(new Runnable() {
public void run() {
ParentRunner.this.runChild(each, notifier);
}
});
fScheduler.finished();
}
};
}

它的确以匿名类的方式创建Statement装饰对象,然而它与ParentRunner耦合太强,代码中调用了(第4行)getFilteredChildren()、(第5行)依赖域fScheduler、(第6行)调用了待子类提供实现的runChild()。因而能够将它设计成内部类而非一个方法。看起来比較舒服一点。

    protected class ChildrenInvoker extends Statement{
final RunNotifier notifier;
ChildrenInvoker(RunNotifier notifier){
this.notifier =notifier;
} @Override public void evaluate() {
for (final T each : getFilteredChildren())
fScheduler.schedule(new Runnable() {
public void run() {
ParentRunner.this.runChild(each, notifier);
}
});
fScheduler.finished();
}
}

statement= withBeforeClasses(statement);

statement= withAfterClasses(statement);

这两部分的代码非常easy放在一个新类中,如同JUnit4.8.2源码分析-5.1 Statement之复合命令演示的那样。

statement= withClassRules(statement);

放在一个新类中,须要提供fTestClass和getDescription()两个參数。

如此这般的折腾,就是体会一下装饰模式在使用中能够出现的各种变体。

TestRule这样的工厂方法(规则)、或直接的方法形式如JUnit眼下的实现

版权声明:本文博主原创文章。博客,未经同意不得转载。

【JUnit4.10来源分析】6 Runner的更多相关文章

  1. 【JUnit4.10来源分析】0导航

    JUnit靠GOF 中的一个Erich Gamma和 Kent Beck 单元测试框架编写一个开源,yqj2065分析JUnit的主要目的是源 中学习对设计模式的运用. JUnit也是一个学习Java ...

  2. 【JUnit4.10源码分析】5 Statement

    假设要评选JUnit中最最重要的类型.或者说核心,无疑是org.junit.runners.model.Statement.Runner等类型看起来热闹而已. package org.junit.ru ...

  3. 【JUnit4.10源码分析】6.1 排序和过滤

    abstract class ParentRunner<T> extends Runner implements Filterable,Sortable 本节介绍排序和过滤. (尽管JUn ...

  4. 【JUnit4.10源码分析】5.2 Rule

    标注@Rule TestRule是一个工厂方法模式中的Creator角色--声明工厂方法. package org.junit.rules; import org.junit.runner.Descr ...

  5. 团队作业10——事后分析(Beta版本)

    团队作业10--事后分析(Beta版本) 目录 一.设想与目标 二.计划 三.资源 四.变更管理 五.设计与实现 六.测试与发布 七.总结 八.图片和贡献分分配 一.设想和目标 1.我们的软件要解决什 ...

  6. ZZ:Solaris 10 软件包分析

    ZZ:Solaris 10 软件包分析 http://blog.chinaunix.net/uid-22759617-id-276756.html # Last updated: 2006-02-14 ...

  7. JUnit4.8.2来源分析-2 org.junit.runner.Request

    JUnit4.8.2源代码,最为yqj2065兴趣是org.junit.runner.Request,现在是几点意味着它? ①封装JUnit的输入 JUnit4作为信息处理单元,它的输入是单元測试类- ...

  8. JUnit4.8.2来源分析-6.1 排序和过滤

    Runner.sort.Request.sortWith和Sorter.apply yqj2065很快,他们搞死. Sorter.apply().Request.sortWith()和Sortable ...

  9. 【JUnit4.10源码分析】3.4 Description与測试树

    Description使用组合模式描写叙述一个測试树.组合模式中全部元素都是Composite对象. Description有成员变量private final ArrayList<Descri ...

随机推荐

  1. POJ 1300 Door Man - from lanshui_Yang

    Description You are a butler in a large mansion. This mansion has so many rooms that they are merely ...

  2. 关于matlab矩阵卷积conv2和傅里叶变换求卷积ifft2的关系

    先定义两个矩阵 a = [1 2 3 5 ; 4 7 9 5;1 4 6 7;5 4 3 7;8 7 5 1] %a矩阵取5*4 b = [1 5 4; 3 6 8; 1 5 7]   %b矩阵如多数 ...

  3. sdbntrjm57k

    http://www.zhihu.com/collection/24337307 http://www.zhihu.com/collection/24337259 http://www.zhihu.c ...

  4. Hadoop-2.2.0中国文献—— MapReduce 下一代 -- 公平调度

    目的 此文档描写叙述了 FairScheduler, Hadoop 的一个可插入式的调度器.同意 YARN 应用在一个大集群中公平地共享资源. 简单介绍 公平调度是一种分配资源给应用的方法,以致到最后 ...

  5. hdu2713(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2713 题意:有N个点,每个点都有一个值x,每次进行跳跃,当跳到自己所跳的第奇数个点是+x,第偶数个点时 ...

  6. 在Laravel中一步一步创建Packages

    首先要看一下Laravel官方文档,这是最新4.2的文档,假设想看中文的话点击此处,基本一样.这个github上的库setup-laravel4-package,也是一步一步介绍怎样创建一个包.并关联 ...

  7. 祖国版Solowheel!IPS103 独轮思维车 - 三个月体验报告

    http://tieba.baidu.com/f?kz=2308652773&mo_device=1

  8. iOS_16_开关控制器_modal_代码方法

    最后效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill ...

  9. Js中的onblur和onfocus事件

    html页面中,诸如按钮.文本框等可视元素都具有拥有和失去焦点的事件,这些事件在响应鼠标或键盘动作时都可激发预设的操作.本文以文本框获得和失去焦点为例简单讲解onfocus和onblur的应用. 一. ...

  10. Linux内核IP层的报文处理流程(一)

    本文主要讲解了Linux内核IP层的整体架构和对从网卡接受的报文处理流程,使用的内核的版本是2.6.32.27 为了方便理解,本文采用整体流程图加伪代码的方式对Linxu内核中IP整体实现架构和对网卡 ...