先给结论:不要为组件单独写一份“通用验收样例”,而要把“页面上下文”作为样例的显式变量。同一组件在A页正常、在B页异常,通常不是组件坏了,而是它继承的容器宽度、层叠规则或初始化时机不同。验收样例应至少固定三样东西:组件所处的容器约束、同页共存的其他组件、以及组件挂载时页面已加载的资源范围。缺了其中任何一项,复现结果都不可信。
构造验收样例前,先做一次二分判断,这决定你后面写几组样例。
如果同一组件在A页正常、B页异常,而两页引用的是同一份组件代码和同一版本资源,那么问题大概率出在上下文:容器宽度、字体继承、外边距折叠、同页其他脚本的全局副作用。此时验收样例的重点是“变量隔离”。
如果同一组件在A、B两页都异常,只是异常程度不同,那么更可能是组件自身缺陷,上下文只是放大了它。此时验收样例应覆盖组件的边界输入,而不是继续堆页面组合。
区分依据可以这样核对:把A页正常的那段DOM连同祖先容器一起复制到B页的同一位置,如果恢复正常,说明是上下文问题;如果仍异常,说明组件自身或资源加载顺序有问题。这个动作本身就能作为第一份验收样例的基线。
条件一:异常只在个别页面出现,且这些页面有共同特征(比如都在带侧栏的布局里、都晚于某个脚本加载)。这时选择“隔离变量”路线,样例数量少、定位快。
条件二:异常在多个页面零散出现,页面之间看不出明显共同特征。这时选择“覆盖组合”路线,把可能影响组件的上下文因素列成矩阵,逐格验证。
两种路线的取舍标准是:能否用一句话说清异常页面的共同点。能说清,走隔离;说不清,走组合矩阵。不要一上来就铺满矩阵,那会浪费大量验证时间,而且结果难以归因。
每份样例只改一个变量,其余全部与正常页面一致。可写成如下结构(示意,非真实项目):
每份样例记录“改了什么、结果是否复现异常”。如果样例1复现、样例2不复现,那么容器宽度就是关键变量,后续修复和回归都围绕它展开。
把影响因素压缩到两到三个维度,每个维度取两个值,形成可核对的组合。例如:
这样得到八格。逐格验证后,你会看到异常集中在哪几格。假设八格中只有“流式宽 + 有共存组件”两格异常,那么问题范围立刻收窄,下一步动作就是检查这两个组件之间的样式或脚本冲突,而不是继续扩大矩阵。
样例只有“看起来正常/异常”是不够的,因为不同人判断标准不同。每份样例至少记录三类证据:
这三类证据能把“表现不同”拆成可比较的项。若结构证据一致而行为证据不同,问题更可能在脚本;若结构证据本身就不同,先解决上下文,再谈组件。
假设某组件在首页正常、在详情页错位。两页使用同一组件代码。按隔离路线,先复制首页组件及其祖先容器到详情页同一位置:恢复正常,说明是上下文问题。再只改容器宽度为流式,异常复现,那么容器宽度就是关键变量。下一步动作是检查详情页容器的宽度来源(是父级布局给的,还是组件自身撑开的),并据此决定是修容器还是修组件。若复制后仍异常,则改走组件边界输入验证,检查组件对宽度变化的响应逻辑。
这套方法不适用于以下情况:组件依赖的第三方资源本身在两次加载中返回了不同版本;页面处于灰度或A/B分流中,两页实际运行的不是同一份代码。遇到这些情况,先确认“两页是否真的同源同版本”,否则任何样例都无法归因。
另外,若异常只在特定设备或特定网络条件下出现,验收样例还需要把设备与网络作为显式变量,而不是默认它们不影响结果。构造样例的目的是让每一步都能被核对,而不是追求样例数量多。能用一个变量解释的现象,就不要引入第二个。