先判断差异是否来自组件本身,再决定验收样例的构造方式。若同一组件在两个页面出现不同表现,而两页的容器宽度、外层样式或数据状态不同,应把验收样例按“页面上下文”分别构造;若两页的上下文一致而表现仍不同,则应把样例收敛到组件内部,用同一上下文重复调用。前者验收的是集成结果,后者验收的是组件实现。选错方向,验收会一直卡在“到底谁的问题”上。
构造验收样例前,先做一次可区分原因的检查。把两页的组件调用处、父级容器、传入数据和加载顺序各抄一份,逐项对比。如果差异项出现在容器宽度、栅格列数、字体继承或相邻元素上,属于上下文差异;如果差异项出现在组件自身的状态分支、条件渲染或异步数据上,属于实现差异。这两类问题的验收样例完全不同,混在一起写只会得到互相矛盾的结论。
注意,某个页面“看起来正常”不能单独证明组件没问题,它可能只是恰好没有触发问题分支。反过来,某个页面“看起来异常”也不能单独证明组件有缺陷,它可能只是容器更窄。现象本身不是结论,需要靠对比条件来定位。
当两页的容器、栅格或数据来源确实不同,验收样例应当以“页面 + 组件”为单位,而不是以组件为单位。做法是给每个受影响页面各写一组样例,每组包含该页真实的容器宽度区间、传入数据形态和相邻模块占位。这样验收的是集成后的实际结果,能直接回答“这个页面能不能上线”。
具体动作可以这样落地:先列出组件出现过的所有页面,标注每页的容器类型和数据来源;再为每类组合写一条样例,明确输入、预期表现和判定方式;最后只对未覆盖的组合补样例。这个动作的结果会直接决定下一步——如果样例覆盖后差异仍然存在,说明问题不在上下文,应转向条件二的检查;如果差异消失,说明只需为受影响页面补样式约束,不必改组件本身。
代价是样例数量会随页面数增长,维护成本上升。适用条件是页面数量有限、且各页上下文差异稳定。若页面数量多且上下文频繁变动,按页构造会迅速失控,此时更适合先统一上下文,再回到组件级验收。
当两页的容器、栅格和数据形态已经对齐,表现仍不同,验收样例应当收敛到组件内部,用同一份上下文重复调用,只改变组件自身的输入。此时样例的变量是组件的属性、状态和分支,而不是页面环境。这样做的目的是把差异锁定在组件实现内,避免把外层问题误判成组件问题。
一个假设例子:某卡片组件在列表页显示正常,在详情页侧栏被裁切。若两处容器宽度对齐后裁切仍出现,则样例应写成“同一容器宽度下,传入长标题与短标题各一次”,观察是否由标题长度触发换行或溢出。这个例子的数字只用于说明比较方法,不代表任何真实项目结果。
实施动作是:为组件建立最小可复现样例,固定上下文,逐个改变属性、状态和数据类型,记录每次变化后的表现。结果会影响下一步——若某个属性组合稳定复现差异,就把该组合写入验收样例并作为回归项;若所有组合都无法复现,说明差异来自上下文或加载时序,应回到条件一重新检查。
无论走哪条路,一份可执行的验收样例至少应包含以下内容,否则验收会退化成主观判断。
把这几项写清楚后,同一组件在不同页面的差异就不再是“看起来不一样”,而是可以逐条对照的验收项。需要强调的是,样例通过只说明该条件下表现符合预期,不等于所有页面都已覆盖;未写入样例的组合仍属于未验收范围。
有两种情况不适合按上述路径处理。一是差异只出现在特定数据极端值下,例如超长文本或空数据,此时应单独建立边界样例,而不是扩大常规样例范围。二是差异来自加载时序,例如组件在数据返回前后渲染不同,此时上下文和组件输入都可能一致,验收样例需要增加时序条件,明确在哪个阶段观察。把这两类例外单独列出,可以避免它们污染常规验收结论,也能让后续排查有明确入口。