先给结论:不要试图找到一个“正确页面”来代表组件,而要把出现差异的两个页面各自固定成一份可复现的验收样例,分别记录输入、渲染结果和触发条件,再判断差异来自数据、上下文还是加载顺序。验收样例的目标不是证明组件好坏,而是让下一次改动后能快速判断:变化发生在哪一层。
同一组件在不同页面表现不同,通常先分成两类原因。第一类是数据差异:两个页面传给组件的字段值、字段数量、空值情况不同,组件本身没变。第二类是上下文差异:数据相同,但页面容器宽度、父级样式、同页其他脚本、加载顺序不同,导致组件输出不同。
区分方法很直接:把 A 页面的数据原样搬到 B 页面,如果组件在 B 页面表现恢复正常,问题在上下文;如果仍然异常,问题在数据或组件内部逻辑。这一步做完,验收样例的构造方向就定了——数据问题做数据样例,上下文问题做环境样例。
如果每次刷新都能看到同样的差异,说明触发条件稳定,适合做对照样例。具体动作是:
这三项标注的意义在于:以后任何一次改动,只要这三项没变,组件输出就应该一致;如果输出变了,改动的影响范围就能被定位到具体某一项,而不是笼统地说“页面又坏了”。
如果差异时有时无,或者只在快速切换、滚动到某位置、异步内容插入后才出现,对照样例不够用,需要构造触发样例。做法是把“等待”变成可观察的动作:
这样做的结果是:偶发差异被还原成“顺序不同导致输出不同”,验收时就不再依赖运气,而是检查顺序是否落在预期范围内。
样例必须注明它成立的前提。例如:假设组件只接收三个字段,且父级容器宽度不小于 320 像素;如果实际页面会出现字段缺失或容器更窄,这个样例就不覆盖那种情况,需要另建一份。
例外也要写进去:哪些页面允许组件表现不同。比如列表页允许标题截断两行,详情页要求完整显示。这类差异是设计决定,不是缺陷,验收样例应当把它标为“预期差异”,而不是当成 bug 去修。假设示例:某组件在列表页显示摘要、在详情页显示全文,两份样例的输入字段相同但显示规则不同,验收时分别核对摘要字数和全文完整性,而不是要求两处输出一致。
样例写完后,至少保留一个可重复执行的动作:用同一份数据在两个测试页分别渲染,逐项核对输出。核对结果决定下一步——如果差异落在预期范围内,验收通过;如果差异超出预期,先回到“数据还是上下文”的判断,再决定改组件、改数据还是改页面容器。每次改动后重跑同一组样例,就能看出改动是否意外影响了另一处页面。