写点什么

TDD 真的可以确保质量?

  • 2008-01-31
  • 本文字数:1772 字

    阅读完需:约 6 分钟

加拿大国家研究委员会发表过一篇题为“测试先行方法对于编程的效果”的论文,其中有一些值得关注的评注。这项研究由 24 位 IT 专业的毕业生参加,它丰富了正在升温的关于测试先行领域的研究。尽管出于快速了解领域知识的目的,TDD 作为一种卓越的学习工具已被认可,但至于它是否真与软件质量直接相关,这个问题仍然没有得到证明。这次研究不具有最终的权威性,不过它仍然揭示出一些有趣的结论——尤其是在对实验结果进行分析时,存在有不同的声音。

下面的内容摘自于研究报告的摘要:

测试驱动开发(TDD)的基础是:首先用一个测试将一项功能规范地表示出来,然后实现这项功能,让测试通过,最后不断地重复这个过程。本论文描述了一次对照实验,它评估了 TDD 这个重要方面:即在 TDD 中,程序员首先会编写功能测试,然后才编写相应的实现代码。

多位大学毕业生参与了这次实验。其中实验组开发时运用了测试先行的策略,而对照组运用的是更为传统的开发技术——实现功能在先,编写测试在后。两组人员都遵循增量的过程,一次增加一项新功能,然后执行回归测试。

研究者对此的评注道:“实验的结果证实了测试先行技术的一个抉择理论——测试先行通常选择以生产力为中心,而不是质量。”

我们的主要结论是,坚持测试先行的程序员会为每个程序单元编写更多的测试。更进一步的,随着程序员测试的增加,生产力通常会按照比例达到更高的级别。因此,通过一系列的级联反应,测试先行似乎能够提高生产力。

……我们同时还注意到,随着程序员测试数量的递增,软件的最低质量在线性地增加。而它与采用的开发策略无关。

但是也有不同的声音。Jacob Proffitt 是一位博客作者,自称是一位“充满热情的程序员,偶尔当一下管理人员,总的来说是个多才多艺的技术人员”。他研究了这篇论文后,在 blog 上发表了对论文的质疑。他认为,这篇论文在下结论时存在着强烈的确认偏袒 [译注 *](confirmation bias)——比如,文中的结论忽视了很多实验中的调查事实。他相信,“TDD 与质量的关系仍然有很多值得怀疑的地方”,比如:

  • 对照组(非 TDD,“后测试”)在每个方面上都获得了更高的质量——他们的质量有更高的上限、下限、平均值和中值。
  • 对照组坚持更少的测试,却获得了更好的质量。
  • 质量在 TDD 组才更显著地与测试的数量相关联(这是一个有趣的不同点,我不确定作者是否意识到了这一点)。
  • 对照组的生产力可以作为测试量的函数,因此是高度可预见的,而且它比 TDD 组拥有更强的测试相关性。

Jacob 指出,这些学生的数据告诉我们的唯一事实是:

  • 坚持测试先行的学生平均会写更多的测试。
  • 学生写的测试越多,生产率越高。
  • 软件的最低质量随着测试数量的提高而线性地提升。

IEEE 软件杂志的编辑 Hakan Erdogmus 是原始论文的合著者。他从不同的视角审视了这些观点:

单独一个学生,尤其是像我们的那些没有经验的学生,无论怎样安排实验,都不能证明或者证伪任何事情。实验的观察结果最多只能轻轻揭开大谜团的一角。在很多情况下,它们引发的疑问远远多于它们所能回答的,希望随着我们在研究中提出越来越多的相关问题,能加深我们对于这些现象的理解……事实上,经验主义的软件工程术语里头并没有“证实”这种说法。我们研究一种技术,充其量只能丰富我们的“证据”,并且提出一个待驳倒的理论来。尽管通过少数的实践以及一些值得注意的观察结果,我们可以宣称证据已经很充分了。但是,“陪审团”还在屋中讨论着,一直没有定论。

随后,Hakan 向 InfoQ 展示了关于 TDD 更为深入的探讨,这些讨论是基于目前已经完成的大量研究之上的:

从 2001 年到 2008 初所公布的 23 个 TDD 研究案例表现出一些相互冲突的结果,但是总的趋势却在走向一个一致的结论。研究结果的不同产生于上下文因素的多样性,它们都会影响到接受测量的结论和变量。在质量面前,即使存在些许争议,但结果是非常有说服力的。其中的 22 项研究,评估了一些内部或者外部的质量在 TDD 的影响下,会产生什么不同。其中 13 项报告表明 TDD 带来了不同程度的提高,4 项表明 TDD 不是决定性的因素,4 项表明没有非常明显的不同(包括我们自己的研究)。只有一项报告表明 TDD 导致了质量的下降。

译注 * 人在争论或作出判断时,总是习惯倾向于接受有利于自己观点的证据,而忽略不利于自己观点的证据。这种现象被称为“确认偏袒(confirmation bias)”。

查看英文原文: Does TDD Really Ensure Quality?

2008-01-31 11:12991
用户头像

发布了 53 篇内容, 共 14.0 次阅读, 收获喜欢 2 次。

关注

评论

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

邀你见证一本思维小册子的诞生:《豆哥宝典:思维模型》

豆哥

AI 思维模型 GPT 宝典

体育赛事直播平台源码解决方案,开发搭建系统架构的重要组成部分

软件开发-梦幻运营部

简单聊聊低代码

互联网工科生

低代码 数字化

Python 实训教学,更便捷的学生邀请及内容分发|ModelWhale 版本更新

ModelWhale

人工智能 数据分析 在线编程 高等教育 云课堂

WorkPlus安全专属的企业IM助力政企高效协作

BeeWorks

语音识别技术:现状、挑战与未来发展

来自四九城儿

“鲸鸿动能·品牌共创计划”发布,多项权益助力品牌激发无限潜能

最新动态

什么是多云? 为什么我们需要多云可观测性 (Observability)?

NineData

多云服务 多云架构 多云管理 多云 多云多源

低代码平台技术分享官丨工作流应用场景之任务交接

inBuilder低代码平台

工作流 低代码

云桌面如何部署?云桌面系统方案部署详细教程

青椒云云电脑

云桌面 云桌面系统

ETL数据转换方式有哪些?

RestCloud

数据同步 ETL

2023年10款好用的AI生成PPT软件盘点,干货建议收藏!

彭宏豪95

效率 软件 职场 PPT AIGC

Native SQLite Manager for mac(SQLite数据库管理器) 1.26.1全新激活版

mac

苹果mac Windows软件 Native SQLite Manager SQLite 数据库的工具

深入浅出了解华为云API网关的Gzip功能

华为云PaaS服务小智

云计算 软件开发 API 华为云

披荆斩棘的芒果 TV:基于 StarRocks 的云原生湖仓架构升级

StarRocks

数字货币双仓合约交易所系统开发搭建

V\TG【ch3nguang】

算启新程 智享未来,英特尔携中国移动为行业数字化转型提供新动能

E科讯

持续测试新范式:拨压测一体化

阿里巴巴云原生

阿里云 云原生 压测 拨测

基于Vue构建的快速开发框架

树上有只程序猿

Vue 低代码

SRM供应商招采系统(源码)

金陵老街

基于 ACK Fluid 的混合云优化数据访问(四):将第三方存储目录挂载到 Kubernetes,提升效率和标准化

阿里巴巴云原生

阿里云 Kubernetes 容器 云原生 ACK

SQL和Python,哪个更容易自学?哪个更适合数据工作的编程新手?

高端章鱼哥

Python sql

前端代码重复度检测

南城FE

JavaScript 前端 代码

回归营销初心,2023金投赏鲸鸿动能专场聚焦品牌重塑

最新动态

​左手 Serverless,右手 AI,7 年躬身的古籍修复之路

阿里巴巴云原生

阿里云 Serverless 云原生

TDD真的可以确保质量?_研发效能_Ben Hughes_InfoQ精选文章