先把组件从页面中拆出来,为它单独建立可复现的最小验收样例,再逐步加回页面条件,观察哪一步开始出现差异。这样做的原因是:同一组件在不同页面表现不同,通常不是组件本身时好时坏,而是页面给它提供的上下文不同。只在一个页面里反复刷新、反复调样式,往往找不到真正变量。
第一类解释是组件状态被污染。比如同一组件实例被多个页面复用,前一个页面留下的筛选条件、展开状态、异步数据或缓存结果,带进了后一个页面。表现上像是“同一个组件在不同页面不一样”,实际是运行顺序和共享状态在起作用。
第二类解释是页面上下文不同。组件代码没变,但父容器宽度、栅格列数、字体继承、层叠顺序、页面加载顺序、数据到达时机不同。表现上同样像组件不稳定,实际是组件对外部条件的假设没有被写进验收样例。
这两类解释对应不同的修复方向。前者要隔离状态,后者要固定上下文。若一开始不区分,很容易把上下文问题误判成组件缺陷,反复改组件内部逻辑,结果在原来的页面好了,换一个页面又坏。
可以做一个假设例子。假设一个筛选组件在列表页正常,在详情页侧栏中初始选项错位。先不改代码,只做三件事:
如果错位只跟着页面走、不跟着组件走,说明问题在页面上下文;如果错位跟着组件实例走,换到空白页仍出现,说明问题在组件状态或组件自身假设。
这里的关键动作是“复制条件后重跑”。它的结果会直接决定下一步:若复制详情页条件后测试页复现,就应把该条件写进验收样例;若复制后仍不复现,就要继续查数据到达顺序、共享状态或事件绑定次数。
验收样例不应只写“组件显示正常”,而应写成一组可替换条件。至少覆盖以下维度:
这些条件不是越多越好,而是要先找出“哪个条件一换,表现就变”。可先固定其余条件,只替换一个变量,观察结果。这样得到的证据比一次性堆很多条件更清楚。
建议按以下顺序推进,每一步都留下可比较的结果:
判定依据可以概括为:差异跟随页面条件移动,则修上下文或把上下文纳入组件契约;差异跟随组件实例移动,则修状态隔离或组件内部假设。两种结论会导向不同的验收样例写法,不能混在一起。
最终验收样例至少应包含一个反向检查:把组件从原页面移到另一个结构不同的页面,观察是否仍满足预期。若只在原页面通过,样例只证明了该页面成立,没有证明组件可复用。对已有经验的团队来说,这一步常被省略,却是同一组件跨页面表现不一致时最有效的分界线。
因此,构造验收样例的重点不是增加断言数量,而是把页面提供的隐含条件显式化。条件显式化之后,组件在哪个页面正常、在哪个页面异常,都能落到可比较的证据上,而不是停留在“有时好有时坏”的观察。