写点什么

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

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

关注

评论

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

【YashanDB知识库】outline固化执行计划

YashanDB

yashandb 崖山数据库

广东人仁康一项技术通过国家科技成果评价达到国际先进水平平

Geek_2d6073

Linux设备驱动系列(14) —— 使用全局工作队列

Linux内核拾遗

Linux内核 中断 工作队列

计算机英文教材太难啃?Higress 和通义千问帮你!

阿里巴巴云原生

阿里云 云原生 Higress

PingCAP 与沙利文联合发布《中国企业全球化运营白皮书》

先锋IT

天润融通,荣获2024中国AI应用层创新企业

天润融通

人工智能 天润融通

Pika 主从数据同步状态指标 “repl_connect_status” 简介

apache/dubbo-go

redis Pika

蓝易云 - javaee springMVC model的使用

百度搜索:蓝易云

Java 云计算 运维 服务器 云服务器

报名倒计时 2 天!龙蜥社区系统安全 Meetup 演讲亮点一览

OpenAnolis小助手

操作系统 系统安全 浪潮信息 龙蜥meetup

Altair RapidMiner,将数据科学、深度学习等多种功能同时集成的一站式数据分析平台

Altair RapidMiner

机器学习 大模型 #人工智能 #数据分析

开发体育赛事直播平台源码:具备全面的体育数据资料库

软件开发-梦幻运营部

GitHub爆火标星127k!这份字节Python背记手册到底有什么魔力?

没脾气

Python 程序员 自学编程 python教程 python自学

神仙级python入门教程(非常详细),从零基础入门到精通,建议收藏

没脾气

Python

Netty FastThreadLocal实践

FunTester

小游戏应该如何创建一个元服务项目

FN0

鸿蒙卡片 元服务

惊了!字节大佬总结的这份《零基础学python神级笔记全彩版》真的太强了

没脾气

Python 程序员 自学编程 架构师 自学python

蓝易云 - javaee springMVC数字类型转换之通过注解的方式

百度搜索:蓝易云

Java 云计算 运维 服务器 云服务器

RA8D1-Vision Board上OSPI-Flash实践

芯动大师

瑞萨MCU

读书笔记《一如既往》

酱紫的小白兔

龙蜥社区 5 月度运营大事件回顾

OpenAnolis小助手

开源 操作系统 龙蜥社区 月报

从仿真到生成式仿真,大模型助力工业智能化发展

Altair RapidMiner

#人工智能 仿真技术 制造业数字化 #大模型

业务转型,你的团队该如何应对?

凌晞

团队管理 数字化业务转型IT路线图

案例研究|为什么 CDG 会选择从 DataDog 迁移至观测云?

观测云

可观测性

What’s new in Apache/dubbo-getty 1.5.0

apache/dubbo-go

dubbo

低代码开发赋能教育数字化及典型场景

不在线第一只蜗牛

低代码 教育新创

6 大亮点!全新 Anolis OS 23.1 GA 版正式发布,满足多样化平台支持

OpenAnolis小助手

操作系统 国产操作系统 龙蜥操作系统 Anolis OS Anolis OS 23.1

SMC-R 透明加速 TCP 技术,在 Redis 场景下的应用实践 | 干货推荐

OpenAnolis小助手

操作系统 龙蜥社区 SMC-R 浪潮信息 TCP 技术

低代码用得好,开发真的很顺手

伤感汤姆布利柏

数据驱动的未来:数据融合与平台化应用的探索

快乐非自愿限量之名

低代码 数据驱动 平台化

ApsaraMQ Copilot for RocketMQ:消息数据集成链路的健康管家

阿里巴巴云原生

阿里云 RocketMQ 云原生

蓝易云 - javaee springMVC cookie的存入和取出

百度搜索:蓝易云

云计算 运维 Cookie 云服务器 JavaEE

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