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