5分钟踢进TDD之门

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

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

从需求开始

1. 建立TestStudent类,extends TestCase

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

  1. publiccalssStudentTestextendsjunit.framework.TestCase{
  2. publicvoidtestCreate(){
  3. newStudent(“fbysss”);//出错,因为还没有Student类
  4. }
  5. }

  1. publicclassStudent{
  2. Student(Stringname){
  3. }
  4. }

  1. publiccalssStudentTestextendsjunit.framework.TestCase{
  2. publicvoidtestCreate(){
  3. Studentstudent=newStudent(“fbysss”);
  4. Stringname=student.getName();//出错,因为没有提供getName方法
  5. }
  6. }

  1. publicclassStudent{
  2. Student(Stringname){
  3. }
  4. StringgetName(){
  5. return“”;//不知道该写什么,先做一个stub.
  6. }
  7. }

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

于是,有如下测试代码

  1. publiccalssStudentTestextendsjunit.framework.TestCase{
  2. publicvoidtestCreate(){
  3. StudentstudentnewStudent(“fbysss”);
  4. Stringname=student.getName();
  5. assertEquals(“fbysss”,name);//测试不通过,因为返回值是””,不是”fbysss”
  6. }
  7. }
  1. StringgetName(){
  2. return"fbysss";
  3. }

这样解决了上一个问题。

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

  1. publiccalssStudentTestextendsjunit.framework.TestCase{
  2. publicvoidtestCreate(){
  3. StudentstudentnewStudent(“fbysss”);
  4. Stringname=student.getName();
  5. assertEquals(“fbysss”,name);
  6. //测试第二个学生
  7. StudentstudentnewStudent(“james”);
  8. StringsecondName=student.getName();
  9. assertEquals(“james”,secondName);//测试不通过,因为返回值是”fbysss”,不是”james”
  10. }
  11. }

加入name成员

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

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

  1. publicclassStudent{
  2. privateStringname;
  3. Student(Stringname){
  4. this.name=name;
  5. }
  6. StringgetName(){
  7. returnname;
  8. }
  9. }

10. 对测试代码进行重构

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

  1. publiccalssStudentTestextendsjunit.framework.TestCase{
  2. finalStringSTUDENT_NAME_FIRST="fbysss";
  3. finalStringSTUDENT_NAME_SECOND="james";
  4. publicvoidtestCreate(){
  5. StudentstudentnewStudent(STUDENT_NAME_FIRST);
  6. Stringname=student.getName();//删除
  7. assertEquals(STUDENT_NAME_FIRST,student.getName());//name使用inline重构
  8. //测试第二个学生
  9. StudentstudentnewStudent(STUDENT_NAME_SECOND);
  10. StringsecondName=student.getName();//删除
  11. assertEquals(STUDENT_NAME_SECOND,student.getName());
  12. }
  13. }

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

版权声明:本文为博主fbysss原创文章,转载请注明出处

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

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

5. 创建getName方法

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

3. 建立Student类,通过测试

相关文章

适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题...
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结...
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容...