【译】单元测试最佳实践

编写单元测试有以下好处:数据库

  • 利于回归测试
  • 提供文档
  • 改进代码设计

可是,难以阅读和维护的测试代码则会拔苗助长。本文会提供一些编写单元测试的最佳实践以使得你的测试代码易于维护和理解。单元测试

为何要写单元测试?

1. 花更少的时间进行功能测试

功能测试成本相对较高,由于常常须要打开应用并执行一系列操做以验证结果是否符合预期。测试步骤所涉及领域未必是测试人员所熟知,致使须要其余人协助进行测试。对于细微变化,测试可能需几秒钟,亦或几分钟来测试较大的变动。最后,对于系统中的每处修改都须要进行重复测试。测试

反观单元测试,仅需毫秒级别且无需对系统自身了解过多。单元测试经过与否取决于测试运行器(test runner),而不是某我的。spa

2. 避免回归测试

回归缺陷是在对应用程序进行更改时引入的缺陷。测试人员不只要测试他们的新特性,还要测试之前存在的特性,以验证以前实现的特性是否仍然像预期的那样运行。设计

经过单元测试,能够在每次构建以后,即使是只修改了一行代码,从新运行整个测试流程,以确保新代码不会破坏已有功能。文档

3. 可执行的文档

有时对于特定的参数,方法的预期输出难以肯定。你或许会问,若是向方法中传入空字符串或者null会发生什么?字符串

当编写具备良好命名的测试用例时,每一个用例能够清晰的说明对于给定的输入会有怎样的输出。此外,测试用例还应能够验证方法是否可以正常工做。test

4. 低耦合代码

编写单元测试能够下降代码耦合度,由于高耦合的代码将会使得单元测试变得困难重重。重构

良好的单元测试应具有如下特征

  • 快速
    对于大型成熟项目可能会有数千个测试用例。每一个测试用例应尽量快的运行,最好在毫秒级别。
  • 隔离
    单元测试是独立的,能够单独运行而不依赖外部元素,如文件系统或数据库。
  • 可重复
    在不改变输入的状况下,单元测试的输出结果应保持不变。
  • 自检查
    单元测试应自动检测测试是否经过而无需人工干预。
  • 耗时少 若是测试代码所花费的时间远超编写代码的时间,应当考虑重构代码以便于更好测试。即,确保编写测试所花费的