5分钟踢进TDD之门

作者:fbysss
msn:jameslastchina@hotmail.com 
blog:blog.youkuaiyun.com/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. }

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

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值