目录

AB 实验测试实践

一、背景

一年来,做了很多次有 AB 实验的需求了。AB 实验对产品的决策方向是非常重要的,这也给我们测试时候指明了重点。本文记录一下业务需求侧 AB 实验的测试要点。

二、AB 实验测试的特殊性

普通需求测试:

输入:用户点击结算按钮
预期:跳转结算页

AB 实验需求测试:

输入:用户点击结算按钮
预期:
  - A 组用户:跳转原结算页
  - B 组用户:跳转新结算页

同样的操作,预期结果不唯一,这是 AB 实验测试的核心。

三、测试要点

1. 分流验证

先确认用户确实被正确分流到实验组。一般实验平台会提供接口或日志查询。对于简单的实验,直接黑盒看业务结果也没问题。

测试时要准备两组账号,分别验证:

  • A 组账号 → 看到旧按钮 → 走旧逻辑
  • B 组账号 → 看到新按钮 → 走新逻辑

2. 功能完整性

这是测试的重点。AB 实验本质是两个(或多个)版本的功能同时在线,每个版本都要按正常流程测试一遍。

实验组 测试内容
对照组 (A) 原结算流程全量回归
实验组 (B) 新结算流程全量测试

不要觉得对照组是线上代码就不用测了,因为:

  • 实验代码可能影响原有逻辑
  • 分流开关可能引入 bug

3. 开关/灰度测试

实验一般支持动态调整流量或紧急关闭,这个功能不一定是实验平台上的,因为这种紧急功能掌握在业务自己手里会更安全,比如业务自己加个关闭实验的开关。因此这些场景要测:

场景 1:实验关闭(100% 走对照组)
  任意用户访问 → 都应该看到对照组版本

场景 2:灰度调整(10% → 50%)、或者白名单/黑名单
  新用户按新比例分流

场景 3:紧急回滚
  实验组用户应该能平滑切回对照组

4. 数据埋点验证

AB 实验的核心是看数据,埋点错了实验就白做了。

要验证的埋点:

埋点类型 触发时机
曝光埋点 页面/元素展示
点击埋点 用户点击

5. 交叉场景

如果同时有多个实验在进行,要测试交叉场景:

实验 1:结算按钮样式(A/B)
实验 2:优惠券展示方式(C/D)

需要测试的组合:
- A + C, A + D, B + C, B + D

这种是最恶心的,不但要维护大量账号,还要做大量记录。而且因为 AB 实验的不同实验组表现肯定不会差得太多,所以经常测着测着就头晕了,非常耗费心力。

6. 边界情况

场景 测试方法
新用户首次访问 验证能正常分流
老用户实验期间访问 验证分组不变(用户粘性)
实验结束后访问 验证fallback 到默认版本
不支持实验的客户端 老版本 APP/浏览器应该走默认逻辑

尤其是老客户端的兼容性,很容易漏测。区分实验组可能用了新接口,老版本不支持会报错。这需要在需求评审和技术评审时提前指出。

四、测试策略

1. 测试环境

我会信任 AB 实验平台的分流功能,这块的测试工作应当由平台的人完成,质量也由他们负责。

测试时,我会直接使用 AB 实验平台提供的白名单功能,这样不用依赖随机分流,可以稳定复现问题。

2. 账号管理

准备固定的测试账号,记录每个账号的分组:

| 账号 | 用户 ID | 强制分组 | 用途 |
|------|---------|----------|------|
| ab_test_a01 | 1001 | A(对照) | 对照组功能验证 |
| ab_test_b01 | 1002 | B(实验) | 实验组功能验证 |
| ab_test_b02 | 1003 | B(实验) | 实验组边界测试 |

五、上线后的验证

实验上线后不是就结束了,还要做一些实验方面的验证,但是这块主要是产品经理来关注,测试方面主要关注上线后各个实验组的表现即可。

验证点主要有:

1. 分流比例监控

-- 每小时检查分流比例
SELECT 
    variant,
    COUNT(*) as users,
    COUNT(*) * 100.0 / SUM(COUNT(*)) OVER() as percentage
FROM exposure_logs
WHERE experiment_id = 'checkout_btn_v2'
  AND event_time >= DATE_SUB(NOW(), INTERVAL 1 HOUR)
GROUP BY variant;

-- 预期输出:
-- A: 50%, B: 50% (或配置的比例)

如果比例偏差太大(比如 60/40),说明分流可能有问题。

2. 数据完整性检查

-- 检查是否有曝光但没有分组的脏数据
SELECT COUNT(*) FROM exposure_logs
WHERE experiment_id = 'checkout_btn_v2'
  AND (variant IS NULL OR variant = '');

-- 应该返回 0

六、低级的坑

  1. 缓存问题:客户端缓存了实验分组,实验配置变更后用户看不到新版本。

  2. 埋点重复:页面重新渲染会上报多次曝光。

  3. 客户端兼容性:老版本 APP 没有集成实验 SDK,直接 crash。

  4. 数据对不上:埋点需求要求的 id 与真正上报的 id 不是同一个东西。

七、总结

业务需求的 AB 实验测试,重点还是功能本身:

  1. 对照组和实验组都要测,不要漏了对照组
  2. 埋点验证很重要,数据错了实验就白做了
  3. 开关/灰度场景要覆盖,方便紧急回滚
  4. 老客户端兼容性容易漏,记得测
  5. 上线后持续监控,分流比例、数据完整性都要看

AB 实验本身不复杂,但涉及的分流、埋点、开关这些环节多了,出问题的概率就大了。测试的时候多想想"如果这里挂了会怎么样",一般都能覆盖到。