快速业务通道

演化架构与紧急设计: 测试驱动设计,第1部分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-07-04

演化架构与紧急设计: 测试驱动设计,第1部分

时间:2011-05-18 IBM Neal Ford

常见的一种敏捷开发实践就是 TDD。TDD 是一种编写软件的模式,它使用测试 帮助您了解需求阶段的最后步骤。先写测试,再编写代码,这样可以巩固您对代 码所需执行的操作的理解。

大多数开发人员认为 TDD 带来的主要好处是最终得到的综合单元测试集。但 是,如果正确执行的话,TDD 可以改进代码的整体设计,因为它将决策推迟到最 后责任时刻(last responsible moment)。由于您没有预先做出任何设计决定, 因此它让您随时可以采用更好的设计选择或者重构为更好的设计。本文将介绍一 个示例,用于演示根据单元测试的结果进行设计的强大之处。

TDD 工作流程

测试驱动开发 术语中的关键词是驱动,表示测试将驱动开发流程。图 1 显示 了 TDD 工作流程:

图 1. TDD 工作流程

图 1 中的工作流程是:

编写一个失败的测试。

编写代码以使测试通过。

重复第 1 步和第 2 步。

在此过程中积极地重构。

当您无法再想到任何测试时,那么就必须做决策了。

演化架构与紧急设计: 测试驱动设计,第1部分(2)

时间:2011-05-18 IBM Neal Ford

TDD 与先开发后测试的比较

测试驱动 开发强调首先进行测试。只有在编写了测试(并失败)后,您才可 以编写测试中的代码。许多开发人员使用称为后测试开发(test-after development,TAD)的各种测试,您将首先编写代码,然后编写单元测试。在这 种情况下,您仍然进行了测试,但是没有涉及到 TDD 的紧急设计方面。您可以很 轻松地编写一些非常恶劣的代码,然后费劲脑筋地想办法测试。通过先编写代码 ,您在代码中嵌入了有关代码如何工作的想法,然后测试这些代码。TDD 要求您 反过来做:先编写测试,并让它来提示如何编写可以让测试通过的代码。为了演 示这个重要区别,我将着手实现一个扩展示例。

完全数

要展示 TDD 的设计优点,我需要用到一个待解决的问题。在 Kent Beck 的 Test Driven Development 一书中,他使用货币作为示例 — 非常优秀的 TDD 例 子,但是有点过分简单。真正的挑战是找到这样一个示例,该示例本身并没有复 杂到让您对问题束手无策,但是它的复杂度足以展示真正的价值。

为此,我选择了完全数。对于不熟悉数学知识的人,此概念可追溯到 Euclid 之前(他完成了导出完全数的早期验证之一)。完全数指其真因子相加等于数字 本身的数字。例如,6 是一个完全数,因为 6 的因子(不包括 6 本身)是 1、2 和 3,而 1 + 2 + 3 = 6。更规则的完全数定义是因子(不包括该数字本身)之 和等于该数字的数字。在我的示例中,计算结果是 1 + 2 + 3 +6 - 6 = 6。

这就是要处理的问题域:创建一个完全数查找程序。我将用两种不同的方法实 现此解决方案。首先,我将打消想要执行 TDD 的念头并且只是编写解决方案,然 后为它编写测试。然后,我将设计出 TDD 版本的解决方案,以便可以比较和对照 两种方法。

对于本例,我用 Java 语言(版本 5 或更高版本,因为我将在测试中使用注 释)、JUnit 4.x(最新版本)和来自 Google 代码的 Hamcrest 匹配器实现一个 完全数查找程序。Hamcrest 匹配器将在标准的 JUnit 匹配器顶部提供一个人本 接口(humane interface)语法糖。例如,不必编写 assertEquals(expected, actual),您可以编写 assertEquals(actual, is(expected)),这段代码读起来 更像是一个句子。JUnit 4.x 附带了 Hamcrest 匹配器(这些匹配器只是静态导 入);如果仍然要使用 JUnit 3.x,您可以下载一个兼容版本。

后测试开发

清单 1 显示了第一个版本的 PerfectNumberFinder:

清单 1. 后测试开发的 PerfectNumberFinder

public class  PerfectNumberFinder1 {    public st

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号