Golang A/B Testing SDK 依赖于神策分析 SDK,在使用前请确保已经成功集成神策分析 SDK,并进行了 SDK 初始化,详情可参考 SDK 集成 (Golang)。

SDK 需要 Golang 1.6 以上,不依赖第三方库。目前 Golang SDK 不支持 Windows。

SDK 集成

我们推荐 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
	} 
}


API 介绍

在 A/B Testing SDK 中提供了试验获取接口和埋点事件接口。

4.1. 初始化配置参数说明

在 A/B Testing SDK 中,初始化参数配置封装在 ABConfig 类中,提供的初始化参数有:

参数名类型说明
APIUrlstring试验请求 API 地址(必填
SensorsAnalyticssensorsanalytics.SensorsAnalytics用于 SDK 埋点 SensorsAnalytics 实例(必填
ExperimentCacheTimetime.Duration试验缓存时长,单位是分钟,默认是 24 * 60
ExperimentCacheSizeint试验总缓存用户量限制,默认值为 4096
EventCacheTimetime.DurationA/B 测试($ABTestTrigger)事件缓存时间,单位是分钟,默认是 24 * 60
EventCacheSizeintA/B 测试($ABTestTrigger)事件总缓存用户量限制,默认值为 4096
EnableEventCachebool是否开启 A/B 事件缓存,默认 false

4.2. 获取试验方法说明

从服务端获取试验数据。

描述

说明

方法名AsyncFetchABTest/FastFetchABTest
参数

distinctId, isLoginId, requestParam beans.RequestParam

  • distinctId:用户标识
  • isLoginId:是否是登录 ID
  • requestParam:请求参数
返回值

 error,  experiment beans.Experiment

  • error:是否出错
  • experiment:对应的试验,用于手动触发触发 A/B 测试($ABTestTrigger)事件

4.3. RequestParam 参数说明

在 A/B Testing SDK 中,试验请求参数配置封装在 RequestParam 类中,提供的参数有:

名称类型说明
ParamNamestring试验变量名(必填
DefaultValueinterface{}未命中试验时,会返回默认值,请根据业务需要更改此处的值(必填
EnableAutoTrackEventbool是否自动触发 A/B 测试($ABTestTrigger)事件,用于后续分析试验效果,计算置信区间等(必填
Propertiesmap[string]interface{}自定义属性,请求试验时,用于分流筛选的属性
CustomIDsmap[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{}

  • experiment:试验对象
  • property:自定义属性
返回值

error error

  • error:埋点是否出错