测试是一个持续的过程。也就是说测试贯穿与开发的整个过程中,单元测试尤其适合于迭代增量式(iterative and incremental)的开发过程。Martin Fowler(有点儿像引用孔夫子的话)甚至认为:“在你不知道如何测试代码之前,就不应该编写程序。而一旦你完成了程序,测试代码也应该完成。除非测试成功,你不能认为你编写出了可以工作的程序。”我并不指望所有的开发人员都能有如此高的觉悟,这种层次也不是一蹴而就的。但我们一旦了解测试的目的和好处,自然会坚持在开发过程中引入测试。
看下面的例子: //将要被测试的类 public class Car { public int getWheels() { return 4; } }
//执行测试的类 public class testCar { public static void main(String[] args) { testCar myTest = new testCar(); myTest.testGetWheels(); }
public testGetWheels() { int expectedWheels = 4; Car myCar = Car(); if (expectedWheels==myCar.getWheels()) System.out.println("test [Car]: getWheels works perfected!"); else System.out.println("test [Car]: getWheels DOESN'T work!"); } }
JUnit是一个Open Source的项目。JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。用于Java开发人员编写单元测试之用。”所谓框架就是 Erich Gamma 和 Kent Beck 定下了一些条条框框,你编写的测试代码必须遵循这个条条框框:继承某个类,实现某个接口。其实也就是我们前面所说的规范。好在JUnit目前得到了大多数软件工程师的认可。遵循JUnit我们会得到很多的支持。回归测试就是你不断地对所编写的代码进行测试:编写一些,测试一些,调试一些,然后循环这一过程,你会不断地重复先前的测试,哪怕你正编写其他的类,由于软件熵的存在,你可能在编写第五个类的时候发现,第五个类的某个操作会导致第二个类的测试失败。通过回归测试我们抓住了这条大Bug。 回归测试框架-JUnit 通过前面的介绍,我们对JUnit有了一个大概的轮廓。知道了它是干什么的。现在让我们动手改写上面的测试类testCar使其符合Junit的规范--能在JUnit中运行。
//执行测试的类(JUnit版) import junit.framework.*;
public class testCar extends TestCase {
protected int expectedWheels; protected Car myCar;
public static Test suite() { /* * the type safe way * TestSuite suite= new TestSuite(); suite.addTest( new testCar("Car.getWheels") { protected void runTest() { testGetWheels(); } } ); return suite; */
/* * the dynamic way */ return new TestSuite(testCar.class); }