写点什么

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

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

关注

评论

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

架构设计流程

天天向上

架构实战营

Java面试题超详细整理《Spring篇》,Tencent后台开发Java岗二面

Java 程序员 后端

Java高手是怎样炼成的?阿里P8技术大牛这份手写笔记告诉你答案!

Java 程序员 后端

JUnit5学习之一:基本操作,菜鸟教程java在线编辑器下载

Java 程序员 后端

Kafka性能调优实战:同等资源配置性能提升20几倍的秘诀

Java 程序员 后端

Kubernetes任务调用Job与CronJob及源码分析(1)

Java 程序员 后端

Kafka-on-Pulsar 的前世今生,新秀 Pulsar 到底好在哪?

Java 程序员 后端

kubebuilder实战之三:基础知识速览,mybatis运行原理步骤

Java 程序员 后端

架构 3 期模块二作业:下微信朋友圈的高性能复杂度

渐行渐远

架构实战营

JDK的前世今生:细数 Java5 - 15 的那些经典特性

Java 程序员 后端

【架构训练营】毕业总结

zclau

JMM - Java 内存模型,java读写锁源码分析

Java 程序员 后端

JVM总体概述,java高级开发面试经验

Java 程序员 后端

JVM篇:对象的深度剖析,mybatis入门程序

Java 程序员 后端

Java面试被MySQL问哭了,面试官一个连环炮提问,我一个都讲不清

Java 程序员 后端

模块二作业

小朱

架构实战营

java面试题,mybatis原理和实现机制

Java 程序员 后端

Jedis入门教程,java入门课程百度网盘

Java 程序员 后端

JUnit5学习之三:Assertions类,java微服务架构训练营

Java 程序员 后端

Kubernetes 常用命令大全,震撼来袭免费下载

Java 程序员 后端

Java面试屡碰壁,一气之下狂刷高分宝典,一月之后拿到字节offer

Java 程序员 后端

Java面试经,nginx解决跨域原理

Java 程序员 后端

【架构训练营】毕业设计

zclau

模块二作业

小鹿

Java高级特性之 IO流,java面试题高级

Java 程序员 后端

架构实战营 毕业总结

脉醉

Java高级特性之 IO流(1),三面蚂蚁金服(交叉面)定级阿里P6

Java 程序员 后端

架构营模块二作业

GTiger

架构实战营

Java面试题超详细整理《多线程篇》,mongodb教程导入外部数据

Java 程序员 后端

JVM内存溢出分析:堆内存溢出+虚拟机,BTAJ大厂最新面试题汇集

Java 程序员 后端

Kotlin之DSL,java面试写代码

Java 程序员 后端

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