【JUnit4.10源代码分析】6 Runner

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>

排序和过滤暂时不讨论。

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。

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)来设置。

时间: 2024-10-23 08:23:42

【JUnit4.10源代码分析】6 Runner的相关文章

【JUnit4.10源代码分析】0导航

JUnit是由GOF 之一的Erich Gamma和 Kent Beck 编写的一个开源的单元测试框架,yqj2065分析JUnit源代码的主要目的是 学习其中对设计模式的运用. JUnit也是一个学习Java编程. 学习框架设计 和研究如何应对版本升级和接口变化的案例. NetBeans IDE 7.4 (Build 201310111528) 的测试库为JUnit4.10,因而在前面对JUnit4.8.2源代码分析的基础上,yqj2065将采用较正规的方式介绍JUnit4.10源代码. 10

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

如果要评选JUnit中最最重要的类型,或者说核心,无疑是org.junit.runners.model.Statement.Runner等类型看起来热闹而已. package org.junit.runners.model; /** * Represents one or more actions to be taken at runtime in the course * of running a JUnit test suite. */ public abstract class State

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

abstract class ParentRunner<T> extends Runner implements Filterable,Sortable 本节介绍排序和过滤.(虽然JUnit4.8.2源代码分析-6.1 排序和过滤中演示了客户使用排序和过滤的方式,也有些不明白其设计意图,但是,先读懂源代码为妙.说不定看着看着就明白了.) org.junit.runner.manipulation包 排序和过滤的相关类型,在org.junit.runner.manipulation包中. 1.例

【JUnit4.10源代码分析】3.4 Description与测试树

Description使用组合模式描述一个测试树.组合模式中所有元素都是Composite对象. Description有成员变量private final ArrayList<Description>fChildren= newArrayList<Description>(); //无元素 保存其子结点.fChildren非空,所以任何子结点都是一个Composite,但是this. getChildren().size()为0的结点,事实上就是叶子. 测试树 一颗测试树Desc

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

TestRule声明工厂方法 TestRule是一个工厂方法模式中的Creator角色--声明工厂方法. package org.junit.rules; import org.junit.runner.Description; import org.junit.runners.model.Statement; public interface TestRule { Statement apply(Statement base, Description description); } 测试程序员

JUnit4.8.2源代码分析-2 org.junit.runner.Request和Description

JUnit4.8.2源代码中,最令yqj2065感兴趣的是org.junit.runner.Request,它是几个意思呢? ①封装JUnit的输入 JUnit4作为信息处理单元,它的输入是单元测试类--布满各种JUnit4的RUNTIME标注的类,但由于使用反射机制,JUnit4的输入严格地说是一个或多个(组)单元测试类的Class对象.早期版本的JUnit主要处理一个测试或测试构成的树,在增添了对过滤/ filtering和排序/ sorting支持后,JUnit4加入了这个概念.毕竟按照1

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

abstract class ParentRunner<T> extends Runner implements Filterable,Sortable 本节介绍排序和过滤. (尽管JUnit4.8.2源码分析-6.1 排序和过滤中演示了客户使用排序和过滤的方式,也有些不明确其设计意图.可是.先读懂源码为妙.说不定看着看着就明确了. ) org.junit.runner.manipulation包 排序和过滤的相关类型.在org.junit.runner.manipulation包中.Sort

【JUnit4.10源码分析】5.2 Rule

标注@Rule TestRule是一个工厂方法模式中的Creator角色--声明工厂方法. package org.junit.rules; import org.junit.runner.Description; import org.junit.runners.model.Statement; public interface TestRule { Statement apply(Statement base, Description description); } 因为工厂方法apply有

Hadoop源代码分析

关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http://research.google.com/archive/googlecluster.html Chubby:http://labs.google.com/papers/chubby.html GFS:http://labs.google.com/papers/gfs.html BigTable:http://labs.googl