第12章单元测试.rar 或者 下载  下载pdf。

12  单元测试

 

单元测试

 

假定你在写一个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();

           }   

       }       

       public static void main(String args[]) {

           testAdd();

           testAddTwo();

       }       

    }          

 

    类似的,我们可以测试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[]) {                                                   

           testAdd();                                                                             

           testAddTwo();                                                                           

           testRemove();                                                                          

       }                                                                                          

    }                                                                                              

 

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

 

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

                          

评论
发表评论

您还没有登录,请登录后发表评论

Wingel
搜索本博客
最近加入圈子
存档
最新评论