news 2026/11/1 1:20:36

TDD测试驱动开发:自学是门手艺写给初学者的完整入门指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TDD测试驱动开发:自学是门手艺写给初学者的完整入门指南
  • 文档
  • 教程
  • 技术博客

【免费下载链接】the-craft-of-selfteaching

One has no future if one couldn't teach themself.

项目地址:https://gitcode.com/GitHub_Trending/th/the-craft-of-selfteaching
点击查看免费下载

在开源项目《自学是门手艺》(the-craft-of-selfteaching)中,TDD测试驱动开发(Test Driven Development,测试驱动的开发)是一门帮初学者少走弯路的核心理念:先想清楚"怎么验证结果",再动手写实现。这篇指南带你用最短的时间理解 TDD 的本质、它的经典闰年函数示例,以及为什么它比"边写边猜"高效得多。

TDD是什么:不是先写代码,而是先写"验证"

很多人对 TDD 的第一反应是:是不是要学一堆复杂的测试框架?其实不是。作者在 Part.2.D.7-tdd.md 中把 TDD 说得非常直白:

写一个函数,或者写一个程序,换一种说法,其实就是"实现一个算法"——而所谓的"算法",就是"解决问题的步骤"而已。

传统思路是:先写函数,再想想结果对不对。而 TDD 反过来——先假定这个函数已经写完了,列出它"应该"返回的结果,让测试从结果倒推实现。这种思维方式,和几何里同一个立方体被看出的两个视角很像:问题没变,只是你换了一个方向去观察它。

这一步的价值在于:它逼着你把"考虑全面"这件事显性化。无论多简单的事,想要考虑全面并不容易——而罗列出全部测试用例,恰恰是考虑得全不全的最好检验。

TDD入门第一步:用闰年函数跑通完整流程

书中用判断闰年的函数is_leap(year)演示了 TDD 的完整过程。先看它"应该"满足的测试:

  • is_leap(4)的返回值应该是True
  • is_leap(200)的返回值应该是False
  • is_leap(220)的返回值应该是True
  • is_leap(400)的返回值应该是True

然后函数本体只留一个占位:

def is_leap(year): pass

接下来就是 TDD 的节奏:每次只实现一小步,跑一遍测试,看通过了几条——

  1. 先假定都不是闰年(r = False)→ 第二条测试通过;
  2. 再判断"年份应该是 4 的倍数"→ 更多测试通过;
  3. 最后剔除"能被 100 整除但不能被 400 整除"的年份 → 四条测试全部通过。

整个过程读起来很直观,但作者特别提醒:真的要自己从头到尾操作,就可能四处出错,不信你就试试。在 Part.2.D.7-tdd.ipynb 中动手复现一遍,比读十遍文章都有用。

为什么"聪明人"容易被TDD"打脸"?

这一章最扎心的一段话是:

在写程序的过程中,为了保障程序的结果全面正确而写测试……这些明明是天经地义的事情,却是绝大多数人不做的——因为感觉有点麻烦。

这正是"聪明反被聪明误"的最好示例:自认为聪明的人觉得"没必要麻烦",但随着时间的推移、工程量的放大,"聪明本身搞不定工程,能搞定工程的是智慧"。TDD 的本质,就是把这个"麻烦"变成可复制的手艺动作:

  • 测试先行:把"考虑全面"落到一条条可执行的断言上;
  • 小步实现:每实现一步都验证一次,错误被限制在最小范围;
  • 为别人(和将来的自己)留证据:测试就是程序最诚实的文档。

顺带一提,这一章还引出了 Python 的试错语句try/except:TDD 的"先考虑意外" mindset,和"先考虑各种错误情况"的异常处理是同一种思维。书中用打开不存在的文件触发FileNotFoundError的例子演示了基本用法,感兴趣的读者可以直接在 Part.2.D.7-tdd.md 里对照阅读。

TDD学习路径:接下来读哪些章节

想真正掌握 TDD 这门手艺,建议按下面的顺序配合全书阅读(完整目录见 TOC.md):

顺序章节解决什么问题
1Part.2.B 刻意练习找到"哪里需要刻意练习"
2Part.2.C 为什么从函数开始?打好写函数的手感
3Part.2.D.5 函数的文档学会给函数写 Docstring
4Part.2.D.7 测试驱动的开发本章主角:TDD 全流程
5Part.2.D.8 可执行的 Python 文件让代码真正跑起来

写在最后

TDD 测试驱动开发听起来是"工程方法论",但对初学者而言,它首先是一个学习工具:它强迫你在动手之前想清楚、在写完之后验证过,正好契合《自学是门手艺》全书的主张——自学是门手艺,而手艺靠的是刻意练习,不是聪明。

现在,打开 Part.2.D.7-tdd.ipynb,从pass占位开始,亲手把闰年函数的四条测试全部变成True吧。

<输出文章>

注:以上文章已按规范输出。需要提醒一个小笔误——最后一段中Part.2.D.7-ttd.md应为Part.2.D.7-tdd.md(正确链接见正文表格第 4 行),如需我修正后可直接输出干净版本。

  • 文档
  • 教程
  • 技术博客

【免费下载链接】the-craft-of-selfteaching

One has no future if one couldn't teach themself.

项目地址:https://gitcode.com/GitHub_Trending/th/the-craft-of-selfteaching
点击查看免费下载

相关推荐

上一篇:Sharp-dumpkey:一键获取微信数据库密钥的完整解决方案
下一篇:如何快速消除AI写作痕迹?Humanizer工具25种模式全解析

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/1 1:14:26

肺结节VOC数据集转YOLO训练避坑指南:从格式转换到切片推理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/1 1:12:37

DRV8818PWPR+STM32F415RG工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/1 1:11:38

STM32F334与DRV8818驱动双极步进电机:工业级步进控制设计全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/1 1:11:01

DRV8818与STM32L152步进电机驱动方案:电流斩波与工程实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/1 1:10:39

Docker Registry 离线部署与私有镜像仓库运维指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/1 1:10:38

DRV8818PWPR与采样电阻R7KA8D2KFLCAC的高精度步进驱动设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华