先给结论:不要在每个页面重复点一遍组件,而是把“组件自身状态”和“页面提供的上下文”拆成两组变量,构造能互相区分的样例对。同一组件在不同页面表现不同,通常不是组件坏了,而是它继承的上下文不同,或者验收时漏掉了一个只在特定页面成立的触发条件。
把组件从两个页面里分别单独取出来,放在一个只有该组件和必要容器的空白页面上。如果两处表现一致,问题在页面上下文;如果仍不一致,问题在组件内部或它依赖的数据源。这一步能排除最常见的一种误判:把页面级样式覆盖、父容器尺寸或数据差异,当成组件本身的缺陷。
假设一个列表组件在首页正常、在详情页错位。单独取出后两者都正常,说明组件没问题,差异来自详情页的父容器宽度或页面级样式。接下来的验收样例就应该围绕“父容器宽度”和“页面级样式是否命中该组件”来设计,而不是继续修改组件代码。
表现不同通常落在两类原因上,它们需要不同的证据来区分。
能区分两者的关键动作是:固定其中一组变量,只改另一组。固定数据、只换页面,或固定页面、只换数据,观察差异是否跟随被改的那一组移动。差异跟着页面走,偏上下文;跟着数据走,偏数据形态。
样例要成对出现,每一对只允许一个变量不同,否则无法判断是哪一项导致差异。可以按下面的顺序组织。
每个样例都要记录三件事:触发条件、观察到的表现、以及这个表现是否可重复。可重复的差异才有验收价值,偶发差异需要先排除加载顺序或异步数据到达时间的影响。
遇到差异时,按这个顺序推进,每一步的结果决定下一步做什么:
这样构造出来的样例,既能复现当前问题,也能在后续改动中作为回归依据。验收样例的价值不在于覆盖多少页面,而在于每一对样例都能回答“是哪个变量造成了差异”这个问题。
很多差异只在页面加载顺序或组件挂载时机不同的时候出现:样式表先于组件生效,和组件先渲染、样式后到达,结果可能不同。如果空白页面测试正常、原页面偶发异常,就要把加载顺序作为一个独立变量加入样例,而不是继续调整样式值。把这一项补进样例后,往往能解释此前反复出现却无法稳定复现的差异。