没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
单元测试利器 JUnit 4
本文主要介绍了如何使用 JUnit 4 提供的各种功能开展有效的单元测试,并通过一个实例演示了如何使用
Ant 执行自动化的单元测试。本文假设读者对 Eclipse 下进行 Java 开发有一定的经验,并了解 Java 5
中的注解(annotation)特性。
引言
毋庸置疑,程序员要对自己编写的代码负责,您不仅要保证它能通过编译,正常地运行,而且要满足需求
和设计预期的效果。单元测试正是验证代码行为是否满足预期的有效手段之一。但不可否认,做测试是件
很枯燥无趣的事情,而一遍又一遍的测试则更是让人生畏的工作。幸运的是,单元测试工具 JUnit 使这一
切变得简单艺术起来。
JUnit 是 Java 社区中知名度最高的单元测试工具。它诞生于 1997 年,由 Erich Gamma 和 Kent
Beck 共同开发完成。其中 Erich Gamma 是经典著作《设计模式:可复用面向对象软件的基础》一书
的作者之一,并在 Eclipse 中有很大的贡献;Kent Beck 则是一位极限编程(XP)方面的专家和先驱。
麻雀虽小,五脏俱全。JUnit 设计的非常小巧,但是功能却非常强大。Martin Fowler 如此评价 JUnit:
在软件开发领域,从来就没有如此少的代码起到了如此重要的作用。它大大简化了开发人员执行单元测试
的难度,特别是 JUnit 4 使用 Java 5 中的注解(annotation)使测试变得更加简单。
JUnit 4 初体验
在开始体验 JUnit 4 之前,我们需要以下软件的支持:
� Eclipse:最为流行的 IDE,它全面集成了 JUnit,并从版本 3.2 开始支持 JUnit 4。当然 JUnit
并不依赖于任何 IDE。您可以从 http://www.eclipse.org/ 上下载最新的 Eclipse 版本。
� Ant:基于 Java 的开源构建工具,您可以在 http://ant.apache.org/ 上得到最新的版本和丰
富的文档。Eclipse 中已经集成了 Ant,但是在撰写本文时,Eclipse 使用的 Ant 版本较低(必
需 1.7 或者以上版本),不能很好的支持 JUnit 4。
� JUnit:它的官方网站是 http://www.junit.org/。您可以从上面获取关于 JUnit 的最新消息。
如果您和本文一样在 Eclipse 中使用 JUnit,就不必再下载了。
首先为我们的体验新建一个 Java 工程 —— coolJUnit。现在需要做的是,打开项目 coolJUnit 的属性
页 -> 选择“Java Build Path”子选项 -> 点选“Add Library…”按钮 -> 在弹出的“Add Library”对话
框中选择 JUnit(图 1),并在下一页中选择版本 4.1 后点击“Finish”按钮。这样便把 JUnit 引入到当
前项目库中了。
可以开始编写单元测试了吗?等等……,您打算把单元测试代码
放在什么地方呢?把它和被测试代码混在一起,这显然会照成
混乱,因为单元测试代码是不会出现在最终产品中的。建议您
分别为单元测试代码与被测试代码创建单独的目录,并保证测
试代码和被测试代码使用相同的包名。这样既保证了代码的分
离,同时还保证了查找的方便。遵照这条原则,我们在项目
coolJUnit 根目录下添加一个新目录 testsrc,并把它加入到
项目源代码目录中(加入方式见 图 2)。
请注意 JDK 的版本
JUnit 4.1 是基于 Java 5 的升级版
本,它使用了 Tiger 中的很多新特性
来简化原有的使用方式。正因为如此,
它并不能直接运行在 JDK1.4.x 版本
上。如果您需要在 JDK1.4.x 版本使
用 JUnit 的话,请使用 3.8.1 版本。
图 1 为项目添加 JUnit 库
图 2 修改项目源代码目录
现在我们得到了一条 JUnit 的最佳实践:单元测试代码和被测试代码使用一样的包,不同的目录。
一切准备就绪,一起开始体验如何使用 JUnit 进行单元测试吧。下面的例子来自笔者的开发实践:工具类
WordDealUtil 中的静态方法 wordFormat4DB 是专用于处理 Java 对象名称向数据库表名转换的方
法(您可以在代码注释中可以得到更多详细的内容)。下面是第一次编码完成后大致情形:
package com.ai92.cooljunit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 对名称、地址等字符串格式的内容进行格式检查
* 或者格式化的工具类
*
* @author Ai92
*/
public class WordDealUtil {
/**
* 将 Java 对象名称(每个单词的头字母大写)按照
* 数据库命名的习惯进行格式化
* 格式化后的数据为小写字母,并且使用下划线分割命名单词
package com.ai92.cooljunit;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class TestWordDealUtil {
//测试 wordFormat4DB 正常运行的情况
@Test public void wordFormat4DBNormal(){
String target = "employeeInfo";
String result = WordDealUtil.wordFormat4DB(target);
assertEquals("employee_info", result);
}
}
它是否能按照预期的效果执行呢?尝试为它编写 JUnit 单元测试代码如下:
很普通的一个类嘛!测试类 TestWordDealUtil 之所以使用“Test”开头,完全是为了更好的区分测试类
与被测试类。测试方法 wordFormat4DBNormal 调用执行被测试方法
WordDealUtil.wordFormat4DB,以判断运行结果是否达到设计预期的效果。需要注意的是,测试方法
wordFormat4DBNormal 需要按照一定的规范书写:
1. 测试方法必须使用注解 org.junit.Test 修饰。
2. 测试方法必须使用 public void 修饰,而且不能带有任何参数。
测试方法中要处理的字符串为“employeeInfo”,按照设计目的,处理后的结果应该为“employee_info”。
assertEquals 是由 JUnit 提供的一系列判断测试结果是否正确的静态断言方法(位于类
*
* 例如:employeeInfo 经过格式化之后变为 employee_info
*
* @param name Java 对象名称
*/
public static String wordFormat4DB(String name){
Pattern p = Pattern.compile("[A-Z]");
Matcher m = p.matcher(name);
StringBuffer sb = new StringBuffer();
while(m.find()){
m.appendReplacement(sb, "_"+m.group());
}
return m.appendTail(sb).toString().toLowerCase();
}
}
剩余16页未读,继续阅读
资源评论
小小哭包
- 粉丝: 1900
- 资源: 3864
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功