快照测试
捕获组件渲染输出或序列化结构,任何非预期变更即失败。
为什么
对于多 prop 多状态的复杂 UI 组件,为每个渲染节点写显式断言不现实——有数百元素,期望 HTML 每次设计更新都变。快照测试一次捕获完整渲染输出,存为提交产物,每次后续运行把新输出与存快照比较。任何 diff 即测试失败,迫使开发者要么接受变更(更新快照)要么修回归。它是防范非预期 UI 变更最有效的方式,但它是钝器——抓住一切,包括无关变更。
何时使用
用于结构稳定的展示组件(卡片、表格行、表单布局)。避免用于有动态内容的组件(时间戳、随机 ID、异步数据)除非你 mock 它们。不要替代行为测试。
如何做
1. 选快照机制 - Vitest/Jest: toMatchInlineSnapshot() 或 toMatchSnapshot() - React: react-test-renderer 或 @testing-library/react renderToStaticMarkup - Storybook: Storyshots 插件为每个 story 做视觉快照 2. 写第一个快照——用代表性 prop 渲染组件 - 用真实但确定的数据(无 Date.now()、无 Math.random()) - mock 任何异步数据获取使快照跨运行稳定 - 第一次运行创建快照文件;提交到仓库 3. 后续运行测试把新输出与存快照比较 - 匹配 → 测试通过(无非预期变更) - diff → 测试失败带可读 diff;开发者审查 4. 变更是有意的时更新快照 - vitest -u(或 jest -u)重新生成快照 - PR 中仔细审查 diff——盲目更新接受回归 - 把更新快照连同代码变更一起提交 5. 周期性审查和清理快照 - 快照随组件演进变陈旧;2000 行快照是坏味道 - 若快照大多是动态噪声,换成针对性断言