作者:fbysss
msn:jameslastchina@hotmail.com
blog:blog.csdn.net/fbysss
声明:本文由fbysss原创,转载请注明出处
关键字:TDD 测试驱动 敏捷开发
任务:简单测试一个Student类--只求简单,不求繁杂。
从需求开始;
1. 建立TestStudent类,extends TestCase
2. 建立testCreate()方法,测试创建,
- publiccalssStudentTestextendsjunit.framework.TestCase{
- publicvoidtestCreate(){
- newStudent(“fbysss”);//出错,因为还没有Student类
- }
- }
- publicclassStudent{
- Student(Stringname){
- }
- }
- publiccalssStudentTestextendsjunit.framework.TestCase{
- publicvoidtestCreate(){
- Studentstudent=newStudent(“fbysss”);
- Stringname=student.getName();//出错,因为没有提供getName方法
- }
- }
- publicclassStudent{
- Student(Stringname){
- }
- StringgetName(){
- return“”;//不知道该写什么,先做一个stub.
- }
- }
6.根据需求,返回的name应该等于创建时候传入的字符串。
于是,有如下测试代码:
- publiccalssStudentTestextendsjunit.framework.TestCase{
- publicvoidtestCreate(){
- StudentstudentnewStudent(“fbysss”);
- Stringname=student.getName();
- assertEquals(“fbysss”,name);//测试不通过,因为返回值是””,不是”fbysss”
- }
- }
- StringgetName(){
- return"fbysss";
- }
这样解决了上一个问题。
8. 根据需求,再创建另外的Student,仍然可以得到正确的结果
- publiccalssStudentTestextendsjunit.framework.TestCase{
- publicvoidtestCreate(){
- StudentstudentnewStudent(“fbysss”);
- Stringname=student.getName();
- assertEquals(“fbysss”,name);
- //测试第二个学生
- StudentstudentnewStudent(“james”);
- StringsecondName=student.getName();
- assertEquals(“james”,secondName);//测试不通过,因为返回值是”fbysss”,不是”james”
- }
- }
加入name成员
仅这一步还不行,索性想全了:要得到想要的结果,必须在构造函数里面保存传入的参数。
如果在以后的测试中,要求Student提供setName方法,进一步Driven创建void setName(String name)方法。
- publicclassStudent{
- privateStringname;
- Student(Stringname){
- this.name=name;
- }
- StringgetName(){
- returnname;
- }
- }
10. 对测试代码进行重构
因为测试的代码太多,不够简洁,要求重构。
- publiccalssStudentTestextendsjunit.framework.TestCase{
- finalStringSTUDENT_NAME_FIRST="fbysss";
- finalStringSTUDENT_NAME_SECOND="james";
- publicvoidtestCreate(){
- StudentstudentnewStudent(STUDENT_NAME_FIRST);
-
Stringname=student.getName();//删除 - assertEquals(STUDENT_NAME_FIRST,student.getName());//name使用inline重构
- //测试第二个学生
- StudentstudentnewStudent(STUDENT_NAME_SECOND);
-
StringsecondName=student.getName();//删除 - assertEquals(STUDENT_NAME_SECOND,student.getName());
- }
- }
怎么样,简单吧,体验到被测试“驱动”的感觉了吗?
版权声明:本文为博主fbysss原创文章,转载请注明出处
9. 于是,可以知道Student的getName还需要更通用(这里重构步子大小可以根据情况而定,毕竟写测试用例的是人,不是机器)
7. 于是,如果程序员就是个机器,很傻的想到要满足我的测试,直接目标就是让测试条变绿!修改Student.getName()方法如下。
5. 创建getName方法
4. 根据需求,学生都有一个名字,进一步测试名字
3. 建立Student类,通过测试