“测试引导的“,英语有好几种表达如”Test-First“、”Test-Centric“、“Test-Driven”等等,测试引导的编程技术代表一种测试文化(Test Culture)为基础的技术哲学。我使用Mark Pilgrim写得书《
Dive Into Python》(里面的13和14章)介绍测试引导的编程技术,看这里的朋友有没有兴趣。Pilgrim同学是学哲学专业的,想必对于编程的方法和技术哲学有更深的认识。在数学上有一种说法:用了一两次碰巧解决问题的是技巧,屡试不爽的技巧就成为了方法。方法就是工业行业标准生产技术和标准工艺流程了,所以我们把这叫做“工程方法”。工程方法的特征是“试错方法”,就是英语说的Trial-and-Error Method。任何工程都包含一个类似的阶段,要进行理论计算和理论设计,然后是实验测试阶段,取得工程设计数据,弥补理论计算和理论设计阶段不能回答的问题,最后制定设计方案。第一,任何工程都应该编写测试套件;第二,任何工程开始之前都应该首先编写测试套件。测试引导的工程方法有以下优势(我完全是照抄Pilgrim同学的):
- 代码开发之前,强迫你以有效的方式考虑需求的细节。
- 代码开发中,防止过度开发。通过了所有测试用例,程序的开发就完成了。
- 重构代码时,确保新版和旧版功能一致。
- 维护代码时,当你的代码更改导致别人代码出问题时帮你留住面子。你可以说:“但是先生,我检查代码时所有的单元测试都通过了......“。
- 在团队开发时,可以使你有信心,保证自己提交的代码不会破坏其他人的代码,因为你可以先运行其他人的单元测试代码。没有人会出太大的偏差而导致代码无法集成。
Pilgrim同学用一个简单的实例来解释测试引导的工程方法,这是一个转换罗马数字-阿拉伯数字的应用程序,名字是roman.py 。从阿拉伯数字变到罗马数字的转换函数是toRoman(),把罗马数字转换成阿拉伯数字的是函数fromRoman(),它们的功能要求:
- toRoman 应该能返回 1 到 3999 中任意数的罗马数字表示。
- toRoman 在遇到 1 到 3999 之外的数字时应该失败。
- toRoman 在遇到非整数时应该失败。
- fromRoman 应该能将给定的有效罗马数字表示转换为阿拉伯数字表示。
- fromRoman 在遇到无效罗马数字表示时应该失败。
- 将一个数转换为罗马数字表示,再转换回阿拉伯数字表示后应该和最初的数相同。因此,fromRoman(toRoman(n)) == n 对于 1..3999 之间所有 n 都适用。
- toRoman 返回的罗马数字应该使用大写字母。
- fromRoman 应该只接受大写罗马数字 (也就是说给定小写字母进行转换时应该失败)。
在开发roman.py前,根据转换函数的要求先行开发测试组件,名字
romantest.py 。roman.py开发几个了五个阶段,每一步都用测试组件romantest.py来测试:import unittest,并且分别import roman1.py来测试开发roman1的效果;其他对roman2.py、roman3.py、roman4.py和romgn5.py做同样的步骤。Python的测试包名字是Unittest。