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; }}