JUnit
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 | /* |
- 在项目中创建一个 test 类 TestJunit
1 | import org.junit.Test; |
基本用法
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
类收集所有执行测试案例的结果。它是收集参数层面的一个实例。这个实验框架区分失败和错误。失败是可以预料的并且可以通过假设来检查。错误是不可预料的问题就像 ArrayIndexOutOfBoundsException
。TestResult
类的一些重要方法列式如下:
序号 | 方法和描述 |
---|---|
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) 返回会失败的测试并且记录警告信息。 |