1.5 设置JUnit环境
为了使用JUnit编写你的测试程序,你需要添加JUnit .jar文件到你的项目编译路径和执行路径,有如下这些步骤:
从http://www.junit.org下载JUnit 发布版本(junit-4.6或者更新)。JUnit包含几个测试样例,可以去熟悉执行JUnit测试。
将JUnit压缩包解压到你电脑的一个路径中(例如:c:\on Windows 或者 /opt/on UNIX)。
在这个路径中,解压文件将创建一些JUnit的子文件(例如:c:\junit4.6 或者/opt/junit4.6)。
现在使用JUnit可以运行测试程序了,JUnit完成java程序的测试然后可以使用视图查看测试结果,控制台输出包括一个基于文本的测试运行器。
在你的操作系统打开一个命令行如c:\junit4.6或者/opt/junit4.6,运行这个文本测试运行器。
输入合适的命令:
Windows:
java -cp junit-4.6.jar;. junit.samples.ALLTests
UNIX:
java -cp junit-4.6.jar:. junit.samples.ALLTests
这个ALLTests类包含一个main主方法去执行测试样例:
public static void main(String[] args){
junit.testui.TestRunner.run(suite());
}
图1.1显示了测试的结果。
JUnit文本测试运行器使用许多点(....)显示测试通过。如果有错误产生,异常显示将代替点。
在本书的第三部分,我们将看到如何使用Ant构建工具和Maven构建工具。
1.6使用JUNit测试
JUnit有许多特性可以很容易地编写和执行测试,你将看到这些特性在本书的学习过程中:
n 将测试类实例和类加载相分离以避免单元测试间的相互影响
n JUnit annotations 提供资源初始化和回收方法:
@Before,@BeforeClass,@After,@AfterClass
n 有不同类型的断言方法可以更容易地检查测试的结果
n 可以和流行的工具相集成,像Ant和Maven,流行的开发环境像Eclipse,NetBeans,IntelliJ
和JBuilder。
事不宜迟,我们看列表1.4使用JUnit编写Calculator类测试。
LIsting 1.4 The JUnit CalculatorTest program
import static org.java.Assert.*;
import org.java.Test;
public class CalculatorTest{
@Test
public void testAdd(){
Calculator calculator = new Calculator();
double result = calculator.add(10,50);
assertEquals(60,result,0);
}
}
这是一个相当简单的测试,我们来逐步浏览它:
1.我们开始创建一个测试类CalculatorTest,唯一的限制的是这个测试类的访问控制权限必须声明为public,我们可以任意地对它命名,但通常实际上都是以Test结尾。需要注意的是在JUnit3版本中,测试类都需要继承TestCase类,但是这个要求在JUnit4中被移除了。
2.我们通过添加@Test注释标记测试方法,使testAdd()成为一个单元测试方法,一个最好的实践命名方式是测试方法须遵循testXXXX模式,JUnit对方法名没有限制,你可以命名任何你想到的名字,只要方法前面有@Test注释,JUnit都将执行他们。
3.我们通过创建一个Calculator类的实例calculator来开始测试。
4.在之前,我们执行后通过调用类方法去测试,通过输入两个已知的值。
5.JUnit框架开始发挥作用了,检查这个测试的结果,我们调用一个assertEquals方法,在类开始的第一行我们使用静态导入,关于assertEquals方法的Javadoc文档如下:
/**
*断言两个doubles类型或者floats是否相等在一个合适的误差值下
*如果期望的值为无穷大则误差范围将忽略
*/
static public void assertEquals( double expected,double actual,double delta);
在列表1.4,我们通过assertEquals使用这些参数:
expected = 60
actual =result
delta = 0
因为我们输入计算10和50两个值,我们告诉assertEquals希望和为60.(我们输入0作为误差值因为我们计算的是两个整数之和)。当我们调用calculator对象时,我们把结果插入局部double类型命名为result,因此,我们通过变量,assertEquals方法比较60的期望值。
假如实际的值不等于期望的值,JUnit抛出一个unchecked异常,将引起测试失败。
大多时候,delta参数值一般为0,我们一般忽略它,它一般涉及到那些不总是需要精确计算结果的地方,包括很多位浮点数的计算,delta提供了一个可变的因素。假如实际值在expected-delta和expected+delta范围之中,那么测试将通过,可以能发现它很有用,尤其是在做四舍五入的数学计算,误差截断,或者当断言一个条件是关于一个文件的修改日期时,因为日期的准确性依赖于所用的操作系统。
我们假设列表1.1和1.4编码的路径是c:\junit-book\ch01-jumpastart,
(/opt/junitbook/ch01-jumpstart on UNIX)。我们进入这个目录打开一个命令行开始编译这
个代码(我们将假设在此路径可执行javac命令):
Windows:
javac -cp \junit4.6\junit-4.6.jar *.java
UNIX:
javac -cp /opt/junit4.6/junit-4.9.jar *.java
图1.2展示了测试的结果
使用JUnit的标记特性可以看出,在列表1.4中使用JUnit编写测试代码比列表1.2中的测试程序更容易,另外,我们能也通过JUnit框架自动地运行测试。
当我们从命令行运行测试时(图1.2),我们看到了测试所花的时间和测试通过过的数量,这里有许多其它方式去运行测试,使用Eclipse 集成开发环境,构建工具Ant,这个简单的例子使你尝到了使用JUnit进行单元测试带来的好处。
1.7 总结
每一个开发者都应该进行某些测试来看代码是否工作,开发者们使用自动化单元测试能够重复执行他们的测试,要求去确认新的代码工作同时不能破坏已经存在的测试。
不使用JUnit创建一个简单的单元测试一点都不困难,但是随着测试的增加和变得越来越复杂,编写和维护测试代码变得越来越困难,JUnit是一个单元测试框架,可以使单元测试很容易去创建,运行,回归单元测试。
在这一章中,我们通过一个简单的测试了解了JUnit一些表面的功能,JUnit的功能远不如此。
在第二章中,我们将更仔细地查看JUnit框架的各种类(不同的annotation和assertion机制),他们如何在一起工作使单元测试变得有效和有效率,我们也将浏览JUnit3的旧功能和JUnit4新特性的一些不同。
未完待续.....