先给结论:不要急着改组件,也不要先归因于浏览器或框架。把“同一组件”拆成可核对的输入、宿主环境和状态三层,分别构造最小验收样例,看差异跟着哪一层移动。哪一层移动,问题就落在哪一层;样例不动,才轮到怀疑组件本身。
假设你有一个站内搜索框组件,在首页正常,在文章详情页却出现下拉建议错位。这里不涉及真实项目,只是用来说明构造验收样例的方法。先列出可能变量:容器宽度、祖先元素的定位方式、页面是否已有滚动容器、组件初始化时机、页面加载的脚本顺序。把它们写成一张对照表,每一项对应一个可切换的条件。
关键动作是:每次只改一个条件,并记录改前改后的可见结果。如果改容器宽度后错位消失,说明问题在布局约束;如果改脚本顺序后消失,说明问题在初始化时机。两种结果指向完全不同的下一步。
同一组件在不同页面表现不同,最常见的原因是宿主环境不同,而不是组件内部逻辑不同。验收样例要能区分三类宿主差异:
position、transform、overflow 等会改变定位参照或裁剪的属性。构造样例时,把首页的宿主条件逐条复制到详情页,或反向复制。哪一条复制过去后表现一致,哪一条就是候选原因。这一步不需要改组件代码,只需要调整页面结构或加载顺序。
做法是新建一个空白页面,只放该组件和必要依赖,不引入任何页面级样式和脚本。观察它是否正常。
这个动作的结果直接决定下一步:环境问题就改宿主或封装方式,组件问题才改组件。两者的修复位置和回归范围完全不同。
样例不是“看一眼对不对”,而是别人照着做能得到同样结论的步骤。每条样例至少包含:前提条件、操作、观察点、判定标准。例如:
记录这些字段的意义在于:当同一组件在第三个页面再次异常时,可以比对三次记录的差异,而不是重新猜。如果三次记录的容器宽度和定位属性都相同,却仍然表现不同,那么证据指向初始化时机或数据差异,而不是布局。
有时样例全部通过,但线上某个页面仍然异常。此时不要直接断定组件有隐藏缺陷。抓取量、请求量或某项统计归零,都不能单独证明处理正确,它们还有别的解释:页面被缓存、脚本被延迟执行、组件被条件渲染跳过、数据接口返回空。验收样例应补一条“环境探测”步骤,记录组件实际初始化时的关键值,例如容器宽度、父级定位、传入数据条数。把这些值写进验收记录,再和正常页面对比。
如果探测值一致而表现仍不同,才需要扩大样例范围,例如加入滚动、缩放或键盘操作。每一步都保留记录,结论才有依据。
构造验收样例的核心不是穷举所有页面,而是让差异沿着输入、宿主、状态三层逐步收敛。先固定一层,再动另一层,异常跟着哪层走,修复就落在哪层。这样得到的结论可以被别人重复验证,也不会把环境问题误判成组件缺陷。