写点什么

实际经验证明:TDD 可以提高软件质量

2009 年 3 月 03 日

Empirical Software Engineering 杂志上首次发表的一篇研究报告声称:“看来 TDD 可以应用在多个领域中,并显著降低软件的缺陷密度,同时也不会明显降低开发团队的工作效率。”研究对比了 4 个在微软和 IBM 执行的项目,这些项目使用了 TDD 方式开发,并与没有使用 TDD 开发的类似项目进行了对比。

研究报告的作者包括:来自微软的 Nachi Nagappan 和 Thirumalesh Bhat 、IBM 的 E. Michael Maximilien ,以及北卡罗来纳大学的 Laurie Williams ,并发布在 Empirical Software Engineering 杂志的第 13 卷第 3 期上。读者也可以在微软研究院的 Empirical Software Engineering Group 中找到该报告。

报告中研究的 4 个案例,1 个来自 IBM,3 个来自微软。每个案例研究都对比了开发同一个产品的两个团队,他们使用同样的开发语言和技术,处于同一级别的管理之下,唯一不同之处在于:一个团队使用 TDD,另一个不用。在开发过程中,这些团队都不知道自己处于研究之下。IBM 案例中的团队在开发设备驱动程序,微软的团队在开发 Windows、MSN 和 Visual Studio 的相关应用。

报告中讲述了团队使用的 TDD 实践,包括分钟级别的工作流程(minute-to-minute workflow)和任务级别的工作流程(task-level workflow)。

分钟级别的工作流程如下:

  • 编写一些新的小单元测试用例
  • 运行测试,看着它们失败
  • 编写实现代码以满足测试
  • 重新运行单元测试用例,确保它们现在可以通过

任务级别的工作流程是这样子的:

  • 将新的实现代码和单元测试集成到现有的代码库中
  • 重新运行所有的测试用例,确保新的代码不会导致任何测试失败
  • 重构实现代码和测试代码
  • 重新运行所有的测试用例,确保重构后的代码不会导致任何测试失败

缺陷密度是通过每千行代码的缺陷数目来衡量的。相较于不使用 TDD 的项目而言,这四个产品在发布前的缺陷密度降低了 40% 到 90%。从团队管理层的主观报告看来,在开发的初始阶段,使用 TDD 的团队要多花 15% 到 35% 的时间;不过团队都同意一点:这个时间被减少的产品维护时间抵消掉了。

报告中的结果可以与 Maria Siniaalto 在 2006 年发布的一篇文章相对比。该文章中试图复审并总结其他 13 项有关 TDD 的研究,这些研究包括在纯商业背景、半商业背景和学院背景中进行的研究。在文章的结论中,作者写道:

基于这些现有研究的发现,可以得出结论:TDD 看来可以提升软件质量,特别是在纯商业背景中。对于半商业背景或学院环境中的研究来说,结论不是那么明显,可这些研究没有提到任何软件质量的降低。TDD 给工作效率带来的效果不是十分明显,而且结果会根据研究的环境发生变化。然而,有证据证明:TDD 不一定会降低开发人员的工作效率,或是增加项目的交付时间。某些情况下,TDD 会带来显著的工作效率提升;同时,在提到的 13 个案例研究中,只有两个案例指出工作效率降低了,不过这两个案例同时指明质量的提升。

您使用 TDD 有哪些经验?见到质量的提升了么?对于开发人员的工作效率和开发时间,您看到了哪些影响?请在文后留下您的评论,分享您的经验。

查看英文原文: Empirical Studies Show Test Driven Development Improves Quality

2009 年 3 月 03 日 05:252335
用户头像

发布了 479 篇内容, 共 124.1 次阅读, 收获喜欢 24 次。

关注

评论

发布
暂无评论
发现更多内容

LeetCode题解:232. 用栈实现队列,使用两个栈 入队 - O(n), 出队 - O(1),JavaScript,详细注释

Lee Chen

前端进阶训练营

Pulsar Flink Connector 2.5.0 正式发布

Apache Pulsar

flink 开源 flink 消费 kafak Apache Pulsar

区块链支付通道系统搭建,USDT跑分承兑商系统

13823153121

区块链数字钱包开发,数字钱包app

13530558032

合约跟单模式系统开发,交易所合约跟单源码

13530558032

这篇文章,把中国科技的真实底子讲透了

CECBC区块链专委会

中国 科技 产业竞争

不要以为Bug写的好就是好程序员,其实这只占不到15%

小Q

Java 学习 程序员 架构 面试

JavaScript引擎的事件循环机制是怎样工作的?

Walker

Java 前端 运行时栈帧 事件循环

oeasy教您玩转linux010210管理应用aptitude

o

如何利用Chrome DevTools优化网页性能

熊斌

学习

USDT承兑支付系统,区块链跨境支付源码

13530558032

MySQL最全整理(面试题+笔记+导图),面试大厂不再被MySql难倒!

Java成神之路

Java MySQL 编程 程序员 面试

多线程与高并发之锁

彭阿三

多线程 多线程与高并发

朱嘉明:全球科技革命正在逼近“奇点”,区块链影响未来人类社会的走向

CECBC区块链专委会

人工智能 科技 科技革命

大项目写代码写到晕头转向?敏捷多项目框架解君愁

Philips

敏捷开发 程序设计 软件架构

拥抱K8S系列-06-K8S如何解决docker部署的问题

张无忌

Docker Kubernetes 运维 service

从外卖员到拼多多30K+程序员,我付出了三年的青春

小Q

Java 学习 程序员 架构 面试

oeasy教您玩转linux 010211 牛说 cowsay

o

.NET委托,事件和Lambda表达式

AI代笔

大数据任务调度 - 有向无环图(DAG)之拓扑排序

海豚调度

数据结构 大数据任务调度 DAG 拓扑排序 Apache DolphinScheduler

甲方日常 13

句子

工作 随笔杂谈 日常

澳门金沙玩赢了钱提现不了异常注单未更新有什么办法处理?

丛林里的余光

异常检测 澳门金沙 提现不了

LeetCode题解:232. 用栈实现队列,使用两个栈 入队 - O(1),出队 - 摊还复杂度 O(1),JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

云小课 |选定合适的证书,做“有证”的合规域名

华为云开发者社区

证书 课程练习 ssl

[翻译]Go Code Review Comments

卓丁

架构师训练营第十四周

Melo

从零开始搭建完整的电影全栈系统(四)——restfulApi用户的认证授权及用户注册

刘强西

RESTful API yii

记一种spring框架的想当然但错误的用法

小明同学

源码分析 最佳实践 Spring Framework bug

[翻译]Scalable Go Scheduler Design Doc[Go可扩展调度设计文档]

卓丁

golang golang scheduler Go scheduler

滴滴AR实景导航背后的技术

滴滴技术

人工智能 滴滴技术 实景导航 地图与公交事业群分享月

数字货币交易所开发方案,交易所源码

13530558032

NLP领域的2020年大事记及2021展望

NLP领域的2020年大事记及2021展望

实际经验证明:TDD可以提高软件质量-InfoQ