先给结论:小样本有效而批量无效,通常不是“操作本身时灵时不灵”,而是小样本里混进了批量时不存在的条件,或者批量把某个被忽略的约束放大了。要复现,不是把操作再跑一遍,而是先找出两次执行之间哪个变量变了,再只改那一个变量重做对照。
第一种解释是样本依赖。你抽的那几页恰好结构整齐、字段齐全、没有异常嵌套,操作在这些页面上成立;批量时遇到缺字段、重复值、特殊字符,同一套规则就断了。这时操作本身没错,错在它隐含了一个未被写出的前提。
第二种解释是环境依赖。小样本是你手动逐条执行的,中间有停顿、有肉眼检查、有临时修正;批量是脚本或工具连续跑,没有这些缓冲。差异可能来自执行顺序、并发、请求频率、缓存状态,而不是页面内容。这两种解释指向完全不同的修法:前者要补数据校验,后者要补执行控制。
把批量失败的那批记录拿出来,按“小样本里成功过的特征”分组,看失败是否集中。可参考下面的判别方式:
注意一个容易误判的现象:如果批量执行后抓取量、请求量或某项统计掉到接近零,这不能单独证明操作被正确处理了。它也可能是对方限流、任务提前中断、日志没写全,或者统计口径本身变了。要区分,就得看失败记录是否伴随报错、是否成片出现、重跑是否恢复。
没有全量日志、没有后台权限,也能做一件事:构造一个受控的失败复现样本。从批量失败记录里挑三条,一条明显缺字段,一条字段齐全但曾在小样本成功,一条特征不明;再从小样本成功记录里挑一条作对照。四条放在同一条件下依次执行,记录每条在哪一步停下、停下的原因是否一致。
这个动作的结果会直接决定下一步:如果只有缺字段那条失败,就去补输入校验,而不是改操作逻辑;如果四条都在同一位置失败,说明当前环境本身不满足执行条件,应先恢复一个已知可用的执行环境再谈复现;如果失败位置随机,说明还有未识别的变量,需要继续缩小范围,而不是急着推广到全量。
假设某次批量修改页面标题的操作,在小样本 5 个页面上都成功,批量 500 个页面时约一半未生效。假设失败记录中,未生效的页面多来自同一批旧模板,且这些页面的标题字段为空。此时较合理的推断是:操作依赖了“标题字段非空”这一前提,而小样本恰好都满足。验证方式是只挑 3 个标题为空的页面,单独执行同一操作并观察结果。
若这 3 个页面仍不生效,说明前提成立,应先在规划阶段补上字段兜底规则,再重新小范围验证;若这 3 个页面生效了,说明失败另有原因,应回到执行环境去查顺序与频率,而不是继续改数据规则。这里的关键不是一次跑通,而是让每次执行只改变一个可解释的变量。
复现成功后,把“操作成立所需的前提”写成一句可检查的条件,例如“目标记录的标题字段非空且模板一致”,并把它放进批量执行前的检查项。这样做的价值不在于这次修好了多少条,而在于下次批量前你能提前判断哪些记录会被跳过,而不是等跑完才发现一半没生效。
同时要接受一个现实:一次改动前后的差异,可能来自季节、搜索需求变化或数据采集口径不同,不能只凭一次对照就断定操作必然有效或必然无效。复现的目标是排除解释,不是拿到一个固定见效时间。