知识卡片

过度抽象的测试只验证控制流

普通读书笔记卡 · 1458

内容

为了让测试摆脱对外部系统(如真实的工单系统)的依赖,通常会用mock、stub或fake这样的替身对象替代真实调用,但如果测试写成断言”方法被调用了几次、传了什么参数”,验证的其实是代码内部的调用顺序而非系统对外表现的行为。这类过度抽象的测试倾向于测试控制流实现而非系统行为,几乎没什么价值,还会导致方法更改就得完全重写测试。判断替身对象用对没用对的标准:断言的应是”结果对不对”,而非”过程走没走”。

参考来源

- 位置:《Google系统架构解密:构建安全可靠的系统》第13章《代码测试》13.1.3节(源文件:`../OREILY动物书合辑 图灵新版/_epub-src/text/part0014_split_105.html`) - 结论依据:原文明确指出"在此情况下很容易犯过度抽象的错误。这是因为测试会断言有关函数调用顺序或参数的机械事实。通常,过度抽象的测试倾向于测试语言的控制流实现,而不关注系统行为,因此几乎没什么价值",并说明这会导致方法更改时需完全重写测试。 - 原始内容:在此情况下很容易犯过度抽象的错误。这是因为测试会断言有关函数调用顺序或参数的机械事实。通常,过度抽象的测试倾向于测试语言的控制流实现,而不关注系统行为,因此几乎没什么价值。