如今,程序员比以往更多地认识到他们有责任创建编写较好的单元测试。无论一个开发人员是在进行测试驱动的开发(TDD)还是在编写代码后创造单元测试,有一点是十分明显的,那是单元测试有助于产出高质量、无缺陷的代码。
  即便开发人员知道测试的益处,我们也会发现程序员们不愿意测试他们的代码。他们会列出各种理由,如时间不够、没有有效的工具以及在编写带有许多有依赖关系的对象的测试方面有问题。
  本期的文章中,我想将重点放在单元测试上,并看看如何解决这些问题。特别地,我想提供一些技巧来说明编写带有模拟对象的单元测试是多么容易。
  对于单元测试的常见异议
  在深入探讨模拟对象之前,让我们先来看一下以下两点异议。
  花费时间太长
  我们很早认识到这样一个原则“做事情需要花费时间”,特别当这些事情值得去做。很少的开发人员会怀疑整体测试的价值,因此我们需要考虑如何定义“太长”这个词的含义。
  开发人员们缺乏耐心,他们想要的是结果。他们喜欢写代码、运行代码然后看结果。从这一点来说,单元测试对他们有帮助。单元测试满足开发人员们的及时需求,但是许多程序开发人员认为编写测试占据了他们编写应用程序代码的时间,而他们的工作是按照后者计算报酬的。当然如果您仅仅按照程序开发人员在一个特定时间创建的应用程序代码的行数(或者一些其他方法)来计算的话,这一点是正确的。但是我们必须考虑每行代码所承载的全部时间。如果每当代码编译完成并运行通过我们停止计算的话,我们可能会忽略掉创建软件重要的部分—消除缺陷。在软件开发周期中越晚发现缺陷,修复缺陷所花费的代价会随之成倍增长。在开发过程中许多预先的质量检验会多占用一点点时间,但是会在以后节约大量时间。这一点已经被许多研究所证实。
  仍有许多程序设计人员认为找出他们代码中的错误是其他一些人的工作。我发现近十年来这种情况已经有了显著的改进,但是仍有大量的程序人员并没有为他们的工作负全责,他们也不使用有助于改进他们代码的工具和技术。在早期的软件工程课程中我向我的学生们介绍过单元测试。我告诉他们如何使用现代工具编写测试。我布置了关于编写单元测试的作业。然而,当给他们机会在工作中采用有效的单元测试时,只有25%的学生这样做。原因是什么呢?因为他们还没有意识到测试的重要性。他们的直觉战胜了理性。他们知道单元测试的价值,但他们选择不予理会。
  单元测试并不需要花费很长时间,但许多程序设计员认为它需要。作为一名教育工作者,我需要努力地在学生们职业生涯的早期改变这一认识,并在他们整个学习过程中不断的加以强化。商业组织必须跟上步伐,在他们雇用毕业生时使得单元测试成为一份宝贵的实践。
  低效的工具
  这充其量是一个乏味的借口。在有很多有效的单元测试工具可供开发人员们使用。不管您使用的是什么程序语言或者其他的开发工具,单元测试工具都可以供您使用。许多工具都是开源或者免费的。
  我选择 Eclipse 作为我的主要开发环境。在我现有的 Eclipse 配置里可以得到的所有单元测试工具中,我主要使用的是 Junit 测试框架。大多数 Java 设计人员都知道 Junit 并且大概至少使用过一次。JUnit 是 Eclipse 的 Java 开发工具中的一个完整部分。这个平台使得创建 Junit 测试变得简单。我只需在浏览器包里选择一个 Java 源文件,并在右击已选文件时从关系菜单里选择 New>JUnit Test Case(见图1)即可。提供的支持包括在测试中为类自动创建测试方式以及更多的东西。运行测试和创建一样简单。Eclipse 带有一个独立的视图可以观察 Junit 测试的结果。


  图:在 Eclipse 中创建一个 Junit 测试