先别急着改组件。把“表现不同”拆成可核对的事实:同一组件在A页面正常、在B页面异常,先记录两页的上下文差异,再为每项差异写一个最小验收样例。验收样例的目标不是复现整页,而是隔离出“组件本身”和“页面环境”两类原因,让不同角色对同一份证据得出同一结论。
同一组件在不同页面表现不同,最常见的原因是大家说的“组件”范围不一致。前端说的可能是模板加样式,内容编辑说的可能是最终渲染结果,测试说的可能是某个交互状态。范围不固定,验收样例就无法对齐。
处理动作:拿一个具体页面,把组件涉及的文件、数据来源和依赖列成清单,标注哪些属于组件内部、哪些由页面传入。清单完成后,下一步才能判断差异是来自组件代码还是页面调用方式。
结果如何影响下一步:如果清单显示两页引用的是同一份组件代码,但传入的数据结构不同,验收重点就转向数据契约;如果代码引用不同,验收重点转向版本与构建产物。这个判断决定了后面样例的写法,避免把数据问题误判为样式问题。
模糊描述无法验收。“按钮在首页正常、在活动页错位”只是现象,不是验收项。需要把它转成可观测的输入、操作和预期输出。
假设一个例子:某卡片组件在列表页显示正常,在详情页底部出现横向滚动。可以构造三个验收样例:
这三个样例把“页面不同”拆成容器宽度、数据结构和溢出规则。执行后,如果只有第三个样例失败,说明问题在最小宽度约定,而不是组件整体失效。下一步应修改约定或容器约束,而不是重写组件。
页面环境差异通常来自几个可区分的原因:容器宽度、继承样式、加载顺序、数据字段、脚本初始化时机。把每个原因做成对照样例,可以避免一次改多个变量。
这些对照样例的价值在于:每个样例只回答一个“是或否”。多个角色拿到同一组样例,就能对“哪一层出问题”达成一致,而不是各自描述感受。
样例写完不等于可交接。需要给每个样例一个稳定名称,记录输入、操作、预期和实际结果,并注明运行前提。前提包括浏览器类型、窗口宽度、数据版本和组件版本。缺少前提,样例就无法复跑。
实际动作:把样例放进项目已有的测试或检查流程中,指定谁在什么阶段跑。跑完后,失败样例对应一个明确的处理决定:改组件、改页面调用、改数据,或修改约定。决定写回样例说明,下一次同类分歧可以直接引用,而不是重新争论。
如果暂时没有自动化条件,至少保留手动复跑步骤。手动步骤同样要写明前提和预期,否则不同人跑出的结果仍会被解释成“环境不同”。
如果差异只出现在一个无法稳定复现的页面,且该页面本身即将下线或重构,继续构造样例的收益有限。此时更合理的动作是记录现象和已知前提,标注为待观察,不把它升级为组件级验收项。
另一个边界是:当差异来自第三方嵌入内容或外部资源,组件自身无法控制时,验收样例应写成“在外部资源不可用时的降级表现”,而不是要求组件保证外部内容一致。这样验收项才是可执行的。
判断标准很简单:样例是否指向一个可以修改的对象。如果指向组件、页面调用、数据或约定中的某一个,就值得写;如果指向无法控制的外部变化,就改写为降级或容错样例。