结论先说:当同一个组件在首页、列表页和详情页表现不一致时,验收样例不应只按组件本身构造,而应按“组件状态 × 宿主页面上下文”构造。也就是说,把组件放回它实际出现的页面结构、宽度约束和数据条件下分别验收。若组件在页面中的可用宽度、父级样式或数据长度基本一致,则可以退回到只验组件本身;一旦这三项中任意一项不同,单组件验收就会漏掉真实问题。
同一组件表现不同,常见原因可以分成两类。第一类是宿主页面给的约束不同:父容器宽度、内边距、栅格列数、字体继承、行高,都会改变组件的换行、截断和点击区域。第二类是组件自身对状态的处理不完整:加载中、空数据、超长文本、错误态只在某个页面被触发,于是问题只在那里出现。
区分这两类原因,可以做一个简单动作:把同一个页面里的组件复制到一个最小空白页,再给这个空白页逐步加回原页面的父级样式。如果加回某一条样式后问题复现,说明差异来自宿主上下文;如果复制到空白页仍然异常,说明问题在组件内部。这个动作的结果直接决定下一步:前者要补页面级验收样例,后者要补组件状态样例。
方式一:只构造组件级样例。适用条件是组件在各页面的可用宽度、父级样式和数据长度范围一致,且组件不依赖页面级数据。代价是构造快、维护成本低,但无法覆盖父容器挤压导致的换行、溢出和遮挡。
方式二:构造“组件 + 宿主页面”组合样例。适用条件是组件出现在多个布局差异明显的页面中,或组件文本长度变化大。代价是样例数量成倍增加,每次组件改动都要回归多个页面;如果组合过多,维护成本会超过它发现问题的价值。
取舍依据不是页面数量,而是差异维度。真正需要组合验收的,是那些改变了组件可用空间或数据形态的页面。差异维度相同的页面可以合并成一个代表样例,并注明它代表哪些页面,避免为每个页面单独建样例。
假设某组件用于展示卡片,在列表页每行三张,在详情页侧栏只占一列。列表页宽度充足,卡片标题一行显示;侧栏宽度较窄,标题折成三行,把底部按钮挤出可视区域。若只验组件本身,在宽容器里一切正常,问题不会暴露。
按组合方式构造时,样例应包含:列表页三列宽度下的卡片、详情页侧栏单列宽度下的卡片、两者都使用最长标题和空数据两种数据状态。执行后如果只有侧栏宽度下按钮被挤出,则说明需要调整组件的宽度自适应规则或侧栏容器的溢出处理;如果两种宽度下都出现按钮错位,则问题在组件内部布局,与宿主页面无关。这个结果决定修复位置,也决定后续回归要保留哪几个样例。
如果组件在各页面的表现差异只出现在刷新后首次渲染,而稳定后一致,那么按“组件 × 页面上下文”构造样例可能仍然抓不到问题。这类差异更可能来自数据加载顺序或渲染时机,而不是布局约束。此时应补充“首次渲染”和“数据就绪后”两个时点的样例,而不是继续增加页面组合。反过来说,若差异只在某个数据长度下出现,也应优先按数据状态分组,而不是按页面分组。
先记录每个页面给组件的可用宽度、父级关键样式和数据长度范围,把差异维度相同的页面合并。然后为每个差异维度各建一个代表样例,标注它覆盖的页面和状态。执行样例后,按问题出现的位置决定是改组件还是改宿主页面,并把触发问题的那个维度保留为固定回归样例。这样验收样例的数量由差异维度决定,而不是由页面数量决定,既能覆盖真实问题,也不会无限膨胀。