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类,通过测试

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...