正如作者所言,“花合理时间抓住大多数Bug,要好过穷尽一生抓出所有Bug”。
测试的重点应当集中在可能出错的地方,这帮助你尽快排查错误、大大缩短调试程序的时间。
测试的三个基本原则:自动化、本身有效、单元测试。要点如下:
1. 构建自测试代码
Java开发测试惯用手法是testing main(),意思是每个类都有一个用于测试的main()函数。这是一个合理的习惯,但可能不好操纵。
Java开发另一个更轻松的做法,是建立一个独立的类用于测试,并在一个框架中运行它,例如Junit框架。
2. 采用Junit测试框架
测试框架的composite结构:
Test接口
—>TestSuit类:产生一个测试套件
—>—>addTest()方法:添加测试用例
—>TestCase类:所有测试用例都需要继承该类
—>—>FileReaderTester类:
—>—>—>setUp()方法:用来产生相关对象
—>—>—>tearDown()方法:用来删除对象
—>TestRunner类:所有测试用例都需要继承该类
—>—>—>run()方法:运行suit()套件,输出运行时间、测试用例个数、运行结果
assert()函数:可扮演自动测试角色,参数未true则一切良好,否则输出错误信息
assertEquals()函数:以equals()进行对象比较,以==进行数值比较。
编写测试代码时,往往先在assert()中放置一个错误,以保证测试确实能运行。
功能测试把系统当做黑箱,单元测试使程序Bug浮现出来。
考虑可能出错的边界条件,把火力都集中在那儿。
有用的测试函数:
testReadAtEnd():assertEquals(-1, _input.read()), 测试文件是否读到末尾,需要加到测试套件中:suite.addTest(new FileReaderTester("testReadAtEnd"))
3. 添加更多测试
随着测试越来越多,可以另外生成一个类,专门用来包含由其他测试类所组成的测试套件suit。类似于主控的测试类。
测试不可能找出所有Bug,但是一旦进行重构,就能更好地理解整个程序。
观察代码,看哪儿变得复杂;观察函数,思考哪些地方可能是错的。