结论先给:当同一组件在首页正常、在栏目页或详情页异常时,不要把它当成一个“偶发bug”去改,而应先把差异拆成“数据条件、容器条件、加载顺序”三类变量,再为每类变量各构造一个最小验收样例。只要有一个样例无法复现差异,前面所有结论都要推翻重来。下面说明怎么拆、怎么验,以及一个会让整套方法失效的反例。
同一组件在不同页面表现不同,最常见的原因不是组件代码变了,而是它被放进了一个不同的上下文。构造验收样例前,先做一个判断:把出现问题的页面里的组件,原样搬到正常页面的同一位置,看它是否恢复正常。
这一步的动作很具体:复制正常页面的组件调用代码,只替换数据来源,其余保持不变。如果结果跟着数据变化,说明是数据条件;如果结果跟着页面变化,说明是容器条件。这个动作的结果直接决定下一步该建哪一类样例,而不是继续在出问题的页面上反复刷新。
多人对“组件表现是否正常”有分歧时,争论通常停留在描述层面。把描述换成样例,分歧就能核对。建议每类变量至少建一个样例,样例要能单独运行、单独判定。
每个样例都要注明假设。例如:假设栏目页与首页使用同一版本的组件代码,仅数据条数不同。这个假设一旦不成立,样例结论就不能跨页面套用。样例的价值不在于数量多,而在于每个样例只改变一个变量,这样结果才能归因。
如果两个页面的组件根本不是同一版本,那么无论怎么构造数据、容器、时序样例,结论都不可靠。反例是这样一种情况:首页引用的是本地构建后的组件文件,栏目页引用的是另一个路径下的旧副本,两者类名相同但实现已经分叉。此时你在首页调好的样式,在栏目页不会生效,因为改的不是同一份代码。
识别这个反例的动作:分别查看两个页面实际加载的组件资源路径与文件标识,而不是只看页面源码里的调用名称。若路径或标识不同,先统一引用来源,再重新跑上面的样例。跳过这一步,后面所有验收记录都会变成无效证据。
假设某列表组件在首页显示三列,在栏目页显示一列。构造样例后记录如下:数据条件样例中,列表项从3条增加到12条,栏目页仍为一列,首页仍为三列,说明差异与数据量无关;容器条件样例中,把栏目页容器宽度设为与首页相同,组件恢复三列,说明差异由容器宽度触发;加载顺序样例中,两种顺序结果一致,排除时序原因。据此,下一步动作是核对栏目页容器的宽度来源,而不是修改组件本身。
这份记录的关键在于:每个样例都写明了改了什么、没改什么、结果指向哪一类原因。它让不同角色可以拿着同一份记录复核,而不是各自凭印象争论。当某个样例的结果与预期不符时,先检查该样例是否只改变了一个变量,再决定是否推翻前面的判断。
完成三类样例后,下一步是把仍然无法归因的差异单独列出来,标注它涉及的变量,并补一个只改该变量的样例。如果补不出这样的样例,说明差异可能来自多个变量同时变化,需要先固定其中一部分再测。
这套方法适用的条件是:两个页面引用同一份组件代码,且你能控制测试环境的输入与容器。若代码来源本身不一致,或无法单独控制某个变量,应先解决引用统一和可测性问题,再谈验收样例。否则样例只是把混乱记录得更详细,并不能帮助定位原因。