章节摘要:循环提速之后,灯塔小组的测试集开始出现并发症:用例互相污染、测试数据越堆越乱、碰到支付网关就不知道怎么往下写。本章沿这条线补齐测试的骨架功夫——什么样的测试算好测试、fixture 怎么把装配与拆卸管起来、测试替身的边界画在哪里。骨架立住了,第 4 章的设计话题和第 5 章的遗留代码改造才有地基。
周四,灯塔小组的循环突然卡壳。新需求"下单要扣真实库存"摆在面前,可总不能每跑一轮测试就给仓库下真单;雪上加霜的是,昨天写的折扣测试今天无故变红——查了半天,是另一个用例改了模块级的全局配置没还原。一天下来,团队修测试的时间比写实现还多。本章的三站就是冲着这两类病灶去的:先立"好测试"的验收标准,再学 fixture 把每个用例的现场管起来,最后用测试替身把外部依赖挡在测试之外。
三站的顺序也值得留意:先立标准再学工具,是因为工具一旦先于标准到达,就会被用来复制糟糕的现状——夹具再好,装配的仍是一堆互相污染的前提;mock 再妙,替的仍是不该替的陌生人。标准先行,工具才是在修路而不是在铺路障。
本章的认知转折在替身那站:很多人把 mock 当成"遇到数据库就用 mock"的口头禅,方向反了。替身的本质是用协议换隔离——你替掉的必须是双方约定了接口的协作方,替陌生人等于把实现细节背进测试。fixture 那站也有自己的转折:夹具不是工具箱里的零件,而是"测试前提是一等公民"这个立场的物化——前提值得命名、值得复用、值得被签名表达。结论同样直白:fixture 管的是"测试自己的现场",替身管的是"测试与世界的边界",两条纪律守住,测试集才能在几十条的规模上依然秒级返回。
本章的演练全部发生在单元测试层,前置要求是第 2 章的循环手感;替身一节会用到 pytest-mock 与标准库 unittest.mock,装配一节用到 pytest 内置的 tmp_path 与 monkeypatch,均可即装即用。骨架三件套的记忆口诀也提前放在这里:断言锁行为、夹具管现场、替身挡边界——三句话分别对应三节,读完回头再念,每个字都会变重。
骨架功夫到位后,一个久违的现象会出现:测试写起来顺手,接口也随之变好——这不是错觉。第 4 章正面回答"测试先行如何浮现设计",并把 SOLID 原则放回红绿循环的坐标系里。