Clean Code 读书笔记 -- 9. 单元测试

319 阅读3分钟

敏捷和TDD测试驱动开发(Test-Driven Development)运动鼓舞了许多程序员编写自动化单元测试,单元测试是确保代码如我们所愿的进行工作。

TDD 定律

TDD 要求我们在编写生产代码前先编写单元测试。但这条规则只是冰山之巅。我们来具体看下列三定律:

  1. 除非这能让失败的单元测试通过,否则不允许去编写任何的生产代码。
  2. 只允许编写刚好能够导致失败的单元测试。 (编译失败也属于一种失败)
  3. 只允许编写刚好能够导致一个失败的单元测试通过的产品代码。

保持测试整洁

脏测试等同于没测试。测试代码和生产代码一样重要,它可不是二等公民,它需要被思考、被设计和北照料。它该像生产代码一样保持整洁。单元测试让你的代码可扩展,可维护,可复用。原因很简单,有了测试,你就不担心对代码的修改,没有单元测试,每次修改可能带来缺陷,一个测试,一个断言。一个测试,对应一个概念。我们不想要超长的测试函数。

整洁的测试有三大要素:可读性、可读性、以及可读性。在单元测试中,可读性甚至比在生产代码中还重要。测试如何才能做到可读?和其他代码一样:明确、简介,还有足够的表达力。在测试中,你要以尽可能少的文字表达大量内容。

整洁的测试还应遵守以下5条原则:

1. 快速(Fast):测试应该快速,因为需要不断的运行测试得到反馈,我们需要的快速反馈,错误的快速定位。所以你的测试就不能依赖太多的外部资源,数据库,硬件环境等等,对于这些外部资源应该采用伪对象模式来隔离。

2. 独立(Independent):测试应该是独立的,独立于测试用例之间,独立于特定的环境,独立于测试的运行顺利。数据的独立通常采用两种独立方式,每个测试环境的独立,很多时候我们希望每个测试运行完成后环境(如数据库)和运行前保持一致,如数据库高层次测试我们更希望在每次测试完成后不会带来多余或者改变数据。再则就是数据的隔离,我们的行为测试(BDD,集成高角度的测试)都会依赖一些固定的信息,通常是登陆系统的人员,我们可以采用么个测试建立一个不同的登陆人员来使的每个测试之间的s数据隔离。

3. 可重复(Repeatable):测试应该可以在任何环境下可重复,可运行,因为测试独立于环境外部资源。

4. 自足验证(Self-Validation):测试应该有通过失败的标示,从每一个测试上能得到一处代码逻辑的通过失败。每个测试都有对同一件事物的一种行为的断言,也之断言一件事,从而能够很好的错误定位,避免高技巧性的测试。

5. 及时(Timely):测试应该是及时编写的,TDD要求测试必须在实现代码之前,提前以使用者的角度定义使用接口方式。如果你是在编码后补测试,你的测试覆盖很可能不够,而且容易定式于实现的逻辑写测试,很多时候对于较低层次的测试也不是那么容易写的。一个设计良好的代码必须也是可测试的。