先把“表现不同”拆成可核对的事实:同一组件在A页正常、在B页异常,通常不是组件本身随机失效,而是页面上下文改变了它的输入、布局约束或加载顺序。验收样例应围绕这些差异变量构造,而不是重复点击同一页面。可行做法是保留组件的基础行为样例、改写上下文相关的边界样例,并退出那些无法稳定复现的争议项,转成待查清单。
多角色对同一事实理解不同,往往因为各自看到的页面不同。设计师在宽屏首页看到按钮对齐正常,运营在列表页看到同一按钮换行,开发在详情页看到它被遮挡。三方都没有说谎,但讨论对象不是同一个实例。
此时先做一次差异归因,把可能原因分成三类:输入差异(传入的文案长度、图片比例、数据条数不同)、容器差异(父级宽度、栅格列数、溢出规则不同)、时序差异(异步数据、懒加载、字体替换导致组件在挂载后被重新计算)。三类原因对应不同的验收样例,不能混在一张检查表里。
一个可操作的动作:让每位角色写出一句“我在哪个页面、什么条件下、看到什么”,把这句话转成一条样例的前置条件。结果是分歧从“它坏了/没坏”变成“在哪组条件下它必须满足什么”,下一步才能决定这条样例是保留、改写还是退出。
保留的前提是:同一组前置条件重复执行,结果稳定,且能用是/否判定。例如“列表页标题超过两行时,卡片高度不塌陷”就是可判定的;而“看起来舒服”不是。
保留样例时,每条至少写清四件事:
如果某条样例只有一个人能复现,先不要保留为验收项,而是记为待查线索。把它保留下来会稀释验收结论,让真正稳定的问题被淹没。
多数争议样例并非无效,而是描述层级太粗。改写的方法是补上缺失的变量,而不是换更严格的措辞。
假设某组件在首页显示为三列、在专题页显示为两列,团队争论“到底应该几列”。这其实是两个不同问题:组件是否应随容器自适应,以及各页面是否应传入相同的列数配置。改写后可以拆成两条样例:一条验证在窄容器下组件不溢出,一条验证页面传入不同列数时组件按配置渲染。两条都能独立判定,不再互相牵扯。
改写时注意一个取舍:不要为了可判定而把样例写死到某个像素值。像素级断言在字体、缩放、设备差异下极易误报。更稳的做法是断言关系,例如“标题区高度不小于其内部文字行高之和”“组件宽度不超过父容器宽度”。关系型断言能覆盖更多真实条件,也更容易被不同角色理解。
有些差异确实存在,但当前无法构造稳定复现的条件,例如只在特定网络时序下出现的闪烁、只在某次数据返回顺序下出现的错位。这类问题如果强行写进验收样例,会导致每次执行结果不一致,验收结论失去意义。
退出的处理方式是:把它从验收清单移到待查清单,并记录已观察到的现象、出现页面和大致触发路径。待查项不参与本次通过与否的判定,但需要在下一轮开始前重新评估是否能补足复现条件。这样做的结果是验收范围收窄但结论可信,待查项也不会因为“没写进清单”而被遗忘。
需要说明的是,某个现象在多次尝试后未再出现,并不能单独证明它已被修复。缓存、数据分布、加载顺序变化都可能有合理解释。把这类观察直接当作通过,会让后续同类问题更难定位。
把上面的取舍落成一条样例,可以写成固定结构,便于不同角色填写和核对:
例如假设某表单组件在注册页和活动页表现不同:注册页提交按钮被禁用,活动页却可点击。先核对两页传入的校验状态是否一致,再写一条样例,前置为“活动页、未勾选协议、视口宽度在移动区间”,动作为“点击提交”,观察为“按钮是否触发提交请求”,判定为“未勾选时不应发出请求”。执行后若两页结果仍不同,说明差异在页面传参而非组件内部,下一步应检查两页的状态传递逻辑,而不是继续调整组件样式。
按这个顺序推进,验收样例就不再是各角色各说各话的清单,而是一组能定位差异来源、能判定、能决定下一步动作的项目。