第三章 · 测试的骨架:断言、夹具与替身


第三章 · 测试的骨架:断言、夹具与替身

章节摘要:循环提速之后,灯塔小组的测试集开始出现并发症:用例互相污染、测试数据越堆越乱、碰到支付网关就不知道怎么往下写。本章沿这条线补齐测试的骨架功夫——什么样的测试算好测试、fixture 怎么把装配与拆卸管起来、测试替身的边界画在哪里。骨架立住了,第 4 章的设计话题和第 5 章的遗留代码改造才有地基。

一条主线

周四,灯塔小组的循环突然卡壳。新需求"下单要扣真实库存"摆在面前,可总不能每跑一轮测试就给仓库下真单;雪上加霜的是,昨天写的折扣测试今天无故变红——查了半天,是另一个用例改了模块级的全局配置没还原。一天下来,团队修测试的时间比写实现还多。本章的三站就是冲着这两类病灶去的:先立"好测试"的验收标准,再学 fixture 把每个用例的现场管起来,最后用测试替身把外部依赖挡在测试之外。

沿途站点

  • 好测试的四根柱子——把"测试为什么互相伤害"追溯到属性缺失:不独立、不可复现、太慢、读不懂,四大病灶各有对治。这站立标准,后两站给工具。
  • fixture 与测试数据:构造、清理与供给——pytest 的夹具机制全解:带名字的原料供应、yield 前后分装配与拆卸、scope 的取舍、conftest 的共享,以及测试数据用工厂还是用参数化。
  • mock 与测试替身:边界画在哪——替身家族(dummy、stub、spy、mock、fake)的光谱与分工,以及最重要的那条边界线:只替自己拥有协议的东西。替身越界是测试维护费的头号来源。

三站的顺序也值得留意:先立标准再学工具,是因为工具一旦先于标准到达,就会被用来复制糟糕的现状——夹具再好,装配的仍是一堆互相污染的前提;mock 再妙,替的仍是不该替的陌生人。标准先行,工具才是在修路而不是在铺路障。

拐点与结论

本章的认知转折在替身那站:很多人把 mock 当成"遇到数据库就用 mock"的口头禅,方向反了。替身的本质是用协议换隔离——你替掉的必须是双方约定了接口的协作方,替陌生人等于把实现细节背进测试。fixture 那站也有自己的转折:夹具不是工具箱里的零件,而是"测试前提是一等公民"这个立场的物化——前提值得命名、值得复用、值得被签名表达。结论同样直白:fixture 管的是"测试自己的现场",替身管的是"测试与世界的边界",两条纪律守住,测试集才能在几十条的规模上依然秒级返回。

读完你应该

  • 能用四根柱子给一条测试做体检,指出它缺哪根、怎么补;
  • 能写出装配、拆卸、scope 各得其所的 fixture,并用 conftest 做跨文件共享;
  • 能区分替身家族五类角色,为支付网关、库存服务各选对替身类型;
  • 能说出"替身越界"的三种症状并给出重构方向;
  • 能把互相污染的测试集治理到任意顺序跑都绿。

先决条件与本章配套

本章的演练全部发生在单元测试层,前置要求是第 2 章的循环手感;替身一节会用到 pytest-mock 与标准库 unittest.mock,装配一节用到 pytest 内置的 tmp_path 与 monkeypatch,均可即装即用。骨架三件套的记忆口诀也提前放在这里:断言锁行为、夹具管现场、替身挡边界——三句话分别对应三节,读完回头再念,每个字都会变重。

下一章的接力

骨架功夫到位后,一个久违的现象会出现:测试写起来顺手,接口也随之变好——这不是错觉。第 4 章正面回答"测试先行如何浮现设计",并把 SOLID 原则放回红绿循环的坐标系里。

作者与出处
原作者:灏天文库
来源:平台策划编纂
整理人: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U