TDD(测试驱动开发)是一种引入大量底层反馈的技术,它能持续地测试,确保我们编写正确的代码,并快速指出有问题的代码。
TDD要为每一段代码编写测试用例,而且要测试先行,测试用例用来定义代码需要做什么。
开发步骤中的一次循环:
1.用代码编写一个规格说明,要符合单元测试的形式。
2.描述测试失败
3.编写代码,实现规格说明
4.测试通过
5.小型的重构,优化代码
TDD的每个循环非常短,可以快速得到反馈。采用这种持续、渐进的开发方式,一直针对整个系统运行所有的测试,可确保新增的代码不会破坏系统中其它的任何代码,大大降低了维护成本。
准备工作:安装MyEclipse、JUnit、Ant,正确配置环境变量。
下面的例子,包括2个业务类,2个对应的测试类,以及1个测试套件
public class Student {
private String name;
Student(String name){
this.name = name;
}
public String getName() {
return name;
}
}
//继承自一个TestCase类,用来测试Student
import junit.framework.TestCase;
public class StudentTest extends TestCase{
//测试方法必须声明为public,返回值必须为void
public void testCreat(){ //方法的名字必须以小写test为前缀
final String firstStudentName = "rio";
Student student = new Student(firstStudentName);
String studentName = student.getName();
assertEquals(firstStudentName,studentName); //断言,确保第一个参数与第二个参数相同
}
}
public class CourseSession {
private String department;
private String number;
private int numerofStudents;
public CourseSession(String department,String number) {
this.department = department;
this.number = number;
numerofStudents = 0;
}
String getDepartment(){
return department;
}
String getNumber(){
return number;
}
int getNumberOfStudents(){
return numerofStudents;
}
void enroll(Student student){
numerofStudents = numerofStudents + 1;
}
}
import junit.framework.TestCase;
public class CourseSessionTest extends TestCase{
private CourseSession session;
public void setUp(){ //JUnit将在执行每个测试方法之前,先执行setUp方法中的代码
session = new CourseSession("java","60");
}
public void testCreate(){
CourseSession session = new CourseSession("java","60");
Student student1 = new Student("saber"); //此处Student对象的生命周期和 testCreate()的执行周期相同
Student student2 = new Student("mio");
session.enroll(student1);
session.enroll(student2);
assertEquals("java",session.getDepartment());
assertEquals("60",session.getNumber());
assertEquals(2,session.getNumberOfStudents());
}
public void testEnrollStudents(){
……
}
}
//测试套件,能够让一套测试一起运行
import junit.framework.TestSuite;
public class AllTests {
public static TestSuite suite(){
TestSuite suite = new TestSuite();
suite.addTestSuite(StudentTest.class); //增加测试
suite.addTestSuite(CourseSessionTest.class);
return suite;
}
}