结论先说:如果同一组件在A页面正常、在B页面异常,验收样例不能只测组件本身,而要把它放回“页面上下文”里成对构造。最容易被遗漏的条件是页面级样式或脚本对组件的间接影响——比如B页面多加载了一段全局脚本、祖先元素带了不同的类名、或者容器宽度落进了另一个断点。验收样例必须让同一组件在两个页面上被同一套断言检查,差异才可归因。
同一组件表现不同,通常有三种可区分的原因。第一种是组件内部状态受外部输入影响,例如传入的属性值不同;第二种是页面环境改变了组件的渲染条件,例如字体、行高、盒模型或层叠顺序被页面样式改写;第三种是加载时序不同,例如组件依赖的脚本在B页面晚于初始化执行。
区分方法很直接:把A页面的组件DOM结构和计算样式复制到B页面的容器里,如果表现恢复正常,问题在页面环境;如果仍然异常,问题在组件自身或数据输入。这个动作的结果决定了下一步是改页面样式,还是改组件实现。前者属于页面级修复,后者才需要动组件代码。
只写一条“组件显示正常”的验收项没有意义,因为它无法暴露页面间差异。有效的做法是为同一组件准备一组成对样例:同一份组件输入,分别放在两个真实页面路径下,断言同一组可观察结果。
假设一个短例子:某列表组件在首页显示为三列,在详情页显示为一列。若两页传入的数据条数相同、容器宽度也相同,那么差异很可能来自详情页祖先元素上的某个布局类。此时验收样例应记录“同宽度下两页列数是否一致”,而不是笼统写“列表显示正常”。
上面“成对构造”的结论有一个明确的反例:如果两个页面的容器宽度本来就不同,那么表现差异可能是正常的响应式行为,而不是缺陷。这时把两页强行改成同宽再测,反而会掩盖真实问题。
判断依据是:先确认组件是否被设计为随容器变化。如果设计上就该随宽度变化,那么验收样例要按断点分别构造,而不是要求两页完全一致;如果设计上不应随宽度变化,才需要把宽度作为受控变量固定下来。搞错这一点,后续修复方向会完全相反。
建议按这个顺序执行,每一步的结果都决定下一步:
这样做的价值在于:验收样例从“描述期望”变成“描述可复现的条件组合”。当同一组件再次出现在新页面时,你只需要核对前提是否满足,就能判断是否需要重新验证,而不是每次都靠肉眼比对。
最后提醒一点:请求量或报错数归零,并不能单独证明组件已正确处理,因为差异也可能被其他页面改动掩盖。验收样例要能说明前提、输入和断言三者的对应关系,才算构造完整。