先给结论:不要追求一个跨页面通用的验收样例,而要把组件拆成“结构、数据、上下文”三层,分别构造最小样例。如果三层中只有一层变化就能复现差异,就保留该层作为独立验收项;如果必须两层以上同时变化才复现,说明组件与页面耦合过深,应改写组件接口或退出当前复用方案,而不是继续加样例覆盖。
同一组件在列表页正常、在详情页错位,常见原因不在组件本身,而在它拿到的数据和所处容器不同。构造验收样例前,先做一次分层归因:
归因清楚后,取舍才有依据:只有结构层差异,通常保留组件并补充容器宽度样例;只有数据层差异,改写组件的默认值兜底逻辑;一旦发现必须同时改动结构和数据才能复现,说明这个复用边界不成立,应退出复用,改为两个独立组件。
验收样例的价值在于可重复,而不是数量多。按下面顺序做:
做完这三步,你会得到一张带前提的样例清单。它比“所有页面都测一遍”更省时间,也更容易在改版后判断哪些样例需要重跑。
假设某站点用同一个卡片组件展示文章摘要,列表页每页 10 条,详情页底部推荐 2 条。列表页正常,详情页卡片高度被撑开。
按单变量法测试:把详情页推荐条数改成 10 条,异常消失,说明差异来自数据条数而非页面结构。进一步检查发现,组件在条目少时会按内容自适应高度,条目多时被父容器约束。此时有两种取舍:
这个例子里,判断依据不是“哪个方案更规范”,而是两类页面对同一组件的约束是否一致。约束一致就保留并参数化,约束冲突就退出复用。
验收样例最容易出问题的地方,是把某个页面的特殊情况当成通用规则。以下边界需要在样例说明中写清:
如果一个样例的成立条件超过两条,它更适合作为回归测试的固定用例,而不是作为组件通用验收标准。把它标记为“条件用例”,可以避免后续改版时误以为组件在所有页面都已验证。
当你发现需要为同一个组件写五六个带不同前提的样例才能覆盖各页面时,这通常不是测试不够,而是组件职责过宽。此时更合理的动作是拆分:把稳定不变的部分抽成基础组件,把随页面变化的部分留给页面自己实现。拆分后,每个组件的验收样例会回到一两个明确前提,维护成本反而下降。
判断是否拆分的实际动作很简单:列出所有样例的成立条件,如果条件之间互相矛盾,例如一个要求固定高度、另一个要求自适应高度,就说明当前复用方案已经无法用参数覆盖,应退出并拆分。这一步做完,再回头更新验收清单,比继续堆样例更接近问题的根因。