先给结论:不要为组件单独写一份“组件验收”,而要把组件放回它出现过的页面类型中,按“输入条件—组件输出—页面级结果”三层构造样例。只有当同一组件在至少两个页面类型下分别通过,且失败样例能定位到某一层时,这组验收样例才算可用。单页通过只能说明该页面的上下文成立,不能直接推广到全站。
常见情形是:某个列表组件、面包屑或筛选块,在栏目页显示正常,放到详情页侧栏就错位、缺项或触发重复请求。此时容易得出两个相反结论:一是组件有缺陷,二是页面环境有问题。两者都可能成立,但处理方式完全不同。
假设一个筛选组件在栏目页能正确回填已选条件,在搜索结果页却丢失选中状态。这个现象本身不足以判断责任方,需要先固定变量:数据来源是否相同、容器宽度是否相同、初始化时机是否相同。
解释一:组件依赖页面上下文。组件读取了父容器的宽度、滚动位置或全局状态,离开原页面后这些前提消失,于是表现异常。这类问题在组件内部往往看不出来,必须结合页面结构才能复现。
解释二:页面传入的数据或参数不一致。组件逻辑没问题,但不同页面传入的字段名、默认值、空值处理不同。例如一个页面传空数组,另一个页面传 null,组件对两者的分支处理不一致。
两种解释的修复位置不同:前者要改组件的上下文假设或加边界约束,后者要统一调用方的数据契约。若只按其中一种去改,很容易在另一个页面再次复发。
要区分它们,不靠反复刷新页面,而靠可对比的证据:
这里要提醒一点:某个页面请求量下降或某次抓取异常,不能单独证明组件处理正确。它可能来自缓存、路由变化或抓取时机,需要与上面的对比证据一起看。
建议每个组件至少准备三组样例,每组都注明假设条件:
一个实际动作是:先只改输入层样例,把两个页面的数据统一后重跑。如果异常消失,下一步就转向统一调用方的数据契约,而不是继续改组件内部;如果异常仍在,下一步才去检查容器和初始化顺序。这个动作的价值在于把修复方向提前锁定,避免在错误层反复改动。
即使某组件在两个页面通过,也不能直接推断它在全部页面成立。适用条件至少要写清:数据来源是否同源、容器约束是否一致、组件是否读取全局状态、页面是否在首屏渲染。条件不同的页面应单独列入样例,而不是复用已有结论。
验收样例的目标不是覆盖所有页面,而是让每个失败都能落到输入、上下文或页面级中的某一层。做不到这一点时,增加样例数量只会放大维护成本,不会提高判断质量。