NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

  • 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:09787

评论

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

星策转型大咖说第二弹!前喜茶数字化副总裁、前百果科技首席技术市场官沈欣老师数字化转型经验分享!

星策开源社区

开源 方法论 转型 智能化转型

阿里大牛纯手写的微服务入门笔记,从基础到进阶直接封神

小二,上酒上酒

Java 编程 程序员 架构 微服务

推荐5款IDEA插件,堪称代码质量检查利器!

程序员小毕

Java 程序员 程序人生 后端 IDEA

解密金融行业数据云平台建设密码

数造万象

手把手教你成为荣耀开发者:商户服务开通指南

荣耀开发者服务平台

android 开发者 手机 荣耀 honor

案例 | 九科信息为某大型企业设计社保公积金自动缴存解决方案

九科Ninetech

2022最新整理上千道Java面试攻略,近500页PDF文档

钟奕礼

Java Java 面试 java程序员 java编程

个推发布《Android13适配指南》,解读Android13新特性

个推

android 安卓 安卓开发

Baklib知识库|为什么知识共享工具对减少内部知识缺口至关重要

Baklib

知识

完全解析大数据的高可用集群部署

好程序员IT教育

大数据

微服务调用的正确打开方式

Java全栈架构师

Java 程序员 面试 微服务 后端

CSS 基础属性篇组成及作用

千锋IT教育

EMR-StarRocks 与 Flink 在汇量实时写入场景的最佳实践

阿里云大数据AI技术

数据库 flink EMR 十一月月更

数据治理必读|基于Dataphin,快速建设高质量数据支撑业务发展

瓴羊企业智能服务

待办事项是什么意思,为什么要用?

优秀

待办事项

小伙伴面经分享京东+面试八股文整套面试真题(含答案)

钟奕礼

Java 程序员 java面试 java编程

在线电子表格,助力数据分析人员高效办公

流量猫猫头

大数据

测试自动化中遵循的最佳实践

禅道项目管理

自动化测试

2022年11月《中国数据库行业分析报告》重磅发布!精彩抢先看

墨天轮

人工智能 数据库 dba 智能运维 国产数据库

超详细图文保姆级教程:App开发新手入门(一)

YonBuilder低代码开发平台

开发者 App 新手入门

Java岗史上最全八股文面试真题汇总,堪称2022年面试天花板

小二,上酒上酒

Java 程序员 面试 八股文

工业物联网DCS和SCADA的区别

2D3D前端可视化开发

物联网 DCS web组态软件 SCADA 工业组态

KnowStreaming贡献流程

石臻臻的杂货铺

kafka 后端 11月月更

阿里P8大佬总结的Nacos入门笔记,从安装到进阶小白也能轻松学会

小二,上酒上酒

Java 编程 程序员 nacos

破坏系统是为了更稳定?混沌工程在去哪儿的4个阶段实践

TakinTalks稳定性社区

混沌工程 故障治理

ShareSDK for Flutter

MobTech袤博科技

这份1658页的Java面试核心突击讲,成功让我上岸阿里

小二,上酒上酒

Java 程序员 面试 阿里 大厂面试

自学 UI 设计有哪些书籍推荐

千锋IT教育

个推TechDay治数训练营直播预告 | 从方法论到落地应用,详解企业标签体系建设要点

个推

标签 用户画像 标签体系

提升汽车APP用户体验,火山引擎APMPlus的“独家秘笈”

字节跳动终端技术

性能监控 APP开发 应用性能 火山引擎 APMPlus

LigaAI X 猴子无限 | AIGC火了,人类又得到了什么?

LigaAI

分布式 大模型训练 研发协作平台 AIGC 大规模离散模型

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