阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

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

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

关注

评论

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

软件开发常说的CI/CD是什么

越长大越悲伤

CI/CD

低代码未来会颠覆开发行业吗?

高端章鱼哥

软件开发 低代码 JNPF

Python 案例实训教学,支持“教师-学生”双视角切换|ModelWhale 版本更新

ModelWhale

Python 人工智能 数据分析 超算 云课堂

火热的低代码

这我可不懂

低代码 企业级应用程序开发 模型驱动

低代码概念——初步认识低代码

互联网工科生

低代码 企业级应用程序开发 JNPF

元载万物·智启新界,2023创业邦AIGC技术应用大会在深圳举行

创业邦

大模型知识助手,成功切入万亿级企业服务赛道

中关村科金

大模型 知识库

从降本增效到价值创造,大模型如何重塑智能语音产品

中关村科金

大模型 智能语音

没有苹果开发者账号能否创建ios证书-最新

驶向高效运营,StarRocks 助力蔚来汽车数据分析再升级

StarRocks

数据库 大数据 数据仓库 数据湖

简化测试流程,提供卓越服务:TestComplete+Salesforce满足不断发展的企业的需求

龙智—DevSecOps解决方案

从《孤注一掷》出发,聊聊 SSL 证书的重要性

火山引擎边缘云

https HTTP SSL证书 HTTPS协议

技术思维和管理思维

老张

技术思维 管理思维

可不能忽视的五个 HTTP 请求要点

Liam

程序员 前端 后端 HTTP API

Go 切片

小万哥

Go 程序员 后端 开发 Google

重新定义生产力与创造力的新力量

百度开发者中心

人工智能 ChatGPT 生成式AI 文心一言

DxO PureRAW for Mac(RAW照片处理器)v3.5.0中文激活版

mac

照片处理工具 苹果mac Windows软件 DxO PureRAW

不就是接根网线的事么?

小齐写代码

网络技术

2023值得关注的125家AIGC企业闪亮发布!

创业邦

没有苹果开发者账号能否创建ios证书-最新

雪奈椰子

Semi D2C 设计稿转代码的演进之路

SemiDesign

figma Semi Design D2C Design to Code

云原生架构:在云环境中构建弹性应用

树上有只程序猿

微服务 云原生 容器化

ARTS-WEEK3-23.8.28~23.9.2

EchoZhou

今年有什么新内容?《解开网络密钥 - 互联网研究指南》

小猪佩奇身上纹

Axure RP 9 for Mac(交互式产品原型设计工具) v9.0.0.3682中文激活版

mac

Axure RP 9 苹果mac Windows软件 产品原型设计软件

AutoCAD 2023 for Mac(cad2023) v2023.2.1注册激活中文版

mac

2023 cad 苹果mac Windows软件 AutoCAD2023

【区块链DAPP】智能合约概述

西安链酷科技

区块链 DAPP系统开发 合约交易所开发

搜索引擎基础《解开网络密钥 - 互联网研究指南》

小猪佩奇身上纹

DevOps理念:开发与运维的融合

这我可不懂

DevOps 自动化 开发运维

Maxon Explosion-proof Areas Monitoring CCTV Wireless Transfer Solutions

wifi6module

自动驾驶点云标注:挑战与解决方案

来自四九城儿

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