什么是A/B测试

AB测试是为Web或App界面或流程制作两个(A/B)或多个(A/B/n)版本,在同一时间维度,分别让组成成分相同(相似)的访客群组(目标人群)随机的访问这些版本,收集各群组的用户体验数据和业务数据,最后分析、评估出最好版本,正式采用。[百度百科]

举例例子来说:我们正在做一个活动,通过文案引导用户点击按钮跳转到活动页。这时产品和老板分别给出了一套文案A和B。他们两个各自有理,作为程序员的你当然不能站在那看”笑话”,你要从技术的角度来平息这场争吵。那就可以引入A/B测试。

A/B测试方案

  • 纯前端控制A/B桶内用户数,将结果汇总到统计服务器上。

  • 由后台控制A/B桶内用户数,结果汇总到后台。

这两种方案都有各自的有缺点,我比较支持第二种做法,因为可以灵活的控制A/B桶内用户数。

A/B测试库SkyLab

SkyLab 是iOS端的一个A/B、多元测试框架。我们看一下使用方法:

A/B测试

1
2
3
4
5
6
7
8
9
10
11
12
- (void)viewDidLoad { 
[super viewDidLoad];
[SkyLab abTestWithName:@"Title" A:^{
self.tipLabel.text = @"我在使用方案A";
} B:^{
self.tipLabel.text = @"我在使用方案B";
}];
}

- (IBAction)resetPlanButton:(id)sender {
[SkyLab resetTestNamed:@"Title"];
}

多元测试 :可能命中一个或多个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- (void)viewDidLoad {
[super viewDidLoad];

[SkyLab multivariateTestWithName:@"MTitle"
variables:@{
@"A" : @(0.5), //数字表示命中机率
@"B" : @(0.5),
@"C" : @(0.5)
}
block:^(NSSet *assignedVariables) {
NSString *text = @"正在使用";
if ([assignedVariables containsObject:@"A"]) {
text = [text stringByAppendingString:@"A"];
}
if ([assignedVariables containsObject:@"B"]) {
text = [text stringByAppendingString:@"B"];
}
if ([assignedVariables containsObject:@"C"]) {
text = [text stringByAppendingString:@"C"];
}
self.tipLabel.text = text;
}];
}

- (IBAction)resetPlanButton:(id)sender {
[SkyLab resetTestNamed:@"MTitle"];
}

分割测试:只会命中一个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- (void)viewDidLoad {
[super viewDidLoad];
[SkyLab splitTestWithName:@"STitle"
conditions:@{
@"A" : @(0.5), //数字表示命中机率
@"B" : @(0.5),
@"C" : @(0.5)
}
block:^(id condition) {
NSString *text = @"正在使用";
if ([condition isEqualToString:@"A"]) {
text = [text stringByAppendingString:@"A"];
} else if ([condition isEqualToString:@"B"]) {
text = [text stringByAppendingString:@"B"];
} else if ([condition isEqualToString:@"C"]) {
text = [text stringByAppendingString:@"C"];
}
self.tipLabel.text = text;
}];
}

- (IBAction)resetPlanButton:(id)sender {
[SkyLab resetTestNamed:@"STitle"];
}