您所在的位置:开发 > 项目&管理 > 敏捷开发必要技巧之单元测试

敏捷开发必要技巧之单元测试

2008-03-28 13:58 Wingel JavaEye 字号:T | T
一键收藏,随时查看,分享好友!

单元测试跟验收测试有什么区别?验收测试测试的是系统的外部行为,而单元测试是测试系统内部结构,它只测一个单元(类,甚至一个方法)。验收测试属于客户的,我们没有权利决定验收测试的内容。

AD:

单元测试

假定你在写一个CourseCatalog类,这个类用来记录一些课程的信息:

class CourseCatalog {                                                   

CourseCatalog() {                                         

...        

      }                                                            

void add(Course course) { 

      ...                                   

}                                                                           

void remove(Course course) {                                    

...                                                                   

}                                                              

Course findCourseWithId(String id) {                                    

...                                                                     

}                                                                            

Course[] findCoursesWithTitle(String title) {              

...                                                  

}                                                             

}                                                                    

class Course {                                                               

Course(String id, String title, ...) {                                      

}                                                              

String getId() {                                

...                                                          

}                                                                                

String getTitle() {                                                  

...                                                                  

}                                                                             

}                   

为了保证CourseCatalog这个类没有bug,我们应该测试它。比如,为了知道它的add方法是不是真的能够将一个Course加进去,我们用下面的代码来测试:

class TestCourseCatalog {                                         

static void testAdd() {                                   

CourseCatalog cat = new CourseCatalog();                     

Course course = new Course("c001", "Java prgoramming", ...);          

cat.add(course);                                                      

if (!cat.findCourseWithId(course.getId()).equals(course)) {         

throw new TestFailException();                               

}                                                                       

}                                                               

public static void main(String args[]) {                                    

testAdd();                                                 

}  

}  

因为testAdd方法里面调用了一个equal方法,来比较两个Course对象是不是相等的,所以Course类就要提供一个equals方法:

class Course {

...     

boolean equals(Object obj) {

... 

}       

可能我们还是对add的方法没什么信心。我们还担心它不能存储2个以上的课程。因此,我们又写了这样一个测试:

class TestCourseCatalog {

static void testAdd() {

... 

}       

static void testAddTwo() {

CourseCatalog cat = new CourseCatalog();

Course course1 = new Course("c001", "Java prgoramming", ...);

Course course2 = new Course("c002", "OO design", ...);

cat.add(course1);

cat.add(course2);

if (!cat.findCourseWithId(course1.getId()).equals(course1)) {

throw new TestFailException();

}   

if (!cat.findCourseWithId(course2.getId()).equals(course2)) {

throw new TestFailException();

}   

}       

类似的,我们可以测试CourseCatalog里面的remove方法:

class TestCourseCatalog {

static void testAdd() {

... 

}       

static void testAddTwo() {

... 

}       

static void testRemove() {

CourseCatalog cat = new CourseCatalog();

Course course = new Course("c001", "Java prgoramming",...);

cat.add(course);

cat.remove(course);

if (cat.findCourseWithId(course.getId()) != null) {

throw new TestFailException();

}                                         

}                                  

public static void main(String args[]) {              

testAddTwo();                                              

testRemove();                            

}                                                 

}   

上面的testAdd,testAddTwo,和testRemove的方法,是用来测试CourseCatalog类。每个方法都是一个测试用例。不过,它们并不叫验收测试,而叫“单元测试”。因为它们只测一个单元(CourseCatalog类)。

单元测试跟验收测试有什么区别?验收测试测试的是系统的外部行为,而单元测试是测试系统内部结构,它只测一个单元(类,甚至一个方法)。验收测试属于客户的,我们没有权利决定验收测试的内容。我们顶多只是帮忙客户根据用户例事写出验收测试。单元测试属于我们,因为系统里面有什么类,每个类都做什么,是由我们决定的。客户就没有权利涉及了,而且我们也不需要他的参与。我们只是根据我们对这个单元(类)的期望写出单元测试。因此,这种测试又叫“程序员测试”。

【责任编辑:碧海蓝天 TEL:(010)68476606】




分享到:

  1. 彻底透视CDN痛点,互联网老兵聊聊CDN的那些事儿!
  2. 3行Python代码完成人脸识别

热点职位

更多>>

热点专题

更多>>

读书

Linux环境下C编程指南
本书系统地介绍了在Linux平台下用C语言进行程序开发的过程,通过列举大量的程序实例,使读者很快掌握在Linux平台下进行C程序开发

51CTO旗下网站

领先的IT技术网站 51CTO 领先的中文存储媒体 WatchStor 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i 51CTO学院