先给结论:不要为组件单独写一份验收样例,而要以“页面上下文 + 组件实例”为最小验收单元。也就是说,同一个组件在A页正常、在B页异常时,验收样例必须同时记录页面类型、容器宽度、数据形态和加载顺序,否则你验的是组件本身,而问题往往出在页面给它提供的运行条件上。
同一个组件在不同页面表现不同,通常只有两类合理解释。
第一类是组件自身存在状态相关缺陷。比如组件内部依赖某个初始化时机,在首屏直出的页面能正常挂载,在异步插入的页面就错过时机。这类问题的特征是:只要改变加载顺序或渲染时机,异常就复现或消失,与页面内容本身关系不大。
第二类是页面上下文冲突。常见来源包括:父容器的display、overflow、transform改变了定位参照;页面全局样式覆盖了组件内部类名;同一页面加载了另一个版本的同一依赖;或者容器宽度触发了组件内部的响应式分支。这类问题的特征是:把组件原样搬到另一个结构相同的容器里,表现会跟着容器走,而不是跟着组件走。
两类解释的修复方向完全不同:前者改组件,后者改页面约定或隔离策略。所以验收样例的第一要务不是“证明它能用”,而是“让两类原因可区分”。
要区分上述两类原因,需要构造能单独改变一个变量的对照样例。以下是可执行的最小动作:
这四步的结果组合能给出方向:如果第2步异常消失,说明是上下文冲突;如果第4步异常仍在,说明更可能是组件自身缺陷或依赖版本问题。注意,某一步“看起来正常”不能单独证明组件没问题,因为移除其他脚本可能同时移除了触发条件,需要结合多步结果交叉判断。
一个可复用的验收样例,至少应包含以下信息,缺一项就可能在回归时失效:
这些字段的作用是让“通过”有明确前提。缺少前提的通过记录,在下次页面结构变动后无法复现,也就无法判断是回归还是新问题。
如果你拿不到完整数据、后台权限或真实环境,不必等到条件齐全再验。可以做的最小动作是:在本地或测试环境,用静态假数据分别构造“正常页面容器”和“异常页面容器”两个最小页面,只挂载该组件,逐一改变容器宽度、加载顺序和全局样式,记录哪一变量改变时表现发生翻转。
这个动作的产出是一份变量与表现的对照记录,而不是一份完整的验收清单。它能帮你定位方向,但不能推出“线上一定如此”,因为真实页面还可能有你没复现的依赖、缓存或服务端渲染差异。所以下一步应当是把定位到的变量带回真实页面验证,而不是直接据此修改组件或页面。
假设同一按钮组件在详情页正常,在弹层内点击无响应。按上面的方法:先把弹层容器改成与详情页相同的定位方式,若按钮恢复响应,说明问题来自弹层的层叠或事件拦截;若仍无响应,再把按钮单独放进一个空页面,若此时正常,说明问题来自弹层内的其他脚本或样式。这个例子的数字和结果都是假设,仅用于说明比较方法:每次只改一个变量,看表现是否随之翻转,再决定下一步是查容器还是查组件。
验收样例的价值不在于覆盖多少条,而在于每条都能回答“这个结论在什么前提下成立”。把前提写清楚,同一组件在不同页面的差异才会从偶发现象变成可追踪的验收项。