一简介
本文与之前的《JUnit学习笔记》所记述的内容是一致的只不过IDE换成了最近开始试用的NetBeansNetBeans是新近流行的一款堪与Eclipse媲美的IDE有Sun的支持最新版本RC本文使用的是中文版可以从下载
JUnit是一款由Erich Gamma(《设计模式》的作者)和Kent Beck(极限编程的提出者)编写的开源的回归测试框架供Java编码人员做单元测试之用可以从网站上免费获得本文使用的是NetBeans自带的JUnit
二创建项目
下面打开NetBeans然后点击菜单文件>新建项目打开新建项目对话框
请在类别中选择常规再从项目中选择Java应用程序然后点击下一步进入新建Java应用程序对话框
在这个对话框中需要设置项目的名称以及项目所在目录我为自己的项目起名为JUnitTest项目位置为G:\YPJCCK\JUnit\NetBeans此外请将创建主类前的对号去掉项目创建好后已经自带了JUnit
三编写用于测试的JavaBean
用于测试的JavaBean很简单名为Book只有id和name两个属性这两个属性将分别用于两个用例当中下面开始编写该JavaBean
请点击文件>新建文件打开新建文件对话框
确保项目选择的是JUnitTest然后在类别中选中Java类在文件类型中选中Java类点击下一个进入下一窗口
设置类名为Book包为netzhengjunittest设置完成后点击完成修改代码如下
package netzhengjunittest;
public class Book {
private String id = null;
private String name = null;
public String getId() {
return id;
}
public void setId(String id) {
thisid = id;
}
public String getName() {
return name;
}
public void setName(String name) {
thisname = name;
}
}
至此用于测试的JavaBean编写完成
四编写测试用例
这里只用了一个类进行测试名为BookTest该类继承自junitframeworkTestCase类BookTest类包含两个用例分别对应该类的testId和testName方法即每个方法实现了一个测试用例注意在JUnit中junitframeworkTestCase的子类中每个用来实现测试用例的方法都必须以testXXX的格式来命名这些方法在运行时会被执行此外BookTest还包括setUp和tearDown这两个方法前者在每个测试方法开始之前执行多用来做初始化后者在每个测试方法完成之后执行多用来清理资源下面开始编写BookTest
请点击文件>新建文件打开新建文件对话框
确保项目选择的是JUnitTest然后在类别中选中JUnit类在文件类型中选中现有类的测试点击下一个进入下一窗口
选择要测试的类点击完成修改代码如下
package netzhengjunittest;
import junitframeworkTestCase;
import junitframeworkAssert;
public class BookTest extends TestCase {
Book book = null;
//建议为测试类创建构造
public BookTest(String name) {
super(name);
}
protected void setUp() throws Exception {
//调用超类的setUp()以确保测试环境被初始化
supersetUp();
Systemoutprintln(测试开始!);
book = new Book();
Systemoutprintln(book对象被初始化!);
}
protected void tearDown() throws Exception {
Systemoutprintln(book对象将被清理!);
book = null;
Systemoutprintln(测试结束!);
//调用超类的tearDown()以确保测试环境被清理
supertearDown();
}
public void testId() {
booksetId(); //设置id属性的值为
//使用Assert查看id属性的值是否为
AssertassertEquals( bookgetId());
Systemoutprintln(id属性被测试!);
}
public void testName() {
booksetName(ASP); //设置name属性的值为ASP
//使用Assert查看name属性的值是否为JSP这是个必然出现错误的测试
AssertassertEquals(JSP bookgetName());
Systemoutprintln(name属性被测试!);
}
}
这里setUp和tearDown方法没什么好说的就是执行了对book对象的初始化和清理不过testId和testName需要说明一下前者是在对book的id属性进行测试首先赋值为然后使用Assert的assertEquals方法查看id属性中存放的值是否是期待的值由于我的期待值也是所以执行后这个用例应该是成功的后者则是对book的name属性进行测试也是首先赋值为ASP然后使用Assert的assertEquals方法查看其值是否是期待的由于我特意将期待值设定为根本不可能的JSP因此这个用例执行后会出现一个错误但请注意由于我是特意要让测试出现错误所以将期待值设定成了不可能的值如果你是测试人员请千万不要这么做否则如果别的地方导致了错误很容易给自己造成不必要的麻烦
下面简单介绍一下上边用到的静态类junitframeworkAssert该类主要包含个方法
.assertEquals()方法用来查看对象中存的值是否是期待的值与字符串比较中使用的equals()方法类似
.assertFalse()和assertTrue()方法用来查看变量是是否为false或true如果assertFalse()查看的变量的值是false则测试成功如果是true则失败assertTrue()与之相反
.assertSame()和assertNotSame()方法用来比较两个对象的引用是否相等和不相等类似于通过==和!=比较两个对象
.assertNull()和assertNotNull()方法用来查看对象是否为空和不为空;
.fail ()方法意为失败用来抛出错误我个人认为有两个用途首先是在测试驱动开发中由于测试用例都是在被测试的类之前编写而写成时又不清楚其正确与否此时就可以使用fail方法抛出错误进行模拟其次是抛出意外的错误比如要测试的内容是从数据库中读取的数据是否正确而导致错误的原因却是数据库连接失败
五运行BookTest
编写好BookTest后就可以运行了请在项目栏中选中BookTest点击鼠标右键选择运行文件测试信息会从输出窗口输出
六测试套件
当有多个测试类需要一次性进行测试时可以使用测试套件来完成这项工作
在NetBeans中点击文件>新建文件打开新建文件对话框
确保项目选择的是JUnitTest然后在类别中选中JUnit类在文件类型中选中测试套件点击下一个进入下一窗口
修改类名为AllTests点击完成然后修改代码如下
package netzhengjunittest;
import junitframework*;
public class AllTests extends TestCase {
public AllTests(String testName) {
super(testName);
}
public static Test suite() {
TestSuite ts= new TestSuite(AllTests);
tsaddTestSuite(BookTestclass);
return ts;
}
}
其中TestSuite是用来组织测试类的通过其addTestSuite()方法将测试类添加到ts对象中凡是添加到ts中的测试类都将在运行文件时被执行此外您也可以在定义ts对象时利用其构造函数将测试类添加给ts对象例如
TestSuite ts = new TestSuite(BookTestclass);
这并不会影响到后续使用addTestSuite()方法测试套件的运行方法与之前一样
此外JUnit自身也提供了运行测试的环境但需要在NetBeans中做一些改动所以就不作详细介绍了这里只将代码给出
package netzhengjunittest;
import junitframework*;
public class Test {
public static void main(String[] args) {
//使用TestSuite组装测试类
TestSuite ts = new TestSuite();
tsaddTestSuite(TestBookclass);
//textui命令行方式
junittextuiTestRunnerrun(ts);
//swinguiSwing方式
//junitswinguiTestRunnerrun(tsgetClass());
//awtuiAWT方式
//junitawtuiTestRunnerrun(tsgetClass());
}
}
七小结
其实JUnit上手很容易远比想象的要简单的多但我觉得如何编写测试类是很需要经验的因为许多时候测试一个用例但涉及到可能不止一个类而有些时候一个类可能是做为工具使用里边涉及很多内容那么测试时是否还是只编写一个测试类呢?关于这个话题我想应该是仁者见仁智者见智的其实这才是测试的难题所在