结论先说:不要试图用一个“通用验收页”覆盖所有调用场景,而要按组件被调用的页面类型分别构造样例,每个样例只锁定一组输入数据和一组预期输出。当同一个组件在列表页、详情页、表单页出现不同表现时,验收样例必须把“页面上下文”当作变量写进去,否则验收结论无法复现。反例是:如果差异只出现在某个特定浏览器或某个登录状态下,而你的样例没有记录这些条件,那么按页面类型分的样例同样会失效,此时应改为按环境维度分层。
同一组件表现不同,常见原因有三类,对应不同的验收构造方式:
判断方法很简单:把组件单独放到一个空白测试页,喂入与出问题页面完全相同的数据和容器宽度。如果表现恢复正常,差异来自上下文;如果仍然异常,差异来自组件本身。这一步的结果直接决定下一步是修改组件还是修改调用方。
多个角色对同一事实理解不同,通常是因为各自看到的页面不同。把分歧转成样例,关键是把“我觉得这里不对”变成“在什么条件下,什么输入,应该得到什么输出”。一条可核对的样例至少包含:
假设某组件在列表页显示为一行,在详情页显示为两行。不要写“详情页应显示两行”,而应写成:当标题字符数超过 20 且容器宽度小于 360 像素时,预期换行为两行;当宽度大于等于 360 像素时,预期保持一行。这样两个角色即使对“应该几行”有分歧,也能先核对宽度条件是否一致,再决定是改组件还是改页面布局。
样例不是越多越好。对同一组件,先按页面类型分组,每组只保留能区分行为的边界值:最短输入、最长输入、空输入、刚好触发换行的输入。如果某个页面类型下这些边界表现与另一页面类型完全一致,就可以合并,不必重复建样例。
这里有一个容易忽略的动作:为每条样例标注它保护的是哪个决定。例如“详情页窄容器下按钮不换行”保护的是“详情页保持单列布局”这个决定。当后续有人提出改布局时,能立刻知道哪些样例会受影响,而不是重新全量验收。这个动作的结果是:验收范围从“所有页面”缩小到“受该决定影响的样例”,返工判断更快。
如果按页面类型分好的样例在本地全部通过,但线上仍有人反馈不同,先不要改组件。此时差异可能来自浏览器版本、缩放比例、字体加载状态或缓存。这些条件同样要写进样例的前置状态,否则样例只是把问题暂时藏起来。
需要承认的边界是:如果差异只在某个用户账号下出现,而你没有该账号的权限状态信息,那么任何样例都无法确认根因。这时正确的下一步是向反馈方索取可复现的最小条件,而不是凭猜测增加样例。样例的价值在于可核对,不在于数量。
下一步动作:挑出当前分歧最大的一个页面类型,按上面的六项写三条样例,交给提出分歧的角色确认。确认后的样例才进入验收清单,未确认的分歧继续留在讨论区,不混入验收范围。