写点什么

Bob 大叔谈测试驱动开发的适用性

  • 2009-11-09
  • 本文字数:1602 字

    阅读完需:约 5 分钟

Bob Martin 之前在一篇颇有争议的博文中声称“那些认为测试驱动开发(TDD)会减缓项目进度的人都生活在石器时代”。现在,他又深入分析了测试驱动开发的现实适用性、角色和优势

他首先提出了一个重要问题:“TDD 取代架构了吗?”。回答:“不,但是…”:

以为通过在白板上编写一个个测试用例就可以产生清晰架构的想法简直就是胡闹。你做的某些决定与测试毫无关系。 当然,很多决定可以并且应该尽可能的延期。例如,数据库模式(schema)可以等待很长时间。使用 Spring、JSF、Hibernate 和 JPA 等的决定也可以延迟做出。业务规则的魅力在于它们可以并且应该独立于数据库和 GUI 模块而实现。

这是底线。你不能通过 TDD 得到一个完整的架构。TDD 可以告诉你某些架构决定,但是你无法在没有架构设计的情况下启动项目。因此某些预先的架构是必要的。其中最重要的一点是决定哪些架构元素可以延迟哪些不能。

回答完架构问题,Martin 又转向了下一个话题:“TDD 能够替代设计吗?”。他的回答:

不,你仍然需要所有的设计技能。你仍然需要了解设计原则和设计模式。你应该了解 UML。并且,你应该创建软件设计的轻量级模型。 …

事实上,TDD 是一门设计技术,但不是孤独的设计技术。所有的老设计规则和技能仍然适用。TDD 能够影响和增强它们。

针对他的有关“石器时代”的博文,Martin 探讨了“TDD 是否应该应用于每一行代码?”。答案还是否定的:

不。对于某些问题来说 TDD 是无益的。GUI 就是一个例子。 …

当然不仅仅是 GUI。摆弄(fiddling)的想法才是关键。如果你必须把代码摆弄到位,如果你必须摆弄一些方面以满足客户。如果存在一些不确定性只能通过快速的编辑——运行周期解决,那么 TDD 与其说是一种帮助,不如说是一种障碍。

管理的技巧在于认真的退耦(decoupling)。你需要确保识别出所有不需要摆弄的代码,然后把它们分成可以通过 TDD 编写的模块。确保摆弄的代码被隔离并降低到最少。

Martin 承认,事实上某些测试更适合稍后编写,他重申只有在必要时才需要这样做(当需要摆弄时)。最重要的原因在于“这种做法提高了每行代码和每个决定被测试的几率”,如果测试不首先编写,即使最训练有素的开发人员也会写出难以测试的代码。

Bob 大叔随后抛出了一个有趣的问题:“既然我们认可测试的必要性,为何会出现对测试优先的抵制?”。针对这个问题,他认为某些人不能增量的思考代码:

坦白说,我不知道(为何对测试优先的抵制如此强烈)。既然无论如何我们都要编写测试,很显然这不是一个生产力的问题。 或许某些人不希望编写测试打断工作流。是的,当你首先编写测试时,你不能编写一个完整的算法。你不得不随着一个个测试的添加来完成这个算法。可能某些人对这种方式不适应。

Martin 最后对一个常见说法给予了答复:“如果没有这么高的测试覆盖率,项目进度不是会更快吗?”首先,他承认对遗留环境(代码没有测试)采取高覆盖率的确需要长期的高投入。针对非遗留环境和遗留环境的新代码,他的答案则相反,在这种情况下,高度自动化的测试覆盖会提升你的速度。原因在于:

第一,你无需做太多调试。如果你已经测试了每一行代码你会怎么做?根据我的经验,调试时间完全不需要了。在去年 FitNesse 的紧张开发过程中,我几乎没有花时间调试。如果不得不把时间量化,那么可能是 5 小时或者更少。 第二,我绝不会无意中破坏代码。测试集会在数秒钟内发现这种意外!这让我无所畏惧。当你勇往直前时,你的步伐就会更快。

第三,我的测试都是系统如何工作的小例子。每当我忘记系统的某部分时,我就读一下测试例子。它们让我的进度很快赶了上来。

第四,我无需持续的与 bug 作斗争。即使我有几千个用户,我的 bug 列表很小。每周花在技术支持的时间不超过一小时,而且通常都是告诉用户如何从指南中找到解决办法。

请查看 Bob 的博客以获得更多细节和具体实例,同时拿出一点时间阅读一下大量的回复和注释中的箴言。

查看英文原文: Uncle Bob On The Applicability Of TDD

2009-11-09 10:332196
用户头像

发布了 501 篇内容, 共 254.6 次阅读, 收获喜欢 59 次。

关注

评论

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

网易面试:SpringBoot如何开启虚拟线程?

王磊

Java

Zilliz Cloud Serverless Beta上线,限时免费

Zilliz

Serverless Zilliz 向量数据库 zilliz cloud

Overcoming Barriers: Real-World Case Studies of Fast Roaming in Industrial Settings

wallyslilly

IPQ6010 ipq5018 FASTROAMING

软件测试学习笔记丨Python 字符串基本操作

测试人

软件测试

加速物联网产业布局,英特尔联合震坤行推出智能物联聚合馆

E科讯

基于Ascend C的FlashAttention算子性能优化最佳实践

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 LLM 企业号2024年6月PK榜

win版Maplesoft Maple 2024(数学科学计算) v2024.1 特别版

iMac小白

Maplesoft Maple下载 Maplesoft Maple2024 Maplesoft Maple激活版 Maplesoft Maple特别版

win版StreamFab Downloader(视频下载工具) v6.1.8.2 激活版

iMac小白

win版Serato DJ Pro(专业DJ软件) v3.1.4.890 (x64)特别版

iMac小白

win版Radiant Photo(照片编辑美化软件) v1.3.1特别版

iMac小白

Radiant Photo下载 Radiant Photo特别版 Radiant Photo激活版

win版NetLimiter Pro(网络流量控制软件 v5.3.14.0 中文特别版

iMac小白

NetLimiter下载 NetLimiter特别版 NetLimiter激活版

win版BricsCAD Ultimate2024(2D与3D CAD建模设计) v24.2.05特别版

iMac小白

京东JD商品sku信息API返回值实践:商品规格数据驱动的供应链优化

技术冰糖葫芦

API Explorer API 接口 pinduoduo API

DeFi(去中心化金融)是什么,DeFi应用有哪些?如何利用它赚钱?

区块链开发团队DappNetWork

DeFi流动性挖矿 NFT链游 区块链开发 交易所源码 dapp合约开发

win版UniFab All-In-One(视频AI压缩转换处理) v2.0.2.3 特别版

iMac小白

UniFab Toolkit下载 UniFab Toolkit激活版

机关事业单位日志要保留多久?依据是什么?

行云管家

过等保 机关事业单位

MoneyPrinterPlus:AI自动短视频生成工具,赚钱从来没有这么容易过

程序那些事

工具 程序那些事 AIGC

win版DVDFab (DVD复制备份) v13.0.1.9 特别版

iMac小白

DVDFab 下载 DVDFab 激活版 DVDFab 特别版

区块链DAPP开发,源码搭建,定制开发流程

区块链开发团队DappNetWork

DeFi质押挖矿 区块链开发 链游开发dapp开发

深入理解Playwright的高级功能和用法

我再BUG界嘎嘎乱杀

Python playwright

win版Android Studio(安卓开发环境)v2023.3.1.20 特别版

iMac小白

即时通讯技术文集(第40期):推送技术合集(Part2) [共18篇]

JackJiang

网络编程 即时通讯 IM

win版PilotEdit Lite(高级文本编辑器) v18.8.0 激活版

iMac小白

PilotEdit下载 PilotEdit激活版

解读surging 的内存过高的原因

不在线第一只蜗牛

内存 .NET 7

初学者也能用!快速上手 UDF for Python 全攻略

TDengine

数据库 tdengine 时序数据库

软件测试学习笔记丨Python 运算符

测试人

Python 软件测试

全网爆火【MBTI人格测试】是如何实现的?

AppBuilder

Bob大叔谈测试驱动开发的适用性_Java_Mike Bria_InfoQ精选文章