19.3 单元测试
过去,开发人员很少写测试。如果要写测试,也是由一个单独的QA团队来写。然而,敏捷开发的原则之一是,测试应该与开发紧密结合,程序员应该为他们自己的代码编写测试。这种做法现在已经很普遍了。测试通常分为两种:单元测试和系统测试。单元测试是开发人员最常写的测试。它们小而集中:每个测试通常验证一个方法中的一小部分代码。单元测试可以孤立地运行,不需要为系统建立生产环境。单元测试通常与测试覆盖工具一起运行,以确保应用程序中的每一行代码都被测试。每当开发人员编写新的代码或修改现有的代码时,他们负责更新单元测试以保持适当的测试覆盖率。
第二种测试包括系统测试(有时称为集成测试),它确保应用程序的不同部分都能正常协同工作。它们通常涉及在生产环境中运行整个应用程序。 系统测试更有可能由单独的 QA 或测试团队编写。
测试,特别是单元测试,在软件设计中起着重要的作用,因为它们有利于重构。没有测试套件,对系统进行重大的结构性变更是很危险的。没有简单的方法来发现错误,所以很可能在新的代码部署之前没有被发现,在那里发现和修复错误的成本要高得多。因此,开发人员避免在没有好的测试套件的系统中进行重构;他们试图尽量减少每个新功能或错误修复的代码变化数量,这意味着复杂性将会积累,设计错误没有得到纠正。
有了一套好的测试,开发人员在重构时可以更有信心,因为测试套件会发现大多数被引入的bug。这鼓励开发人员对系统进行结构性改进,从而获得更好的设计。单元测试特别有价值:它们提供了比系统测试更高的代码覆盖率,所以它们更有可能发现任何bug。
例如,在Tcl脚本语言的开发过程中,我们决定用一个字节码编译器取代Tcl的解释器来提高性能。这是一个巨大的变化,几乎影响了Tcl核心引擎的每一个部分。幸运的是,Tcl有一个优秀的单元测试套件,我们在新的字节码引擎上进行了测试。现有的测试在发现新引擎的错误方面非常有效,以至于在字节码编译器的alpha版本发布后,只有一个错误出现了。
Last updated