Golang A/B Testing SDK 依赖于神策分析 SDK,在使用前请确保已经成功集成神策分析 SDK,并进行了 SDK 初始化,详情可参考 SDK 集成 (Golang)。
SDK 需要 Golang 1.6 以上,不依赖第三方库。目前 Golang SDK 不支持 Windows。
我们推荐 Golang 官方工具管理 Golang 项目并获取 A/B Testing SDK :
go get github.com/sensorsdata/abtesting-sdk-go
或更新本地已经存在的 SDK:
go get -u github.com/sensorsdata/abtesting-sdk-go
也可以从 GitHub 下载 abtesting-sdk-go 的源代码。
初始化 SDK在神策分析中创建 A/B Testing 后,会生成分流试验请求 URL,通过该 URL 初始化 A/B Testing SDK:
import (
"fmt"
"github.com/sensorsdata/abtesting-sdk-go"
"github.com/sensorsdata/abtesting-sdk-go/beans"
"github.com/sensorsdata/sa-sdk-go"
)
必须先初始化分析埋点 SDK(参考文档:https://manual.sensorsdata.cn/sa/latest/tech_sdk_server_golang-17569150.html)
abconfig := beans.ABTestConfig{
APIUrl: "分流试验请求地址",
EnableEventCache: true, // 开启事件缓存
SensorsAnalytics: sa, // 神策分析埋点 SDK 实例
}
// 初始化 A/B Testing SDK
err, abtest := sensorsabtest.InitSensorsABTest(abconfig)
获取试验变量初始化 SDK 之后,通过 API 获取具体试验的变量值,根据获取试验变量值的方式,可分为下面两种策略:
- AsyncFetchABTest :忽略内存缓存,从服务端获取数据;
- FastFetchABTest :优先读取内存缓存,缓存不存在时从服务端获取数据。
请确保对A/B分流返回的 result 结果 & 接口中使用的默认值,都做了正常的业务逻辑处理!
以 FastFetchABTest 为例,可在相应的业务逻辑中添加如下代码:
// int 类型试验(第二个参数 DefaultValue,表示未命中试验时,会返回此默认值,请根据业务需要更改此处的值)
requestParam := beans.RequestParam{
ParamName: "具体的试验参数",
DefaultValue: 0, //必填
EnableAutoTrackABEvent: true, // true 表示自动触发 A/B 测试($ABTestTrigger)事件,用于后续分析试验效果,计算置信区间等。
}
distinctId := "ABCDEFG1234567" // 具体的用户 ID 标识
isLoginId := true // 当前用户是否是登录 ID
err, experiment := abtest.FastFetchABTest(distinctId, isLoginId , requestParam)
if err == nil {
// TODO 根据返回值做试验,注意返回值是 map[string]interface{} 类型需要自己做类型判断
// 这里通过数值类型进行示例
switch experiment.Result {
case 0:
break
case 1:
// 试验组 1 的处理逻辑
break
case 2:
// 试验组 2 的处理逻辑
break
// .......
// .......
default:
break
}
}
3.1. 携带自定义属性获取试验
v0.0.2 及以上版本 SDK 支持自定义属性扩充受众筛选能力,可在请求接口 FastFetchABTest、AsyncFetchABTest 中的 RequestParam 变量中添加自定义属性。以 FastFetchABTest 接口为例:
// int 类型试验(第二个参数 DefaultValue,表示未命中试验时,会返回此默认值,请根据业务需要更改此处的值)
requestParam := beans.RequestParam{
ParamName: "具体的试验参数",
Properties: map[string]interface{}{// 设置自定义属性
"property1": property1,
"property2": property2,
},
DefaultValue: 0, //必填
EnableAutoTrackABEvent: true, // true 表示自动触发 A/B 测试($ABTestTrigger)事件,用于后续分析试验效果,计算置信区间等。
}
distinctId := "ABCDEFG1234567" // 具体的用户 ID 标识
isLoginId := true // 当前用户是否是登录 ID
err, experiment := abtest.FastFetchABTest(distinctId, isLoginId , requestParam)
if err == nil {
// TODO 根据返回值做试验,注意返回值是 map[string]interface{} 类型需要自己做类型判断
// 这里通过数值类型进行示例
switch experiment.Result {
case 0:
break
case 1:
// 试验组 1 的处理逻辑
break
case 2:
// 试验组 2 的处理逻辑
break
// .......
// .......
default:
break
}
}
3.2. 携带自定义主体获取试验
v0.0.2 及以上版本 SDK 支持自定义属性扩充受众筛选能力,可在请求接口 FastFetchABTest、AsyncFetchABTest 中的 RequestParam 变量中添加自定义主体。以 FastFetchABTest 接口为例:
注意
在使用自定义分流主体时需要通过埋点 SDK 的 RegisterSuperProperties 接口将自定义主体注册为公共属性。
// int 类型试验(第二个参数 DefaultValue,表示未命中试验时,会返回此默认值,请根据业务需要更改此处的值)
requestParam := beans.RequestParam{
ParamName: "具体的试验参数",
CustomIDs: map[string]interface{}{// 设置自定义主体
"id1": id1,
"id2": id2,
},
DefaultValue: 0, //必填
EnableAutoTrackABEvent: true, // true 表示自动触发 A/B 测试($ABTestTrigger)事件,用于后续分析试验效果,计算置信区间等。
}
distinctId := "ABCDEFG1234567" // 具体的用户 ID 标识
isLoginId := true // 当前用户是否是登录 ID
err, experiment := abtest.FastFetchABTest(distinctId, isLoginId , requestParam)
if err == nil {
// TODO 根据返回值做试验,注意返回值是 map[string]interface{} 类型需要自己做类型判断
// 这里通过数值类型进行示例
switch experiment.Result {
case 0:
break
case 1:
// 试验组 1 的处理逻辑
break
case 2:
// 试验组 2 的处理逻辑
break
// .......
// .......
default:
break
}
}
在 A/B Testing SDK 中提供了试验获取接口和埋点事件接口。
4.1. 初始化配置参数说明
在 A/B Testing SDK 中,初始化参数配置封装在 ABConfig 类中,提供的初始化参数有:
参数名 | 类型 | 说明 |
---|---|---|
APIUrl | string | 试验请求 API 地址(必填) |
SensorsAnalytics | sensorsanalytics.SensorsAnalytics | 用于 SDK 埋点 SensorsAnalytics 实例(必填) |
ExperimentCacheTime | time.Duration | 试验缓存时长,单位是分钟,默认是 24 * 60 |
ExperimentCacheSize | int | 试验总缓存用户量限制,默认值为 4096 |
EventCacheTime | time.Duration | A/B 测试($ABTestTrigger)事件缓存时间,单位是分钟,默认是 24 * 60 |
EventCacheSize | int | A/B 测试($ABTestTrigger)事件总缓存用户量限制,默认值为 4096 |
EnableEventCache | bool | 是否开启 A/B 事件缓存,默认 false |
4.2. 获取试验方法说明
从服务端获取试验数据。
描述 | 说明 |
---|---|
方法名 | AsyncFetchABTest/FastFetchABTest |
参数 | distinctId, isLoginId, requestParam beans.RequestParam
|
返回值 | error, experiment beans.Experiment
|
4.3. RequestParam 参数说明
在 A/B Testing SDK 中,试验请求参数配置封装在 RequestParam 类中,提供的参数有:
名称 | 类型 | 说明 |
---|---|---|
ParamName | string | 试验变量名(必填) |
DefaultValue | interface{} | 未命中试验时,会返回默认值,请根据业务需要更改此处的值(必填) |
EnableAutoTrackEvent | bool | 是否自动触发 A/B 测试($ABTestTrigger)事件,用于后续分析试验效果,计算置信区间等(必填) |
Properties | map[string]interface{} | 自定义属性,请求试验时,用于分流筛选的属性 |
CustomIDs | map[string]interface{} | 自定义分流主体 |
TimeoutMilliseconds | time.Duration | 网络请求超时时间,默认 3000ms,单位 ms |
4.4. 手动触发 A/B 测试($ABTestTrigger)事件说明
如果设置了 EnableAutoTrackABEvent: true 表示由 SDK 自动触发 A/B 测试($ABTestTrigger)事件,用于后续分析试验效果,计算置信区间等。
如果不想让 SDK 自动触发 A/B 测试($ABTestTrigger)事件,可以设置 EnableAutoTrackABEvent: false ,然后调用 TrackABTestTrigger 方法来手动触发事件。
示例如下:
requestParam := beans.RequestParam{
ParamName: "具体的试验参数",
DefaultValue: 0, // 必填
EnableAutoTrackABEvent: false, // false 表示不自动触发 A/B 测试($ABTestTrigger)事件
}
distinctId := "ABCDEFG1234567" // 具体的用户 ID 标识
isLoginId := true // 当前用户是否是登录 ID
// 优先从缓存获取试验,由 SDK 触发埋点事件
err, experiment := abtest.AsyncFetchABTest(distinctId, isLoginId, requestParam)
if err == nil {
// TODO 根据返回值做试验,注意返回值是 map[string]interface{} 类型需要自己做类型判断
// 这里通过数值类型进行演示
switch experiment.Result {
case 1:
// 试验组 1 的处理逻辑
break
case 2:
// 试验组 2 的处理逻辑
break
// .......
// .......
default:
break
}
}
//……
// 手动触发 A/B 测试($ABTestTrigger)事件
abtest.TrackABTestTrigger(experiment, nil)
experiment 对象信息
试验 experiment 对象中包含 DistinctId、是否登录 ID、试验变量值(Result)、试验 ID(AbtestExperimentId)、试验内分组 ID(AbtestExperimentGroupId)、是否是对照组(IsControlGroup)、是否是白名单(IsWhiteList)和试验参数对象(VariableList)。
4.5. TrackABTestTrigger 方法说明
该接口用于手动触发 A/B 测试($ABTestTrigger)事件
方法名 | TrackABTestTrigger |
参数 | experiment beans.Experiment, property map[string]interface{}
|
返回值 | error error
|