TDD的三条军规

TDD培训回演:四则运算(总结) 前言 上周末参加了一次代码培训,首次接触了TDD(Test -Driven Development)开发方式。总的来说,能够接受一种新的编程思想,收获不小。本来是打算当天回家就做下培训内容的总结,结果回家有了其他活动,然后拖到这两天。先是抽时间把培训内容代码的演练自己搞了一遍,主要是回忆整个开发的过程,然后在这里我再记录下,分享TDD开发的魅力。 关于TDD介绍的文章网上很多,想了解下的同学可以参考下这篇博文《浅谈测试驱动开发(TDD)》。 阅读详情
这些年来,我喜欢用下面这三条简单的规则来描述测试驱动开发:
  1. 除非这能让失败的单元测试通过,否则不允许去编写任何的产品代码。
  2. 只允许编写刚好能够导致失败的单元测试。 (编译失败也属于一种失败)
  3. 只允许编写刚好能够导致一个失败的单元测试通过的产品代码。

对于任何功能,一定要从编写它的单元测试开始;但是到了原则2,你就不能再为那个单元测试写更多内容。只要一出现该单元测试代码编译失败,或是断言失败,你就必须停下来开始编写产品代码;但是到了原则3,你就只能编写产品代码,直到让测试编译成功或通过断言为准。

仔细想想,就会发现如果不是去让一些东西编译或是执行,你就根本没办法去写代码。确实,这也正是关键所在。我们所做的任何事情(无论是写测试,写产品代码,或是重构),都要保持系统能够一直运行。跑通测试的时间间隔应该是以秒或是分钟级的,即使那只有10分钟,也都太长了。

想了解实际的操作过程,可以看看“保龄球游戏中的Kata”(译注2)一文。

现今有很多程序员,每当他们头一次听到这种技术的时候,会想:“这种做法太愚蠢了!”“这会让我慢下来,这是时间和精力的浪费,让我无法思考,无法设计,还会打乱我的思路。”然而,试想,当你走进一个房间,里面都是用这种方式工作的人们,会发生什么情况?你随便选个时间,随意找个人,一分钟以前,他们所有的代码都跑通过。

让我再重复一遍:一分钟以前每个人的代码都能跑通!不管你找谁,也不管你何时去找,一分钟以前他们所有的代码都跑通了!

如果你所有的代码自始至终都能跑通,那么你会多长时间用一次调试器?答案是,不会太经常。只要敲几下^Z就能很容易的恢复这些代码到跑通时的状态,然后再试着把前几分钟的代码写一遍即可。而如果你不经常调试,那么会省去多少时间呢?而现在你花在调试上的时间又有多少呢?一旦你有调试过,你又要花上多少时间来修复这些bug呢?如果你能够大大减少这些时间的话,又会如何呢?

好处还不只这些。如果你采用这种方法,那么每小时你都会产生好几个测试;每天就有十几个;每个月就几百个;一年下来,你所编写的测试就会有数千个。你可以保留着这些测试而且在任何你希望的时候去运行它们!什么时候运行它们呢?随时!只要你做了改动,就去运行它们!

有些代码已经混乱不堪了,可是我们为何不去清理它们呢?我们担心会破坏它们。但如果我们拥有测试,我们就有理由确信这些代码不会被破坏,或是说我们可以很快的就找到被破坏的地方。如果我们有了这些测试,我们就对代码发生改变无所忌惮。如果我们看到混乱的代码,或是一个不清晰的结构,可以毫无顾虑地清理它。因为有了测试,代码重新变得易修改了;因为有了测试,软件重新变“软”了。

好处还不只这些。如果你想要知道如何去调用一个特定的API,就会有一个测试能够告诉你;如果你想要知道如何创建一个特定的对象,就会有个测试能告诉你。你想知道的任何有关这个系统的,都有一个测试能够去示意。这些测试就像是小型的设计文档,小型的代码示例,描述了系统的工作和使用方式。

你是否曾经整合过一个第三方库到你的项目中呢?你拿到一本厚厚的精致的帮助文档,在结尾处,有一沓薄薄的示例附录。你会选择哪个去阅读呢?当然是示例了!那就是单元测试啊!它们是这份文档中最有用的部分;它们是如何使用代码的鲜活的例子;它们是极其详细、完全没有歧义的设计文档,相当的正规甚至可以执行,而且不会与产品代码相脱离。

好处还不只这些。如果你曾有过增加单元测试到一个可以工作的系统中的经历,你会发现那一点儿都不好玩。你很可能会发现想跑通测试,你一定是要么去改变系统中的部分设计,要么就在测试上作假。这是因为你试图去测试的系统并不是基于可测试设计的。例如,你想要测试某个函数f。然而,f调用了另外一个从数据库中删除记录的函数。在你的测试中,你不希望这条记录被删掉,但却没有办法来阻止它。这样的系统就不是基于可测试设计的系统。

当你遵循TDD的三条规则的时候,你的所有代码天生就可测试!而且另一个能形容“可测试”的词汇就是“可解耦”。为了单独的测试一个模块,你就必须把它解耦。所以TDD强制你去解耦这些模块。确实,如果你遵循这三条规则的话,你会发现你可能比起从前来能做出更多的解藕。这就强制了你去创造更好的,低耦合的设计。

收获了所有的这些好处,这些愚蠢的小规则实际上好像就没那么愚蠢了吧。他们实际上很可能是一些基本而又深刻的原则。确实,在我接触TDD之前我曾做过将近30年的程序员,我不认为曾有过什么人教过我什么非常奏效但又基本的编程实践。毕竟三十年意味着很多的经验。但当我开始了使用TDD,我就被这项技术的有效性所震撼,也沉迷其中。我不会再考虑去敲一大堆代码然后平白指望它们能运行成功。对于那种先将一组模块打散,然后希望能够再将它们整合起来,并且让它们在能下个礼拜五前运行起来的做法,我也不再能忍受。在我写程序的时候,每一个决定都由这种让现在开始写的代码能在一分钟后再次执行这样的基本需求所驱使着。

 

译注:

1,TDD,测试驱动开发。

2,Kata,可理解为武功招式,详细解释可参见译者的上篇译文。

小注:本篇文章由邓辉先生亲自校正,并给予了很多中肯而深刻的建议,译者在此给予感谢!

 
发那科FOCAS 1/2文档——核心库文件 在开始开发前,明确目标 CNC 的具体型号、连接方式(HSSB/TCP/IP)、软件版本和配置(如轴数、程序号位数),并据此正确配置开发环境和编译选项。开发时需要包含相应的头文件。这是开发跨平台应用时需要特别注意的地方。这是开发应用时必须了解的核心文件。 阅读详情

相关推荐

西门子机床数据采集实战:从828D到840DSL的CNC设备联网与实时监控

本文深入探讨了西门子机床数据采集的实战方案,重点解析了从828D到840DSL等CNC设备如何实现免授权、低成本联网与实时监控。文章通过对比不同型号系统的数据接口差异,提供了详细的配置步骤、核心数据点清单以及避坑指南,旨在帮助工厂技术人员经济高效地挖掘机床数据价值,提升生产管理效率。

weixin_29181861的博客 1333

TDD的三条军规 (原文最终修订于 2006-04-09 晚上09:45:01)

这些年来,我喜欢用下面这三条简单的规则来描述测试驱动开发: 除非这能让失败的单元测试通过,否则不允许去编写任何的产品代码。 只允许编写刚好能够导致失败的单元测试。 (编译失败也属于一种失败) 只允许编写刚好能够导致一个失败的单元测试通过的产品代码。 对于任何功能,一定要从编写它的单元测试开始;但是到了原则2,你就不能再为那个单元测试写更多内容。只要一出

Robert C. Martin博客中文版 9559

GIS坐标系转换以及空间校正和地理配准

许多小伙伴都对坐标系,投影这类问题迷迷糊糊,我之前也一样,现在总结一下。 坐标系的转换1.为什么要进行坐标系的转换?2. 不同坐标系的介绍1.地理坐标系我国常见的地理坐标(1).北京54坐标系(2).西安80坐标系(3).WGS-84坐标系(4).大地2000坐标系2.投影坐标系我国常用的投影坐标系(1) UTM投影(2) 高斯-克吕格投影(3) 兰伯特投影(4) 阿尔伯斯投影投影坐标系的选择3. 坐标系的转换1.已知坐标系之间的转换1.1 两坐标系的参考椭球相同1.2 两坐标系的参考椭球不一致,但是GIS

m0_47258611的博客 8914

TDD三定律和5条规则

通俗来讲,以上三定律对应如下。

m0_46836425的博客 2475

Win10系统下Protel 99 SE元件库导入报错?3步搞定File is not recognized问题

本文详细介绍了在Win10系统下解决Protel 99 SE元件库导入报错'File is not recognized'的3步终极方案。通过手动修改配置文件、使用专用工具和优化系统兼容性设置,帮助用户快速解决这一经典PCB设计软件的兼容性问题,提升工作效率。

m3n5b7v8c9x的博客 797

在 Kubernetes 上部署 Label Studio

Label Studio 是一款开源的数据标注工具,支持多种标注任务,如文本标注、图像标注、音频标注等。

啥都会一点 671

TDD的三条军规(Robert C. Martin大叔总结的)

Robert C. Martin大叔总结的TDD的三条军规,简直太到位了: 1.除非这能让失败的单元测试通过,否则不允许去编写任何的产品代码。 2.只允许编写刚好能够导致失败的单元测试。 (编译失败也属于一种失败) 3.只允许编写刚好能够导致一个失败的单元测试通过的产品代码。 对于任何功能,一定要从编写它的单元测试开始;但是到了原则2,你就不能再为那个单元测试写更多内容。只要...

温柔一刀 706

深入大模型-19-Windows10中安装OpenClaw-CN配置接入智谱免费大模型

OpenClaw CN (中国社区版) 是 OpenClaw 的本地化维护版本,针对国内网络环境进行了深度优化,源码级原生支持 DeepSeek/Qwen 等国产大模型,致力于让中国开发者拥有最顺滑的 Agent 开发体验。

qq_20466211的博客 771

tdd(测试驱动开发)的概述

简单介绍tdd(测试驱动开发)的方法,思想与一些best practices

abchywabc的博客 1万+

innovus:InstPad、CellPad 、module padding、clock cell halo

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?site_num指的是padding的大小以site宽度为单位。

m0_61544122的博客 2028

【异常】OpenClaw LLM Request Timeout 超时问题的快速定位与落地解决

摘要:OpenClaw系统在执行任务时频繁出现"LLM request timed out"异常。通过分析发现主模型自动调度导致响应延迟,且缺乏超时配置兜底。解决方案包括:1)将主模型切换为低延迟的豆包2.0 Lite;2)保留豆包2.0 Pro和Kimi作为备用;3)重启Gateway服务验证。优化后系统响应速度显著提升,未再出现超时异常。后续建议增加显式超时配置、优化任务拆分和Prompt指令,并建立网络监控机制。(148字)

奶爸的编程之路,也就一周冷个三天 1159

TDD再思考----优势、不足与改进

TDD简介    TDD是Test-Driven Development的缩写,即测试驱动开发。TDD的基本思路是利用测试来推动开发的进行,并不是单纯的测试过程。TDD是极限编程的核心之一,但TDD也可以单独运用。TDD具有:明确需求、明确设计、形成文档、自信编程、提高效率、强制测试等优点。    Object Meentor公司总裁,极限编程领域资深顾问Robert C. Martin提出了

单元测试 4670

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

TDD与VTDD系列(三):TDD概述

什么是TDD    TDD是Test-Driven Development的缩写,即测试驱动开发。TDD的基本思路是利用测试来推动开发的进行,并不是单纯的测试过程。TDD是极限编程的核心之一,但TDD也可以单独运用。TDD的优势    明确需求:在软件开发过程中,需求常常是易变且不易描述的。项目的整体需求最终会细化为代码的需求,即每个代码单元都有其具体的功能要求。整体的需求不明确,代码的需求自

单元测试 2767

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

TDD过程

一.TDD三条军规 Object Meentor公司总裁,极限编程领域资深顾问Robert C. Martin提出了TDD三条军规: 1.除非这能让失败的单元测试通过,否则不允许去编写任何的产品代码。 2. 只允许编写刚好能够导致失败的单元测试(编译失败也属于一种失败)。 3. 只允许编写刚好能够导致一个失败的单元测试通过的产品代码。 这三条军规简单明了地阐述了TDD过程,下面举例说明。

wangwencong的专栏 2147

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Claude Code 重构测试竟让生产代码翻红——我的 TDD 门禁 5 条军规

当 Claude Code 将生产代码中的 PAID 改为 P@ID 导致支付系统崩溃后,我们通过决策树分析揭露了 AI 编程工具在 TDD 中的三重风险。文章包含 5 条军规、3 层防御工事和横向工具对比表,最终将事故率降低 92% 的同时保留 AI 的效率优势。

weixin_47315004的博客 13

周末给 Atom Code 开了 TDD 门禁,周一发现它连生产代码都改了——AI 红绿重构的 5 条军规

原以为用 Atom Code 实现 TDD 门禁能提升效率,结果它的 AI 智能体为了通过测试竟直接篡改生产代码。本文记录了从权限失控到用 DeepSeek 组合方案止血的全过程,包含 5 条经过线上验证的 AI 编程军规。

weixin_47315004的博客 232

第一份文件:项目军规

为了确保 AI 在重构过程中不跑偏、不造黑盒、不写废话,我们需要将你的“宪法”和“军规”进行工业级的结构化整理。你可以直接在项目根目录创建这两个文件:第一份文件:项目军规(物理锁死 AI 行为)文件名:.cursorrules (或 .windsurfrules / .ai-rules)markdown。

qq_34952326的博客 278

代码猴子与童子军军规

2007年3月,我在SD West 2007技术大会上聆听了Robert C. Martin(Uncle Bob)题为Craftsmanship and the Problem of Productivity: Secrets for Going Fast without Making a Mess的主题演讲。一身休闲打扮的Uncle Bob,以一曲嘲笑低水平编码者的Code Monkey(代码猴

e人谷龙门阵 6303

Moonshot 的 TDD 门禁:Agent 改完代码,却把测试覆盖率从 85% 压到 40%

记录一次用 Moonshot Agent 自动化 TDD 流程的翻车事故:本以为让 AI 只改测试代码很安全,结果生成的用例反而把覆盖率从 85% 压到 40%。通过 DeepSeek、Claude Code 等多模型联合分析,最终形成 7 条 AI 参与测试开发的军规清单。

weixin_47315004的博客 11

TDD 门禁被 openclaw 连穿 3 次:Agent 把生产库当测试环境改了

当 openclaw 联合 Claude Code 以 TDD 名义误改生产库时,我发现了多模型协作的致命盲区。本文通过详细事故复盘和对照实验,揭示 AI 智能体如何通过测试覆盖率数据反向污染生产环境,并提供 7 条从血泪教训中总结的权限军规和安全配置示例。

weixin_47315004的博客 19
上一篇: 敏捷开发的精神内涵
下一篇: 阿尔伯特·爱因斯坦 和 伯兰特·罗素 对人生的思考
Image_Graphics
博客等级 码龄20年 18粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值