JUnit

什么是JUnit

JUnit 是一个 Java 编程语言的单元测试框架。JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一。

JUnit 促进了“先测试后编码”的理念,强调建立测试数据的一段代码,可以先测试,然后再应用。这个方法就好比“测试一点,编码一点,测试一点,编码一点……”,增加了程序员的产量和程序的稳定性,可以减少程序员的压力和花费在排错上的时间。

特点

  • JUnit 是一个开放的资源框架,用于编写和运行测试。
  • 提供注解来识别测试方法。
  • 提供断言来测试预期结果。
  • 提供测试运行来运行测试。
  • JUnit 测试允许你编写代码更快,并能提高质量。
  • JUnit 优雅简洁。没那么复杂,花费时间较少。
  • JUnit 测试可以自动运行并且检查自身结果并提供即时反馈。所以也没有必要人工梳理测试结果的报告。
  • JUnit 测试可以被组织为测试套件,包含测试用例,甚至其他的测试套件。
  • JUnit 在一个条中显示进度。如果运行良好则是绿色;如果运行失败,则变成红色。

环境搭建

本地环境设置

JUnit 是 Java 的一个框架,所以最根本的需要是在你的机器里装有 JDK。

系统要求

JDK 1.5或1.5以上
内存 没有最小要求
磁盘空间 没有最小要求
操作系统 没有最小要求

上表的没有最小要求不是代表Junit不占空间,而是只要能运行起java程序,就能运行Junit(等价于Junit需要的要求和jdk需要的要求相同)。

步骤1:在你的机器里验证 Java 装置

现在打开控制台,执行以下 java 要求。

操作系统 任务 命令
Windows 打开命令操作台 c:>java -version
Linux 打开命令终端 $ java -version
Mac 打开终端 machine:~ joseph$ java -version

我们来验证一下所有操作系统的输出:

操作系统 输出
Windows java 版本 “1.6.0_21” Java(TM)SE 运行环境(build 1.6.0_21-b07) Java 热点(TM)客户端虚拟机(build 17.0-b17,混合模式,共享)
Linux java 版本“1.6.0_21” Java(TM)SE 运行环境(build 1.6.0_21-b07) Java 热点(TM)客户端虚拟机(build 17.0-b17,混合模式,共享)
Mac java 版本“1.6.0_21” Java(TM)SE 运行环境(build 1.6.0_21-b07) Java 热点(TM)64-字节服务器虚拟机(build 17.0-b17,混合模式,共享)

如果你还没有安装 Java,从以下网址安装 http://www.oracle.com/technetwork/java/javase/downloads/index.html Java SDK。我们采用 Java 1.6.0_21 作为本教程的安装版本。

步骤2:设置 JAVA 环境

设置 JAVA_HOME 环境变量,使之指向基本目录位置,即在你机器上安装 Java 的位置。

OS 输出
Windows 设置环境变量 JAVA_HOME to C:\Program Files\Java\jdk1.6.0_21
Linux 输出 JAVA_HOME=/usr/local/java-current
Mac 输出 JAVA_HOME=/Library/Java/Home

系统路径添加 Java 编译器位置。

OS 输出
Windows 在系统变量路径末端添加字符串 ;C:\Program Files\Java\jdk1.6.0_21\bin
Linux 输出 PATH=$PATH:$JAVA_HOME/bin/
Mac 不需要

使用以上解释的 Java-version 命令验证 Java 安装。

步骤3:下载 Junit 档案

http://www.junit.org 下载 JUnit 最新版本的压缩文件。在编写这个教程的同时,我已经下载了 Junit-4.10.jar 并且将它复制到 C:>JUnit 文件夹里了。

OS 档案名称
Windows junit4.10.jar
Linux junit4.10.jar
Mac junit4.10.jar

步骤4:设置 JUnit 环境

设置 JUNIT_HOME 环境变量,使之指向基本目录位置,即在你机器上安装 JUNIT 压缩文件的位置。假设,我们已经在以下不同的操作系统的 JUNIT 文件夹里存储了 junit4.10.jar。

OS 输出
Windows 设置环境变量 JUNIT_HOME 到 C:\JUNIT
Linux 输出 JUNIT_HOME=/usr/local/JUNIT
Mac 输出 JUNIT_HOME=/Library/JUNIT

步骤5:设置 CLASSPATH 变量

设置 CLASSPATH 环境变量,使之指向 JUNIT 压缩文件位置。假设,我们已经在以下不同的操作系统的 JUNIT 文件夹里存储了 junit4.10.jar 。

OS 输出
Windows 设置环境变量 CLASSPATH 到 %CLASSPATH%;%JUNIT_HOME%\junit4.10.jar;.;
Linux 输出 CLASSPATH=$CLASSPATH:$JUNIT_HOME/junit4.10.jar:.
Mac 输出 CLASSPATH=$CLASSPATH:$JUNIT_HOME/junit4.10.jar:.

步骤6:设置 Eclipse 环境

  • 打开 eclipse -> 右击 project 并 点击 property > Build Path > Configure Build Path,然后使用 Add External Jar 按钮在函数库中添加 junit-4.10.jar。
  • 我们假设你的 eclipse 已经内置了 junit 插件并且它在 C:>eclipse/plugins 目录下,如不能获得,那么你可以从 JUnit Plugin 上下载。在 eclipse 的插件文件夹中解压下载的 zip 文件。最后重启 eclipse。

步骤7:核实 Eclipse 中的 Junit 安装

  • 在 eclipse 的任何位置上创建一个 TestJunit 项目。
  • 创建一个 MessageUtil 类来在项目中测试。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
* This class prints the given message on console.
*/
public class MessageUtil {

private String message;

//Constructor
//@param message to be printed
public MessageUtil(String message){
this.message = message;
}

// prints the message
public String printMessage(){
System.out.println(message);
return message;
}
}
  • 在项目中创建一个 test 类 TestJunit
1
2
3
4
5
6
7
8
9
10
11
12
13
import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class TestJunit {

String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);

@Test
public void testPrintMessage() {
assertEquals(message,messageUtil.printMessage());
}
}

基本用法

JUnit的一些注意事项:

  • 测试方法必须使用 @Test 修饰
  • 测试方法必须使用 public void 进行修饰,不能带参数
  • 一般使用单元测试会新建一个 test 目录存放测试代码,在生产部署的时候只需要将 test 目录下代码删除即可
  • 测试代码的包应该和被测试代码包结构保持一致
  • 测试单元中的每个方法必须可以独立测试,方法间不能有任何依赖
  • 测试类一般使用 Test 作为类名的后缀
  • 测试方法使一般用 test 作为方法名的前缀

测试失败说明:

  • Failure:一般是由于测试结果和预期结果不一致引发的,表示测试的这个点发现了问题
  • error:是由代码异常引起的,它可以产生于测试代码本身的错误,也可以是被测试代码中隐藏的 bug

一些常用注解:

  • @Test:将一个普通方法修饰成一个测试方法 @Test(excepted=xx.class): xx.class 表示异常类,表示测试的方法抛出此异常时,认为是正常的测试通过的 @Test(timeout = 毫秒数) :测试方法执行时间是否符合预期
  • @BeforeClass: 会在所有的方法执行前被执行,static 方法 (全局只会执行一次,而且是第一个运行)
  • @AfterClass:会在所有的方法执行之后进行执行,static 方法 (全局只会执行一次,而且是最后一个运行)
  • @Before:会在每一个测试方法被运行前执行一次
  • @After:会在每一个测试方法运行后被执行一次
  • @Ignore:所修饰的测试方法会被测试运行器忽略
  • @RunWith:可以更改测试运行器 org.junit.runner.Runner
  • Parameters:参数化注解

JUnit - API

JUnit 中的最重要的程序包是 junit.framework 它包含了所有的核心类。一些重要的类列示如下:

序号 类的名称 类的功能
1 Assert assert 方法的集合
2 TestCase 一个定义了运行多重测试的固定装置
3 TestResult TestResult 集合了执行测试样例的所有结果
4 TestSuite TestSuite 是测试的集合
Assert 类

这个类提供了一系列的编写测试的有用的声明方法。只有失败的声明方法才会被记录。Assert类的重要方法列式如下:

序号 方法和描述
1 void assertEquals(boolean expected, boolean actual) 检查两个变量或者等式是否平衡
2 void assertFalse(boolean condition) 检查条件是假的
3 void assertNotNull(Object object) 检查对象不是空的
4 void assertNull(Object object) 检查对象是空的
5 void assertTrue(boolean condition) 检查条件为真
6 void fail() 在没有报告的情况下使测试不通过
TestCase 类

TestCase 类的一些重要方法列式如下:

序号 方法和描述
1 int countTestCases() 为被run(TestResult result) 执行的测试案例计数
2 TestResult createResult() 创建一个默认的 TestResult 对象
3 String getName() 获取 TestCase 的名称
4 TestResult run() 一个运行这个测试的方便的方法,收集由TestResult 对象产生的结果
5 void run(TestResult result) 在 TestResult 中运行测试案例并收集结果
6 void setName(String name) 设置 TestCase 的名称
7 void setUp() 创建固定装置,例如,打开一个网络连接
8 void tearDown() 拆除固定装置,例如,关闭一个网络连接
9 String toString() 返回测试案例的一个字符串表示
TestResult 类

TestResult 类收集所有执行测试案例的结果。它是收集参数层面的一个实例。这个实验框架区分失败和错误。失败是可以预料的并且可以通过假设来检查。错误是不可预料的问题就像 ArrayIndexOutOfBoundsExceptionTestResult 类的一些重要方法列式如下:

序号 方法和描述
1 void addError(Test test, Throwable t) 在错误列表中加入一个错误
2 void addFailure(Test test, AssertionFailedError t) 在失败列表中加入一个失败
3 void endTest(Test test) 显示测试被编译的这个结果
4 int errorCount() 获取被检测出错误的数量
5 Enumeration errors() 返回错误的详细信息
6 int failureCount() 获取被检测出的失败的数量
7 void run(TestCase test) 运行 TestCase
8 int runCount() 获得运行测试的数量
9 void startTest(Test test) 声明一个测试即将开始
10 void stop() 标明测试必须停止
TestSuite 类

TestSuite 类是测试的组成部分。它运行了很多的测试案例。TestSuite 类的一些重要方法列式如下:

序号 方法和描述
1 void addTest(Test test) 在套中加入测试。
2 void addTestSuite(Class<? extends TestCase> testClass) 将已经给定的类中的测试加到套中。
3 int countTestCases() 对这个测试即将运行的测试案例进行计数。
4 String getName() 返回套的名称。
5 void run(TestResult result) 在 TestResult 中运行测试并收集结果。
6 void setName(String name) 设置套的名称。
7 Test testAt(int index) 在给定的目录中返回测试。
8 int testCount() 返回套中测试的数量。
9 static Test warning(String message) 返回会失败的测试并且记录警告信息。