先给结论:不要为“这个组件没问题”写一份通用验收样例,而要为“它在哪些页面条件下成立”写一组条件明确的样例。做法是把组件拆成数据来源、渲染上下文和交互触发三层,每层选一个会改变结果的条件做对照页,再规定必须同时满足的断言。这样得到的样例能暴露规模化后的例外,而不是只证明首页那个样本好看。
同一组件在不同页面表现不同,通常不是组件本身随机变化,而是输入和上下文变了。构造验收样例前,先列出三个变量:数据形态(字段是否为空、长度是否超限、是否含富文本或特殊字符)、页面上下文(列表页、详情页、聚合页、搜索结果页的容器宽度和层级不同)、交互状态(是否已登录、是否分页、是否由异步加载插入)。
把这三个变量各取两到三个取值,交叉出对照页。例如列表页取“有摘要”和“无摘要”,详情页取“单图”和“多图”,再各加一个字段为空的分支。每个对照页只允许一个变量不同,其余保持一致。这样出现差异时,能直接归因到具体条件,而不是笼统地说“某些页面有问题”。
断言要写成可判定的句子,例如“标题超过两行时容器高度随之增长且不遮挡下方按钮”“图片缺失时占位区域保持与有图时相同宽高比”。避免“显示正常”“样式美观”这类无法核对的说法。
如果CMS把组件输出缓存到页面级,并且缓存键只包含页面ID,那么上面按变量构造的对照页可能全部命中同一份缓存,你看到的差异其实来自缓存命中顺序,而不是页面条件。此时“每页只变一个变量”的方法会给出错误归因:你以为是无摘要页面导致错位,实际是第一次渲染的版本被复用了。
判断方法很直接:清空缓存后按固定顺序访问对照页,再打乱顺序访问一次。若两次结果不同,说明缓存键或片段缓存策略在干扰结论,先修缓存粒度,再谈组件验收。这个反例也提醒,验收样例必须写明前置状态,例如“在缓存未命中的首次渲染下执行”,否则同一份样例在不同环境会得出相反结论。
每个样例至少包含四段:前置条件、操作步骤、期望结果、失败后的下一步。动作要具体到能被执行,例如“在详情页模板中把摘要字段置空后重新生成该页”。结果要说明它如何影响下一步:
这样每一步失败都能指向一个待验证的假设,而不是反复重装或换主题。
个别样本成立不等于规模化成立。上线前至少补三类边界:字段达到系统允许的最大长度、同一页面出现多个同类组件、组件被嵌套在更窄的容器里。每类只做最小对照,例如同一页面放两个组件,观察ID、样式类名和状态是否互相污染。
还需记录样例的适用范围:它验证的是当前模板和当前数据形态,换模板、换字段结构或换渲染方式后需要重跑。若CMS升级改变了输出结构,旧样例的期望结果可能整体失效,这时应保留原始断言并标注版本条件,而不是直接删除。
先选一个已经出现差异的组件,按数据、上下文、交互各取两个取值,写出不超过六个对照页,并为每个对照页写明前置缓存状态和一条可判定断言。执行后把失败项按“字段层—模板层—组件层”归类,只修被证据指向的那一层。完成这一轮后,再把同样的结构复制到其他组件,而不是一次性铺开全部页面。