先判断差异来自组件自身还是页面环境:把同一组件分别放进“最小宿主页”和“真实业务页”各跑一遍,若最小宿主页正常而真实页异常,验收样例就应以页面环境变量为分组维度,而不是继续堆组件功能用例。这样做的直接结果是,后续每发现一处差异,都能落到一个可复现的宿主条件上,而不是停留在“这边好那边坏”的口头描述。
多角色对同一事实理解不同,通常不是谁看错了,而是各自打开的是不同页面。构造验收样例的第一步,是让分歧双方对着同一个可复现现场说话:同一组件、同一数据、同一操作路径,只改变所在页面。记录三样东西即可——页面路径、组件在页面中的位置、触发差异的操作序列。缺少其中任何一项,后面的解释都无法被证伪。
假设一个筛选组件在列表页点击后正常刷新,在详情页内嵌区域点击后没有任何变化。这个描述已经足够作为起点,但还不足以验收,因为“没有变化”可能指视觉无反馈,也可能指数据未更新。验收样例要把它拆成可观察的断言,例如“点击后筛选条件文本更新”和“点击后结果条数变化”两条独立检查项。
同一组件表现不同,最常见的两类解释是:组件被页面样式或布局约束影响,以及组件在页面中挂载时机或数据来源不同。两者都会表现为“组件本身没坏,但在这个页面不工作”,所以不能靠感觉区分。
如果差异只在某个页面出现,且该页面存在容器宽度、溢出隐藏、层级覆盖或全局样式重写,那么组件的行为可能被外部条件压制。区分证据是:把组件移到一个无额外样式的空白宿主页,若行为恢复正常,再把原页面的样式逐项加回,观察哪一项加回后差异重现。重现的那一项就是验收样例中必须锁定的环境变量。
如果组件依赖页面在特定时机提供数据或触发初始化,而不同页面的加载顺序不一致,也会出现同组件不同表现。区分证据是:在两个页面分别记录组件初始化完成与数据就绪的先后顺序。若异常页面总是“先初始化、后拿到数据”,而正常页面相反,那么验收样例应把“数据就绪后再初始化”写成前置条件,而不是把它当作组件缺陷。
这两种解释并不互斥。当样式压制和初始化顺序同时存在时,单独修复一个可能只让现象变隐蔽。因此验收样例要允许组合条件,例如“窄容器 + 延迟数据”这一组,而不是只测单变量。
当产品、设计和开发对同一现象各执一词时,有效的做法不是继续争论,而是把每个人口中的“正常”写成一条可核对的项目。每条项目包含:宿主页面、前置状态、操作、预期可观察结果。四者齐全,分歧就变成对同一条目的通过或不通过。
一个实操动作是:先只保留“最小宿主页”一条样例并跑通,再把真实页面条件逐条加回。每加回一条就重跑一次,并记录该条件是否让断言由通过转为不通过。这个动作的结果会直接决定下一步——如果差异在加回某条环境条件时出现,后续验收就围绕该条件补充边界样例;如果所有条件加回后仍无法复现,说明当前样例缺少触发操作或数据状态,需要回到差异现场重新采集。
同一组件在不同页面表现不同时,样例数量多并不等于覆盖充分。更有效的取舍是:每个被怀疑的环境变量至少有一条“存在”和一条“不存在”的对照样例。例如容器宽度取一个会触发溢出的窄值和一个安全宽值,数据就绪取提前和延后两种顺序。这样即使差异再次出现,也能快速判断是哪一类条件被满足。
需要说明适用条件:这套方法针对的是同一组件在多个页面间行为不一致的情况。如果差异来自组件版本本身不同,或两个页面引用了不同的构建产物,那么应先统一版本再谈环境变量,否则对照样例会得出误导性结论。同理,请求量或某项统计归零不能单独证明某条样例处理正确,它也可能来自缓存、网络或测试数据本身为空,仍需回到可观察断言核对。
最后,验收样例应写成可重复执行的文本,而不是一次性的聊天记录。当同一现象再次被不同角色提出时,直接指向对应样例,让分歧落在“这条过了没有”上,而不是重新描述一遍现象。