网易首页 > 网易号 > 正文 申请入驻

我为什么站队芝加哥派TDD

0
分享至

测试驱动开发有两大门派,但大多数人入行时根本没意识到自己选了边。快速回顾一下:伦敦派(mockist)通过模拟协作者、断言交互来驱动设计;芝加哥派(classicist)则从内部向外构建,使用真实对象,断言值和状态。

我坚定地站在芝加哥派这边。原因如下,以及它为何与六边形架构完美契合。


模拟只属于边界。仅此而已。


我并不反对模拟。模拟在跨越你无法控制或不想在测试中触达的边界时非常好用:数据库、HTTP API、消息队列、时钟、文件系统。任何替代方案会导致缓慢、不稳定或产生无法撤销的副作用的场景。

边界之内?用真实对象。如果两个领域类需要协作,就让它们协作。把它们构建起来,调用方法,断言输出结果。这就是测试。

一旦你开始模拟自己的内部类型,你就不是在测试系统,而是在测试你对系统应该如何自我对话的假设。这是截然不同的两件事。

模拟掩盖了真正的问题

当你模拟一个协作者时,你是在手写你期望它返回的内容。那个模拟会永远快乐地返回你告诉它的任何东西,即使真实对象的契约在三次重构前就已经变了。你的测试保持绿色。生产环境崩溃。

真实对象不会放过你。如果协作者的行为变了,使用它的测试会察觉,因为它实际上在运行完整的流程。你得到一个早期、诚实的信号。模拟给你的却是舒适、虚假的信号。

好的测试不关心实现。模拟强迫你关心。


这是最让我困扰的部分。在我看来,测试的全部意义就是"给定这个输入,我期望这个输出(或这个状态变化)"。仅此而已。我不需要知道,也不关心代码如何到达那里。这种自由正是重构安全的保障。

重度模拟的测试摧毁了这一点。现在你的测试在断言类似"服务恰好调用了一次repository.findById并传入这个参数,然后调用mapper.toDto,然后……"的内容。你把实现细节烘焙进了测试。哪怕行为完全一致,只要你重组内部结构,测试就会爆红。这不是有用的信号。这是摩擦。

更糟的是:在严格模拟下,你甚至不需要正确实现功能。只要调用匹配预期,测试就通过。你可以满足契约而不遵守契约。我觉得这 genuinely 令人不安。测试不是在证明代码有效;它只是在证明代码打了正确的电话。

使用真实对象。其余用伪造。

我的默认策略是:能用到真实对象的地方都用真实对象。当我无法做到时(还是边界问题),我优先选择伪造而非模拟。

伪造是一个真实、可工作的实现,只是更简单。一个用Map而非Postgres存储的内存仓库。一个把邮件追加到列表而非真正发送的邮件发送器。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
2-0领先遭大逆转!科内输得不冤,朱婷尽力了,问题全在这

2-0领先遭大逆转!科内输得不冤,朱婷尽力了,问题全在这

金毛爱女排
2026-05-14 00:00:20
流量喧嚣下,莫忘真正价值所在

流量喧嚣下,莫忘真正价值所在

烽火瞭望者
2026-05-13 08:55:09
彻底撕破脸!卡塞米罗公开怒怼卡拉格,争议口水战彻底爆发

彻底撕破脸!卡塞米罗公开怒怼卡拉格,争议口水战彻底爆发

夜白侃球
2026-05-13 10:03:45
“1035元4只皮皮虾”事件最新进展:涉事出租车司机徐某已被开除;当事顾客称被网暴

“1035元4只皮皮虾”事件最新进展:涉事出租车司机徐某已被开除;当事顾客称被网暴

极目新闻
2026-05-13 13:15:20
还是那么漂亮,谁还记得她?

还是那么漂亮,谁还记得她?

东方不败然多多
2026-05-14 00:58:14
不断挑拨离间!小玥儿忍无可忍,一个动作揭开了与马筱梅的关系

不断挑拨离间!小玥儿忍无可忍,一个动作揭开了与马筱梅的关系

子芫伴你成长
2026-05-13 23:23:20
突发!灰熊前锋克拉克去世,年仅29岁

突发!灰熊前锋克拉克去世,年仅29岁

体坛周报
2026-05-13 06:33:13
“杀他全家也不解恨”,讨薪1560元20次遭拒,农民工怒杀老板全家

“杀他全家也不解恨”,讨薪1560元20次遭拒,农民工怒杀老板全家

易玄
2026-05-12 18:58:46
沈腾陪妻儿在江苏度假,王琦复胖目测有200斤,8岁儿子也壮了不少

沈腾陪妻儿在江苏度假,王琦复胖目测有200斤,8岁儿子也壮了不少

素衣读史
2026-05-13 15:53:12
好牛逼的状元!29岁带队进西决,30岁带队进东决,31岁带队进东决

好牛逼的状元!29岁带队进西决,30岁带队进东决,31岁带队进东决

球毛鬼胎
2026-05-12 11:24:51
别只盯特朗普专机,鲁比奥还是来了,释放比访问更重要的信号

别只盯特朗普专机,鲁比奥还是来了,释放比访问更重要的信号

兰妮搞笑分享
2026-05-13 09:06:32
性生活不足,原来会短寿!每周多少次比较合适?研究告诉你答案

性生活不足,原来会短寿!每周多少次比较合适?研究告诉你答案

医学原创故事会
2026-05-12 15:34:03
干了20年殡葬,我希望所有家属拿到骨灰后,不要把亲人塞进后备箱

干了20年殡葬,我希望所有家属拿到骨灰后,不要把亲人塞进后备箱

千秋文化
2026-05-12 20:21:18
轻断食再次封神!复旦大学研究证实,让肝脏脂肪在5个月内少20.5%

轻断食再次封神!复旦大学研究证实,让肝脏脂肪在5个月内少20.5%

橘子约定
2026-05-13 21:23:01
被姚明抱着上奥运的抗震小英雄,曾发誓考上清华,18年后成了这样

被姚明抱着上奥运的抗震小英雄,曾发誓考上清华,18年后成了这样

云舟史策
2026-05-13 07:17:23
研究表明:性生活次数不达标,不管男女容易早衰且癌症风险增高!

研究表明:性生活次数不达标,不管男女容易早衰且癌症风险增高!

黯泉
2026-05-03 20:25:37
事态失控!女星白鹿突然掉20万粉,评论区炸锅网友为李晨鸣不平

事态失控!女星白鹿突然掉20万粉,评论区炸锅网友为李晨鸣不平

胡一舸南游y
2026-05-13 13:54:27
1985年,国安叛徒藏身南美,中国6名兵王万里锄奸,FBI颜面尽失

1985年,国安叛徒藏身南美,中国6名兵王万里锄奸,FBI颜面尽失

文史达观
2026-05-13 11:29:24
医生呼吁:70岁以上老人,宁可吃热乎馒头喝稀粥,也别碰这些!

医生呼吁:70岁以上老人,宁可吃热乎馒头喝稀粥,也别碰这些!

芹姐说生活
2026-05-13 19:15:32
CNN报道:向朝鲜运送核反应堆的俄方货船可能是被西方国家击沉的

CNN报道:向朝鲜运送核反应堆的俄方货船可能是被西方国家击沉的

戗词夺理
2026-05-13 18:07:23
2026-05-14 01:39:00
我是一个养虾人
我是一个养虾人
有态度网友ytd
2565文章数 29关注度
往期回顾 全部

科技要闻

阿里年营收首破万亿,AI终于不再是画大饼

头条要闻

女子闪婚获千万房产99%份额闪离后起诉分割 法院判了

头条要闻

女子闪婚获千万房产99%份额闪离后起诉分割 法院判了

体育要闻

14年半,74万,何冰娇没选那条更安稳的路

娱乐要闻

白鹿掉20万粉,网友为李晨鸣不平

财经要闻

美国总统特朗普抵达北京

汽车要闻

C级纯电轿跑 吉利银河"TT"申报图来了

态度原创

本地
艺术
家居
健康
公开课

本地新闻

用苏绣的方式,打开江西婺源

艺术要闻

规划中的成都第三高楼,从396米降到250米以下?

家居要闻

内在自叙,无域有方

干细胞能让人“返老还童”吗

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版