5分钟踢进TDD之门

来源:互联网 发布:单片机晶振电路的作用 编辑:程序博客网 时间:2024/05/20 03:40

作者:fbysss
msn:jameslastchina@hotmail.com 
blog:blog.csdn.net/fbysss
声明:本文由fbysss原创,转载请注明出处
关键字:TDD 测试驱动 敏捷开发

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

从需求开始

1.       建立TestStudent类,extends TestCase

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

 

  1. public calss StudentTest extends junit.framework.TestCase{
  2.        public void testCreate(){
  3.               new Student(“fbysss”);//出错,因为还没有Student类
  4. }
  5. }

3.       建立Student类,通过测试

 

 

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

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

 

  1. public calss StudentTest extends junit.framework.TestCase{
  2.        public void testCreate(){
  3.               Student student = new Student(“fbysss”);
  4.               String name = student.getName();//出错,因为没有提供getName方法
  5. }
  6. }

5.       创建getName方法

 

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

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

于是,有如下测试代码:

 

  1. public calss StudentTest extends junit.framework.TestCase{
  2.        public void testCreate(){
  3.               Student student new Student(“fbysss”); 
  4.               String name = student.getName();
  5.               assertEquals(“fbysss”,name);//测试不通过,因为返回值是””,不是”fbysss”
  6. }
  7. }

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

  1. String getName(){
  2.        return "fbysss";
  3. }

这样解决了上一个问题。

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

 

  1. public calss StudentTest extends junit.framework.TestCase{
  2.        public void testCreate(){
  3.               Student student new Student(“fbysss”); 
  4.               String name = student.getName();
  5.               assertEquals(“fbysss”,name);
  6.               //测试第二个学生
  7.               Student student new Student(“james”); 
  8.               String secondName = student.getName();
  9.               assertEquals(“james”,secondName );//测试不通过,因为返回值是”fbysss”,不是”james”
  10. }
  11. }

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

加入name成员

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

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

 

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

10.       对测试代码进行重构

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

 

 

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

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