2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

测试驱动开发:众人关注,讨论热烈

  • 2007-09-24
  • 本文字数:1692 字

    阅读完需:约 6 分钟

近日以 JavaEye 为主的技术社区发起了一系列关于测试驱动开发的讨论。从讨论中可以看出,越来越多的开发者对测试驱动开发表现出浓厚的兴趣,一些人已经在实践中总结出了自己的经验;但与此同时,各种与测试驱动开发相关的误解仍然广泛存在。

在一个题为“这样的 TDD 实践方式有问题?” 的讨论串中,作者 hyysguyang 讲述了自己在面试中遇到的一个问题:以 TDD 的方式,编写“将一个句子反转”的程序。这个看似简单的例子,却让作者 和面试者产生了很大的分歧,并引发出关于“如何测试驱动开发”和“如何重构”的大量讨论。作为对这个帖子的回复,gigix 在题为“测试如何驱动开发”的帖子中写了三个测试案例,分别测试“把句子拆分成单词”、“反转一个句子”、“反转另一个句子”的功能。

随后的讨论围绕着“TDD 和传统意义上的测试之间的区别”展开。ozzzzzz 这样说道:

测试是测试,测试驱动是测试驱动,别把两个东西搞混了。说白了测试驱动还是需求驱动,而测试则需要考虑更多的东西。gigix 的做法在 tdd 看来很棒,但是在测试角度看则很不完整。TDD 的做法并不是要你在最早就准备好一个完整的测试系统,而是要你通过写准对需求的测试,也就是针对功能的测试,来因对性的完成你的代码。这是一个由需求,转换为针对测试,再 [转换为] 因对的代码的过程。

对于并非直接功能需求的“把句子拆分成单词”的测试案例,gigix 的解释是:

这个测试就是所谓的“设计过程” 我把一个大的问题分解成两个小的问题,先用测试驱动解决第一个,再用测试驱动解决第二个。
一开始我只考虑怎么实现。我设计了一个 split 的功能,所以我给它写测试,然后实现它。实现完以后,我发现 split 显然不应该是 StringReverser 的功能,所以我重构它,把它抽取到 SentenceSplitter 类,并且把对应的测试也搬到 SentenceSplitterTest。这个时候 StringReverser 的 split 方法只是一句直接的 delegate,所以不需要测试,并 且可以直接 inline 到 reverse 方法内部去。

众所周知,测试驱动开发在大部分企业里仍然没有得到实施,更多的开发者还在用观望、了解和学习的态度看待它,一个常见的问题就是“花费时间写测试是否合算”。在题为“ TDD,想说爱你不容易”的文章里,作者 yananay 对实施测试驱动开发的成本和收益做了一个简单的核算:

一个月下来,我能运行的测试类有 140 多个……这样,每次系统改动的时候,我只要把这些测试全运行一次,就知道我负责的模块是不是有问 题。 那么其他人呢?他们仍然在手动测试……就算我那 140 个测试方法都是单独的,[编写] 每个方法我需要 10 分钟, 那么我需要 1400 分钟,1400/60 = 23.3 个小时。也就是说,一个月下来,我只需要多付出 23.3 个 小时。 那么收益是多大呢?一个月后,我只需要 20 分钟就可以知道系统是不是存在错误,而他们却 需要几个小时,而且未必准确。

James Zhao 在讨论中对测试驱动开发做了一个很好的总结:

既然是测试驱动,那么,TDD 就和需求关系紧密,至少距离需求比较近,而不是传统的那些开发过程,测试排在最后。软件最终由程序员写代码实现,所以程序员需要理解需求,实现系统功能,把问题解决在自己的范围之内,因此是不是测试驱动开发,程序员自己的测试都很重要,而测试驱动开发就更向前走了超前的一步,保障软件的质量,开发的效率。 至于风险,应该说随着软件开发方法、开发过程理论实践的不断发展,风险是逐渐下降的,也就是说,使用传统的开发过程,风险可能会更大。能够起到多大的作用,提高多少效率,存在多大风险,在于使用 TDD 的开发者的水平。

在文章的最后,作者 yananay 毫不掩饰地表达出自己对测试驱动开发的信心:

如果你是一个准备购买软件的客户,那么你可以毫不犹豫地要求软件开发商使用 TDD 的方式, 因为你应该知道这样做其实是在保护你的利益。如果你是一个老板,那么你应该立刻要求下属学习并实践 TDD,如果客户不买单,那么你应该 买单,因为你应该相信,微小的成本会换来更好的软件,更好的软件会迎来更多的客户。 如果你是一个开发人员,那么你应该立刻学习并实践 TDD,如果你的客户和老板都不准备买 单,那么就自己买单。你应该相信,微小的付出,会换来更多的价值!

您的看法呢?

2007-09-24 21:091088

评论

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

Docker的安装及日常命令的使用

Geek_982ff5

6月月更

企业知识管理体系怎么搭建和运营?

小炮

开始使用DOCKER COMPOSE V2

mengzyou

Docker DevOps Docker-compose

动态路由协议之RIP协议,最古老的距离矢量协议!

wljslmz

IP 网络工程师 动态路由 6月月更 路由协议

中国标准走进国际视野,首个零信任国际标准的诞生往事

脑极体

@全球开发者|首届云原生边缘计算峰会邀您共话

华为云开发者联盟

云原生 边缘计算 kubeedge

云原生训练营大作业

jjn0703

一篇文章带你彻底了解哈希表

武师叔

算法 哈希表 6月月更

【云服务器】云计算平台的架构是什么样的?

Finovy Cloud

云服务器 GPU服务器

哈希游戏开发竞猜系统哈希值hash算法

薇電13242772558

哈希算法

移动平台打造新生态 | 助力企业跨业务、一站式、全场景的系统建设

BeeWorks

王者荣耀商城异地多活架构设计

流火

架构实战营模块七作业

天琪实刚亮

2022年中国新能源汽车换电市场发展洞察

易观分析

新能源汽车

OceanBase 成为信通院首批可信开源社区、可信开源项目

OceanBase 数据库

中国信通院 OceanBase 开源

从零开始搭建vue-cli项目

小恺

6月月更

架构实战营模块七 作业

库尔斯

架构实战营

直播回顾 | 7000字干货,深析区块链+汽车供应链金融的应用价值

旺链科技

区块链 产业区块链 供应链金融

【高并发】在高并发环境下该如何构建应用级缓存?

冰河

并发编程 多线程 高并发 异步编程 6月月更

都有哪些较好用的项目管理软件?

优秀

项目管理 项目管理软件

阿里云刘珅孜:云游戏带来的启发——端上创新

阿里云弹性计算

gpu 元宇宙 云游戏

盘点校招面试 HR 可能会问到的问题

宇宙之一粟

面试 校招 6月月更

【Spring 学习笔记(一)】第一个Spring程序与IoC思想

倔强的牛角

6月月更

华为云GaussDB首席架构师冯柯:摘取皇冠上的明珠,华为云数据库的创新与探索

华为云开发者联盟

数据库 华为云 GaussDB 国产数据库

应用流程挖掘,发现潜在RPA可实施的场景,助力银行优化业务流程

易观分析

RPA

科创人·神州数码集团CIO沈旸:最佳实践模式正在失灵,开源加速分布式创新

科创人

Java27岁了——一次争执引起的Java内卷生涯

写代码两年半

javase Java EE 6月月更

LabVIEW控制Arduino采集LM35温度传感器数值(基础篇—12)

不脱发的程序猿

单片机 LabVIEW Arduino LIAT 采集LM35温度传感器数值

LabVIEW控制Arduino采集热敏电阻温度数值(基础篇—13)

不脱发的程序猿

单片机 LabVIEW Arduino LIAT 采集热敏电阻温度数值

LabVIEW控制Arduino采集光敏电阻数值(基础篇—14)

不脱发的程序猿

单片机 LabVIEW Arduino LIAT 采集光敏电阻数值

当AI抄起了水表

华为云开发者联盟

人工智能 modelarts workflow 智能水务

测试驱动开发:众人关注,讨论热烈_研发效能_林芷薰_InfoQ精选文章