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六、低级的坑
-
缓存问题:客户端缓存了实验分组,实验配置变更后用户看不到新版本。
-
埋点重复:页面重新渲染会上报多次曝光。
-
客户端兼容性:老版本 APP 没有集成实验 SDK,直接 crash。
-
数据对不上:埋点需求要求的 id 与真正上报的 id 不是同一个东西。
七、总结
业务需求的 AB 实验测试,重点还是功能本身:
- 对照组和实验组都要测,不要漏了对照组
- 埋点验证很重要,数据错了实验就白做了
- 开关/灰度场景要覆盖,方便紧急回滚
- 老客户端兼容性容易漏,记得测
- 上线后持续监控,分流比例、数据完整性都要看
AB 实验本身不复杂,但涉及的分流、埋点、开关这些环节多了,出问题的概率就大了。测试的时候多想想"如果这里挂了会怎么样",一般都能覆盖到。