先判断差异来自“组件本身”还是“页面环境”,再决定验收样例的构造方式。如果同一组件在A页面正常、在B页面错位,组件代码通常不是首要嫌疑,页面容器、继承样式和加载顺序才是。此时应把组件放回不同页面环境中对比,而不是反复修改组件本身。若组件在多个页面都表现一致,只是某一页异常,优先检查该页的容器宽度、父级样式和脚本引入;若多个页面表现各不相同且无规律,则要检查组件是否依赖外部状态,例如异步数据、字体加载或第三方脚本。两种情况下的验收样例构造方式不同,下面分别说明。
构造验收样例前,先做一次最小复现:把出问题的组件单独放到一个空白页面,只保留组件自身结构和必要样式。如果空白页面正常,说明组件本身没有硬伤,问题出在页面环境;如果空白页面也异常,说明组件内部存在对上下文的隐式依赖。这一步的实际动作是建立一个隔离页面,结果会直接决定后续样例的规模——隔离后正常,样例要覆盖不同页面容器;隔离后异常,样例要覆盖组件内部的不同状态。
可复现的差异才有验收价值。若刷新几次就恢复、或只在某个网络条件下出现,先记录触发条件,不要急着写验收项。无法稳定复现的问题,验收样例只能写成“观察项”,不能写成“通过/不通过”的判定项。
当隔离页面正常、放回业务页面异常时,差异基本来自容器。常见来源包括:父级设置了overflow、容器宽度用了百分比而组件内部用了固定宽度、页面存在全局样式覆盖了组件类名、同一组件被放在不同栅格列数中。
这类情况的验收样例应围绕容器构造,而不是围绕组件功能构造。具体做法:
判定依据是:组件在最小可用宽度下不溢出、在最大容器中不被拉伸变形。若窄容器下必须改变组件内部布局才能通过,说明组件缺少响应式约束,这时应回到组件层修改,而不是在页面层用补丁样式掩盖。
如果组件在多个页面都时好时坏,且与容器宽度无关,问题往往出在加载顺序或外部状态。典型表现:组件首次渲染时高度为0,数据返回后突然撑开;字体加载完成后文字换行位置改变;同一组件依赖的脚本在部分页面被延迟加载。
这类差异不能靠静态截图验收,要构造带时序的样例。实际动作是:
判定依据是:组件在数据到达前后不产生影响阅读的布局偏移,在脚本加载顺序不同的页面中最终呈现一致。若数据返回后必然撑开高度,应给容器预留最小高度或占位,这一步的结果会决定验收项写成“允许跳动但需占位”还是“不允许跳动”。
同一组件在不同页面的差异,很多时候不是单一原因,而是容器和时序叠加。构造样例时若不写清前提,验收结果无法复现。每个样例至少注明:页面容器宽度、组件所处栅格位置、数据是否已就绪、依赖脚本的加载方式。
一个假设例子:某卡片组件在列表页正常,在详情页侧栏变窄。若只写“卡片显示正常”,验收时无法判断侧栏宽度变化后是否仍通过。应写成“在侧栏宽度不低于X像素、数据已就绪的条件下,卡片标题不换行超过两行,图片不变形”。这里X是假设值,用于说明比较方法,实际取值按业务容器确定。
例外情况也要写进样例:如果组件在极窄容器下允许隐藏次要信息,应在验收项中明确“允许隐藏”,否则测试者会按“必须完整显示”判定失败。验收样例的作用是统一判定口径,不是增加测试数量。
验收完成后,根据差异来源决定修改位置。容器引起的差异,优先在页面层调整容器约束;若多个页面都需要相同约束,则把约束下沉到组件层。时序引起的差异,优先在组件层增加占位或加载状态,而不是在每个页面单独补样式。
判断标准很简单:如果同一组件在三个以上页面都需要相同的页面层补丁,说明补丁应该进组件;如果只有个别页面因特殊布局需要调整,则保留在页面层。这个判断会影响下一步是改组件还是改页面,也决定后续验收样例是复用还是新增。