JUnit4.8.2源代码分析-1说明

由于yqj2065下载使用的BlueJ集成的是JUnit4.8.2,所以就分析一下JUnit4.8.2的源代码。

JUnit是由GOF 之一的Erich Gamma
和 Kent Beck 编写的一个开源的单元测试框架,分析JUnit源代码的主要目的是学习其中对设计模式的运用。JUnit也是一个研究如何应对版本升级和接口变化的案例。

阅读源代码,首先需要知道该框架的设计需求。如果使用过JUnit,单元测试的需求应该比较熟悉。从简单的例子入手,有应用程序(待测试的类)HelloWorld,为了使用JUnit4测试它,需要设计一个HelloWorldTest,当然,在BlueJ中我们不需要敲代码。

package myTest;
public class HelloWorld {
    public double add(double m,double n){
        return m+n;
    }
    public double add2(double m,double n){
        return m+n;
    }
}
package myTest;
import org.junit.Test;//@Test
import static org.junit.Assert.*;//assertEquals
public class TestInJUnit4{
    @Test
    public void add(){
        HelloWorld h = new HelloWorld();
        assertEquals(7.0, h.add(1, 2), 0.1);
    }
}

单元测试类TestInJUnit4则是手工敲的代码,单元测试类图标为暗绿色,可以直接执行其@Test方法。

JUnit将处理的是单元测试类,@Test等标注/Annotation定义一项测试。JUnit通过反射解析RUNTIME标注

单元测试类的一个测试用例/a test case是一个public void 方法。

package org.junit;
import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Test {
	/**
	 * Default empty exception
	 */
	static class None extends Throwable {
		private static final long serialVersionUID= 1L;
		private None() {
		}
	}

	/**
	 * Optionally specify <code>expected</code>, a Throwable, to cause a test method to succeed iff
	 * an exception of the specified class is thrown by the method.
	 */
	Class<? extends Throwable> expected() default None.class;

	/**
	 * Optionally specify <code>timeout</code> in milliseconds to cause a test method to fail if it
	 * takes longer than that number of milliseconds.*/
	long timeout() default 0L;
}

org.junit.Ignore @Target({ElementType.METHOD, ElementType.TYPE})

@Before和@After标示的方法只能各有一个,取代了JUnit以前版本中的setUp和tearDown方法

org.junit.BeforeClass @Target(ElementType.METHOD)

org.junit.Before @Target(ElementType.METHOD)

org.junit.AfterClass @Target(ElementType.METHOD)

org.junit.After @Target(ElementType.METHOD)

org.junit.runner.RunWith 使用指定Runner运行测试。默认的Runner为org.junit.runners.JUnit4。

org.junit.runners.Suite.SuiteClasses将所有需要运行的测试类组成组/ Suite,一次性的运行以方便测试工作。

org.junit.runners.Parameterized.Parameters参数化测试

时间: 2024-12-31 13:35:30

JUnit4.8.2源代码分析-1说明的相关文章

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.8.2源代码分析-4 RunNotifier与RunListener

JUnit4执行过程中,org.junit.runner.notification. RunListener和RunNotifier运用了观察者模式. 1.观察者 观察者Observer/Listener主要作用是分析各种事件并定义相应的回调接口.例如JDK中MouseListener处理鼠标键相关的5个动作:鼠标键被按下/pressed.释放/released.单击/clicked.光标进入或离开某组件/enters or exits.java.awt.event .MouseListener

JUnit4.8.2源代码分析-5 Statement

org.junit.runners.model.Statement/语句是对运行JUnit测试组过程中的一个或多个动作的封装.如果说Runner.run()表示运行JUnit测试组的整个过程,则Statement表示其中或大或小的步骤.针对方法的标注如@Test .@Before.@After.@BeforeClass.@AfterClass具有某些执行的顺序,Statement是整个过程的一个步骤结点,而诸多Statement构成的链式结构表达了整个过程.在各种Runner中广泛使用它们. o

JUnit4.8.2源代码分析-3 TestClass 和RunnerBuilder

吃柿子专挑软的捏.JUnit4的核心是org.junit.runner.Runner,它涉及的类型太多,今天看几个简单的类型.看完了而且不准备回头再看的类型,yqj2065会在BlueJ中将它删除.删除如NullBuilder时,将import org.junit.internal.builders.NullBuilder加到本包的它的客户类中(其他包使用的,是BlueJ库中引入的包文件中的类),以保证整个项目可以编译和生成JavaDoc. org.junit.runners.model.Tes

JUnit4.8.2源代码分析-3.2 Computer

本系列文章,记录yqj2065阅读JUnit源代码的过程,很多时候在阅读过程中有许多不理解的地方,例如某某类是干什么的,为什么需要它,为什么不这样设计--等等. org.junit.runner是JUnit最核心的包,其中的Computer/计算机(是这样翻译么),它是个什么意思呢?刚开始读JUnitCore的时候,我就很不明白. package org.junit.runner; import org.junit.runners.Suite; import org.junit.runners.

JUnit4.8.2源代码分析-3.1 Description-测试树

重新把org.junit.runner.Description的源代码读了一下,结合成组测试(Suite)了解Description所表示的测试树. Description使用组合模式描述一个测试的信息.所有元素都是Composite对象. 例如myTest.units包中有Unit1.Unit2.Unit3,而SuiteUnit将Unit2.Unit3和myTest.param.ParametTestUnit组成一组.     public static void tree(){      

JUnit4.8.2源代码分析-6.1 排序和过滤

Runner.sort.Request.sortWith和Sorter.apply yqj2065都快被它们搞死了. Sorter.apply().Request.sortWith()和Sortable.sort()三者做一件事情?为什么呢? java.util.Comparator接口是一个策略类,定义了int compare(T o1, T o2)方法.org.junit.runner.manipulation.Sorter implements Comparator<Description

JUnit4.8.2源代码分析-5.1 Statement之复合命令

抽象类Statement作为命令模式的Command,只有一个方法public abstractvoid evaluate() throws Throwable; 作为命令模式的Invoker的各种Runner,将发出各种Statement并以它们表示运行JUnit测试组的整个过程.针对方法的标注如@Test .@Before.@After.@BeforeClass.@AfterClass和各种测试场景,JUnit在org.junit.internal.runners.statements包中定

【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