Jeffrey Palermo
2006年5月
摘要:通过本文,读者可以了解如何结合Visual Studio Team System应用敏捷开发方法学里所强调的重点——测试驱动开发。
内容
简介
应用案例
测试驱动开发的优点
一个好的单元测试应具备的特点
结论
参考资料
简介
测试驱动开发(TDD)是一种先进的技术,通过使用自动化单元测试来驱动软件设计并强制依赖的松耦合。使用这一技术的结果是一整套单元测试集合,而且这些单元测试可以在任何时间被运行,以验证软件是否还正常工作。这一技术被那些应用敏捷开发方法学的人士推崇备至。为了在Visual Studio Team System里面使用该技术,你必须理解下面几个地方:
• 在VSTS IDE里面创建并运行自动化测试
• 在面向对象世界里将依赖抽象化
• 重构新老特性以清楚代码中的冗余
• 如何写单元测试?
• 如何组织测试列表?
• 如何运行选择的测试?
单元测试开发的箴言就是“红、绿、重构”
• 红:创建测试,但无法通过
• 绿:使测试被任何必要的方法验证通过
• 重构:修改代码以清楚你项目中的冗余,在确保所有测试仍然可以通过的情况下修正软件的设计
红/绿/重构圈在每个新的代码单元出现时不停地被重复使用。
应用案例
在你使用VSTS时,下面的几个步骤在你处理一个业已提供给你的工作项时会被遇到:
• 确保在你要创建新测试的解决方案里有一个VSTS测试项目。
依照以下步骤执行(对不同的TDD开发者可能稍有不同):
1.理解故事、工作项或者现在使用的特性的需求。
2.红:创建一个测试,但无法通过。
a.想象一下新代码是如何被调用的,然后写一个测试,就好像这段代码已经存在一样。这儿你不会得到只能提示,因为新方法还不存在。
b.创建新产品代码段。只需要能够编译就可以了。
c.运行测试。肯定会失败。这是一个标准方法,用来确保测试调用了正确的代码,或者错误的代码不会偶然正常工作。这是一个有意义的失败,你也希望它是失败的。
3.绿:使测试被任何必要的方法验证通过。
a. 写产品代码并测试通过。注意要简洁。
b.. 有些人认为先验证期望返回值的硬代码,这样测试成功检测会好一些。这一点因人而异。
c. 如果你写的代码如期通过测试,那么你的工作可以告一段落了,不需要再费劲脑汁继续写了。测试是“完成”的客观定义。俗语“够用就好”经常被用来杜绝那些不必要的工作。如果还需要新功能,那就再写一个测试。测试通过后继续。
d. 当测试通过后,也许此时你想要运行所有的测试,以确保一切运转正常。
4.重构:修改代码以清楚你项目中的冗余,在确保所有测试仍然可以通过的情况下修正软件的设计。
d. 清楚由新增功能造成的冗余。
e. 修正设计以优化整体方案。
f. 每次重构后,重新运行所有测试以确保仍被通过。
5.重复这一过程。每次重复应该非常短,一个典型的开发时间段内应该包含许多红/绿/重构过程。
测试驱动开发的优点
• 单元测试集合提供持久的每个组件仍正常工作的反馈。
• 单元测试扮演同步更新的文档,保证随时可用。
• 当测试通过,产品代码被重构清楚过冗余时,表明这段代码完成,开发者可以转战下一个测试。
• 测试驱动开发强制严肃的分析和设计,因为开发者在没有正确理解什么是想要的结果和如何测试的情况下不能创建产品代码。
• 软件倾向去更好的设计,也就是说“松耦合和健壮性”,因为开发者可以自由地做设计决定并在任何情况下重构,以保证软件仍在正常工作。
• 测试集扮演一个Bug的回溯安全网:如果发现了一个Bug,开发者应该创建一个测试来看看这个Bug怎么产生的,然后修改产品代码,这样就可以消除Bug而且其他的测试一切正常。在每一个后来的测试运行时,以前的Bug修复都会被验证。
• 减少调试时间。
一个好的单元测试应具备的特点
一个好的单元测试应该具备以下特点:
• 跑得快,跑得快,跑得快。如果测试运行很慢,他们就不会经常被运行。
• 隔离或者模拟环境依赖,比如数据库、文件系统、网络及队列等等。有依赖的测试运行的不会很快,而且一个失败不会给出问题真正所在的有意义反馈。
• 限制范围。如果测试失败,很快就能知道到哪儿查找问题。使用几个断言就可以找出错误的代码所在。在一个测试里面测试一件事情是很重要的。
• 在独立的环境下运行和通过。如果测试需要特殊的环境配置或者失败的不明就里,那么就不是好的单元测试。修改的更简单和可靠一些。测试应该可以在任何机器上运行和通过。“在我机子上可用”的辩解是无用的。
• 经常使用桩和钩子对象。如果被测试的代码调用一个数据库或者文件系统,一定要模仿出那些依赖。一般情况下,可以通过使用接口抽象掉这些依赖。
• 明确表示测试意图。其他的开发者可以看到这个测试并且理解产品代码想达到一个什么目的。
结论
测试驱动开发是一种先进的技术,通过使用单元测试可以驱动软件的设计。本文提纲挈领地讲述了这一技术,但市面上已经有了许多关于这个话题的书籍。
你可以使用VSTS在使用或者不使用测试驱动开发的情况下设计单元测试软件。团队应该知道那种方法更适用于他们。
参见James Newkirk的Test-Driven Development in Microsoft .NET一书,微软出版社出版。
参考
• 单元测试概览
• 创建单元测试
• 微软.NET平台上的测试驱动开发:主页
关于作者
Jeffrey Palermo是DataCert公司(应用敏捷开发方法学的一家ISV)的高级软件开发人员。他是奥斯丁.NET用户组的指导者,还是南方Texas的INETA会员经理。Jeffrey拥有MCSD的.NET认证。他的Blog是:http://codebetter.com/blogs/jeffrey.palermo/。
分享到:
相关推荐
总之,《.NET测试驱动开发指南》对于希望提升C#项目质量和效率的开发者来说,是一份不可多得的学习资料。通过深入学习和实践,开发者将能够更好地掌握TDD技巧,从而编写出更加健壮和可维护的代码。
第4章 测试驱动开发:以测试为指南 第5章 模拟外部资源 第Ⅱ部分 将基础知识变为行动 第6章 启动示例应用程序 第7章 实现第一个用户情景 第8章 集成测试 第Ⅲ部分 TDD方案 第9章 Web上的TDD 第10章 测试WCF服务 第11...
i.MX6ULL 嵌入式 Linux 驱动开发指南 本资源为 i.MX6ULL 嵌入式 Linux 驱动开发指南,旨在帮助开发者快速掌握 i.MX6ULL 嵌入式 Linux 驱动开发的技术。该指南涵盖了从基本概念到高级开发的方方面面,涵盖了驱动开发...
一个怯懦的 Test-o-phobe 的 iOS 测试驱动开发指南 来自 2013 年 9 月 iOSDevUK 上的演示文稿的代码 这是交通灯示例的完整代码,用作 Tim Duckett 于 2013 年 9 月 3 日在阿伯里斯特威斯的 iOSDevUK 上的演示的基础...
《I.MX6U嵌入式Linux驱动开发指南V1.5》是针对NXP公司I.MX6U处理器的全面教程,旨在帮助开发者深入理解并掌握在该平台上进行Linux驱动程序开发的技术与实践。I.MX6U是NXP(前身为飞思卡尔)的一款高性能、低功耗的...
"测试驱动开发 by example"这个资源可能是一本深入探讨TDD实践的指南,通过实例详细解释了如何在实际项目中应用TDD。 首先,TDD的核心理念是“红-绿-重构”循环。在这一过程中: 1. **红**:编写一个失败的测试...
《I.MX6U嵌入式Linux驱动开发指南》是一本深入探讨基于NXP I.MX6U处理器的嵌入式系统Linux驱动程序开发的专业书籍。I.MX6U是NXP公司推出的一款高性能、低功耗的处理器,广泛应用于各种嵌入式设备和物联网(IoT)应用。...
根据提供的文件信息,以下是对《正点原子 I.MX6U嵌入式Linux驱动开发指南 V1.2》中知识点的详细说明: ### 知识点一:文档概览与资源获取 该指南是一份关于I.MX6U嵌入式Linux驱动开发的全面文档,由正点原子团队...
《Python测试驱动开发:使用Django、Selenium和JavaScript进行Web编程(第2版)》是一本详尽探讨如何在Web开发中应用测试驱动开发(TDD)技术的专业书籍。这本书不仅涵盖了Python语言的基础,还深入讲解了Django框架...
《Python测试驱动开发:使用Django、Selenium和JavaScript进行Web编程》这本书是关于现代Web应用开发的一个深度指南,特别关注于使用Python语言以及相关的工具和技术。书中详细介绍了如何运用测试驱动开发(TDD)的...
本开发指南将深入探讨NDIS驱动开发,特别是中间层驱动程序(IMD)的开发。 一、NDIS概述 NDIS作为网络驱动程序的基础,定义了上层协议驱动和下层硬件驱动之间的交互方式。它包含了数据包的接收和发送机制,错误处理...
### 嵌入式设计及Linux驱动开发指南:基于ARM9处理器随书光盘 #### 知识点一:嵌入式系统概述 - **定义与应用领域**:嵌入式系统是一种专用计算机系统,用于执行特定的任务。它通常包含处理器、存储器以及输入输出...
《I.MX6U嵌入式Linux驱动开发指南》是正点原子团队为使用I.MX6U处理器进行嵌入式Linux驱动开发的工程师提供的学习资料。该指南分为多个部分,覆盖了从Ubuntu系统的基础操作到Linux内核驱动开发的全过程。接下来,...
ASIO驱动开发涉及深入的音频硬件知识和驱动编程技巧,开发者可以通过阅读《ASIO音频驱动开发指南》等资料,以及参与在线社区的讨论,持续提升自己的技能。 总结,ASIO音频驱动的开发是一项技术性强、要求高的任务。...
**Windows WDM驱动程序开发指南** Windows WDM(Windows Driver Model)是微软为Windows操作系统设计的一种设备驱动程序模型,它支持从Windows 98到Windows 10等多个版本。WDM驱动程序允许硬件制造商为他们的硬件...