飞天发布时刻:2024年 Forrester 公有云平台Wave™评估报告解读 了解详情
写点什么

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:121052
用户头像

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

关注

评论

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

了解MySQL6种约束的不同和特点

华为云开发者联盟

MySQL 数据 约束 主键约束 自增长约束

小喜量化交易系统开发|小喜APP软件开发

系统开发

BI掌柜量化交易系统开发|BI掌柜炒币机器人软件APP开发

系统开发

女神节·走近又美又飒的程序媛

华为云开发者联盟

华为 程序媛 IT 工程师 汉服

工作日志3-2-3

技术骨干

LoadRunner测试中遇见的不可思议的问题及其解决方法

陈磊@Criss

七日更 28天写作 3月日更

实现一个全链路监控平台很难吗?Pinpoint、SkyWalking、Zipkin,哪个实现比较好?

xcbeyond

架构 技术方案 链路监控 3月日更

MT马特量化交易系统开发|MT马特量化交易软件APP开发

系统开发

《我想进大厂》之分布式锁夺命连环9问 | 大理版人在囧途

艾小仙

Java redis zookeeper 分布式锁

面试现场:小伙伴的美团一面分享和分析[含答案]

小傅哥

Java 面试 小傅哥

阿里P8大牛亲自讲解!难道Android真的凉了?3面直接拿到offer

欢喜学安卓

android 程序员 面试 移动开发

Python 语言基础之 变量和常量

HoneyMoose

上线 Python 应用仅需一条命令的开源框架:Zappa(详细教程)

HelloGitHub

Python Serverless 无服务器云函数

Python基础之:函数

程序那些事

Python 数据分析 Python3 程序那些事

10 个解放双手超实用在线工具,有些代码真的不用手写

程序员小富

Java

二维码高端路线养成计

happlyfox

学习 技能 28天写作 3月日更

正则表达式.03 - 分组

insight

正则表达式 3月日更

《精通比特币》学习笔记(第四章)

棉花糖

区块链 读书笔记 3月日更

列表推导式与字典推导式,滚雪球学 Python

梦想橡皮擦

28天写作 3月日更

突破关系型数据库桎梏:云原生数据库中间件核心剖析

京东科技开发者

数据库 nosql 分布式系统

Python 语言基础变量定义和使用

HoneyMoose

【笔记】第六周 - 第 2 课

Geek_娴子

(28DW-S8-Day16) 在线教育体验课

mtfelix

28天写作

知识+AI融合创新探索,华为云论文被AI顶级学术期刊IEEE TPAMI接受

华为云开发者联盟

AI 模型 华为云 卷积神经网络 IEEE TPAMI论文

大括号之谜:C++的列表初始化语法解析

华为云开发者联盟

c++ 函数 语法 元素 std::array

数据分析师

Nydia

快速排序算法实现及优化

Silently9527

Java 排序算法 快速排序

亿级用户中心的设计与实践

vivo互联网技术

大数据 架构设计 数据安全

Python 语言基础变量的类型转换

HoneyMoose

拖延症这个毛病「Day 16」

道伟

28天写作

阿里P8大佬亲自讲解!万字Android技术类校招面试题汇总,已拿offer

欢喜学安卓

android 程序员 面试 移动开发

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