作者:fbysss
关键字:TDD 测试驱动 敏捷开发

任务:简单测试一个Student类--只求简单,不求繁杂。

从需求开始

1.       建立TestStudent类,extends TestCase

2.       建立testCreate()方法,测试创建,


    1. public calss StudentTest extends
    2. 
    3. public void
    4. 
    5. new Student(“fbysss”);//出错,因为还没有Student类 
    6. 
    7. }
    8. 
    9. }
    10.



    1. public class
    2. 
    3.               Student(String name){
    
    4. 
    5.        }
    6. 
    7. }

    1. public calss StudentTest extends
    2. 
    3. public void
    4. 
    5. new
    6. 
    7. //出错,因为没有提供getName方法 
    8. 
    9. }
    10. 
    11. }
    12.


    1. public class
    2. 
    3.               Student(String name){
    
    4. 
    5. }
    6. 
    7. String getName(){
    
    8. 
    9. return “”;//不知道该写什么,先做一个stub. 
    10. 
    11. }
    12. 
    13. }

    6.根据需求,返回的name应该等于创建时候传入的字符串。

    于是,有如下测试代码:


    1. public calss StudentTest extends
    2. 
    3. public void
    4. 
    5. new
    6. 
    7.               String name = student.getName();
    8. 
    9. //测试不通过,因为返回值是””,不是”fbysss” 
    10. 
    11. }
    12. 
    13. }
    14. 
    15. String getName(){
    
    16. 
    17. return
    18. 
    19. }

    这样解决了上一个问题。

    8.       根据需求,再创建另外的Student,仍然可以得到正确的结果

      1. public calss StudentTest extends
      2. 
      3. public void
      4. 
      5. new
      6. 
      7.               String name = student.getName();
      8. 
      9.               assertEquals(“fbysss”,name);
      10. 
      11. //测试第二个学生 
      12. 
      13. new
      14. 
      15.               String secondName = student.getName();
      16. 
      17. //测试不通过,因为返回值是”fbysss”,不是”james” 
      18. 
      19. }
      20. 
      21. }
      22.


      加入name成员

      仅这一步还不行,索性想全了:要得到想要的结果,必须在构造函数里面保存传入的参数。

      如果在以后的测试中,要求Student提供setName方法,进一步Driven创建void setName(String name)方法。


      1. public class
      2. private
      3. Student(String name){
      
      4. 
      5.  = name;
      6. }
      7. 
      8. String getName(){
      
      9. return
      10. }
      11. }

      10.       对测试代码进行重构

      因为测试的代码太多,不够简洁,要求重构。

       

       

      怎么样,简单吧,体验到被测试“驱动”的感觉了吗?

      1. public calss StudentTest extends
      2. 
      3. final String STUDENT_NAME_FIRST= "fbysss";
      4. final String STUDENT_NAME_SECOND = "james";
      5. public void
      6. new
      7. 
                       String name = student.getName();//删除 
                     
      8. //name使用inline重构 
      9. 
      10. //测试第二个学生 
      11. new
      12. 
                       String secondName = student.getName();//删除 
                     
      13.               assertEquals(STUDENT_NAME_SECOND, student.getName());
      14. 
      15. }
      16. 
      17. }


       

      9.       于是,可以知道Student的getName还需要更通用(这里重构步子大小可以根据情况而定,毕竟写测试用例的是人,不是机器)

      7.       于是,如果程序员就是个机器,很傻的想到要满足我的测试,直接目标就是让测试条变绿!修改Student.getName()方法如下。

      5.       创建getName方法

      4.       根据需求,学生都有一个名字,进一步测试名字


      3.       建立Student类,通过测试