先给结论:不要挑一个“最正常”的页面当作验收基准,而要把组件拆成可观察的状态,再按页面差异构造两组样例——一组验证组件自身在各状态下是否稳定,另一组验证页面上下文是否给组件传入了正确的数据。只有两组都通过,才允许批量复制到其他页面。若只测一个页面就上线,规模化后出现例外几乎是必然的。
同一组件在不同页面表现不同,通常只有两类原因。第一类是组件内部状态没有被完整覆盖,比如列表为空、只有一条数据、数据量超过一屏。第二类是页面给了组件不同的输入或不同的外部条件,比如容器宽度、父级样式、异步数据的到达顺序、同页出现多个实例。
区分方法很直接:把同一个页面复制一份,只改数据不改结构,看表现是否跟着数据变;再把同一份数据放进结构不同的页面,看表现是否跟着结构变。前者变化说明问题在数据契约,后者变化说明问题在布局或样式作用域。这一步不做,后面的验收样例就会写偏。
条件一:组件是纯展示型,输入只有属性,没有异步请求。此时验收样例应以“状态枚举”为主。假设一个卡片组件,需要覆盖的状态至少有:正常数据、字段缺失、文本超长、图片加载失败、列表为空、列表只有一条。每个状态写一条最小样例,记录预期的高度、截断方式和占位表现。动作是逐条截图或记录渲染结果,结果决定组件是否需要补默认值或兜底样式。
条件二:组件依赖异步数据或全局状态,且同页可能出现多个实例。此时单纯枚举状态不够,验收样例必须加入“时序”和“数量”两个维度。例如先渲染空态、数据到达后切换为列表态、快速切换筛选条件导致请求返回顺序颠倒。动作是构造可控的延迟与返回顺序,观察组件是否出现旧数据覆盖新数据、多个实例互相干扰。结果决定是否需要加请求标识或实例隔离。
两种条件的选择依据是:输入是否可枚举、是否受外部时序影响。可枚举就用状态清单,不可枚举就必须用场景样例,不能混用同一套模板。
样例要能被人重复执行,至少包含四项:页面路径或页面类型、传入的数据或状态、操作步骤、预期结果。例如在假设的新闻列表页中,样例可以写成:页面类型为列表页,传入空数组,不执行任何操作,预期显示空态文案且不出现分页。下一条:传入二十条数据,滚动到底部触发加载,预期新数据追加且不重复。
关键动作是把每条样例的预期结果与“组件自身行为”和“页面上下文行为”分开记录。这样当某条样例失败时,能立刻判断是改组件还是改页面,而不是两个地方一起改,改完也不知道是谁修好的。
个别页面通过不代表可以批量套用。上线前至少确认三件事:同一组件在同一页面出现两次时是否互相影响;页面容器宽度小于组件最小可用宽度时的降级表现;数据字段缺失时是否静默失败还是显示错误占位。这三条都属于“样本成立但规模化后出现例外”的典型来源。
另外要注意,某条样例通过或失败都不能单独证明整体正确。一次渲染正常,可能是数据恰好完整;一次抓取或统计归零,也可能是采集范围变化而非组件修复。因此验收结论要写成“在哪些条件下通过、哪些条件下未覆盖”,而不是一句“已验收”。
建议顺序是:先固定组件的数据契约,再枚举状态样例,最后补时序与多实例样例。每完成一组,用失败样例反推需要修改的位置,而不是先改样式再补样例。若失败集中在数据契约,下一步应补默认值和类型校验;若失败集中在布局,下一步应检查容器约束和样式作用域;若失败只在异步场景出现,下一步应处理请求顺序与实例隔离。按这个顺序推进,验收样例才能真正决定后续改动方向,而不是变成上线前的一次性检查。