You need to enable JavaScript to run this app.
文档中心
A/B测试

A/B测试

复制全文
下载 pdf
开发指南
实验SDK集成概述
复制全文
下载 pdf
实验SDK集成概述

在使用A/B测试进行实验前,您需要先明确实验场景并规划实验方案,研发工程师根据实验方案完成实验SDK接入,集成后,后续通过SDK与DataTester的分流服务实现实验的分流、获取实验参数等功能。本文为您介绍实验SDK的能力和通用集成流程。

背景信息

SDK发布日志

隐私政策说明

  • SDK名称:增长营销套件SDK。
  • SDK最新版本号:当前SDK版本在不断迭代发布中,您可前往Git开源页面查看各端的最新SDK版本及历史版本情况,推荐使用最新版本SDK。
  • SDK发布日志:详情参见SDK更新日志
  • SDK开发者:北京火山引擎科技有限公司。
  • 主要功能:增长营销套件SDK支持采集基础数据,用于对应用的新增、激活、留存、性能等统计性指标进行分析。

A/B实验类型主要分为客户端实验服务端实验。两类实验的对比介绍如下所示。

对比说明

客户端实验

服务端实验

实验描述

指通过客户端获取实验分组信息控制配置生效的实验。

指通过服务端获取实验分组信息控制配置生效或下发的实验。

特点及场景

  • 特点:
    • APP唤起时,AB相关配置即需生效
    • 依赖客户端SDK,通过请求分流服务完成分流,需要客户端SDK研发完成实验SDK的接入工作。
  • 场景:
    客户端界面布局调整或者本地功能优化的A/B实验,在客户端进行实验是比较合适的。
    例如,测试不同的按钮颜色、位置对用户点击率的影响,这些实验基本不需要太多的服务器资源,主要依赖客户端设备的显示和交互功能。
  • 特点:
    • 命中和曝光的逻辑在服务端处理,不要求唤起APP时就使实验配置生效。客户端有充分时间向服务端发起请求,获得实验配置后再向用户展示策略。
    • 依赖服务端SDK/服务端分流Agent进行本地分流,需要服务端研发完成SDK集成或部署服务端分流Agent。
  • 场景:
    • 推荐策略、纯服务端配置实验,通常uid分流,不要求唤起APP时就使实验配置生效。
    • 部分功能只能由服务端来控制,比如内容分发算法(如用户打开今日头条以后在feed流中会看见什么内容)、由服务端逻辑控制的产品功能(如推送)等。

客户端实验SDK

集成逻辑

对比说明

客户端实验

实验描述

指通过客户端获取实验分组信息控制配置生效的实验。

实验SDK逻辑

Image

  1. 客户应用侧集成DataTester的客户端SDK。
  2. 当用户打开APP触发客户端SDK初始化时,客户端SDK会向DataTester的分流服务发送分流请求,分流服务会返回对应的分流结果,APP侧根据分流结果生效对应实验版本的功能。后续分流结果会被存在本地。
  3. APP执行至曝光区代码时,会调用获取实验参数API拿到存在本地的分流结果中的实验进组信息(VID),并自动上报预置的曝光事件(abtest_exposure),曝光事件会携带用户命中实验的分组(VID)信息。
  4. 用户在APP进行操作,当触发实验指标相关埋点时,会通过客户端SDK上报并落库至数仓中,后续可在实验报告查看相关指标数据。
  5. 客户端SDK每隔10分钟会重新请求一次分流服务拉取最新的分流结果,如果本地有,会覆盖之前缓存的,如果本地没有会把获取的结果存在本地。

实验指标/参数数据落库流程

其中:

  • 行为数据:即根据分析业务目标制定的数据采集方案,在对应位置进行埋点,当用户触发关键事件时,就会将事件埋点上报给后台。
  • 用户数据:采集的用于唯一标识用户的用户ID相关数据,以及业务后期分析所需的用户特征相关数据。
  • 设备数据:采集的用于唯一标识设备的ID数据,以及业务后期分析所需的设备特征相关数据。

支持的端/语言类型

客户端SDK支持iOS、Android、Web/JS、HarmonyOS、小程序、各种框架(如RN、Flutter等)的SDK等。

通常进行实验SDK集成时,有以下通用流程与注意事项。

step1:准备工作

  1. 接入应用。
    确认管理员已完成创建集团、DataTester实验应用接入等操作,详情请参见快速入门:管理员(云原生)
  2. 创建实验并获取实验版本参数代码。
    登录DataTester控制台,创建A/B测试实验,获取实验的版本参数集成代码,详情请参见创建实验文档中的step3 配置实验版本章节。
    Image
  3. 获取APP ID等信息。
    登录DataTester控制台,获取后续数据接入所需的应用ID等信息。
    • SaaS-非云原生:
      Image
    • SaaS-云原生:
      Image

step2:了解注意事项

注意事项

引导说明

用户标识说明

根据数据接入方案,了解数据接入时支持的用户标识类型,统一统计口径,详情请参见支持的用户唯一标识

数据格式说明

如果需要自定义事件则需要了解对应事件及其属性对应的数据格式要求,详情请参见支持的数据格式(自定义事件/属性)

注意

如果数据格式不符合规范,可能会导致数据接入操作正常,但后续上报的数据落库后为空或出现异常,因此您需要关注数据格式要求,例如将数值类型的属性,数据类型定义为string,可能后续数据上报候后,进行分析时会出错。

预置事件及属性

根据数据接入方案,明确后续需要采集上报的事件及其属性,了解预置事件及属性列表是否满足业务需求,预置事件及属性详情请参见预置属性总表

step3:SDK集成

「A/B」测试支持客户端、Web端、服务端等多种集成方式。请您根据需集成的应用类型,选择合适的集成方式,并参考以下的视频和文档完成SDK的集成。

集成场景

操作指导

客户端

说明

实验指标的上报可以通过客户端SDK上报,或使用HTTP API上报,可参考下文的 实验指标上报 章节。

step4:集成结果验证

可参考以下验证步骤对实验进行调试验证,调试成功后,可开启实验,后续可查看实验报告。

注意

如果实验是当天创建的实验报告和数据指标均为实时的,如果非当天创建,实验报告为非实时的,如果想查看实时数据,可以通过数据指标,选择5分钟级或小时级查看实时数据。

测试白名单验证

测试白名单为创建A/B实验时设置的测试用户,主要在实验创建完成、实验SDK集成操作完成后,用来调试实验/feature、检查白名单用户是否可以命中实验/feature,从而验证集成代码是否有误。

  • 白名单的创建使用详情可参见用户测试白名单
  • 创建实验时的白名单用户配置处:
    Image
    • 测试用户需配置为测试用户的ssid。
    • 把测试用户的ssid添加到哪个版本,就意味着让这个用户强制命中哪个版本。
      更多配置操作详情可参见step3 配置实验版本

分流结果验证

在开发工具运行应用,在控制台看获取分流结果是否和添加版本的value保持一致,如一致,意味着分流成功。
Image

实验指标上报结果验证

在全局设置-用户细查查看指定用户的细查行为中有没有携带目标实验vid的实验曝光事件上报上来。
Image

通用参考:数据上报&缓存策略

数据上报策略

SDK

上报策略描述

是否可配置

是否可以根据网络环境自动调节

是否可以分时段上报

Android

  • SDK未初始化时,如果有事件触发(包括预置的、自定义的),会缓存在客户端内存,最多缓存300条。
  • SDK初始化后,如果有事件触发(包括预置的、自定义的),是否调用了init,init 之后(默认 init 后自动 start)会落库,start之后每60s上报一次(每次最多是1600条,如果一分钟内产生超过1600条需要等下个60s再报)。
  • SDK初始化后,如切换用户,立即上报一次。


每60秒触发一次上报任务,每个请求打包200个埋点,Android 每次任务最多连续上报8个请求,iOS 每次任务最多连续上报10个请求

iOS

  • SDK未初始化不会本地缓存。
  • SDK初始化后,如果有事件触发(包括预置的、自定义的),是否调用了init,init 之后(默认 init 后自动 start)会落库,start之后每60s上报一次(每次最多是2000条,如果一分钟内产生超过2000条需要等下个60s再报)。
  • SDK初始化后,如切换用户,立即上报一次。

Web JS

实时上报,但有大约30ms的异步队列等待时间,30ms内触发的事件条数在20条以内的话就合并为一条上报,超过20条,就按照20个一组分开上报。max_report可以设置条数。

可配置最大上报条数和异步队列等待时间:
max_report : 10 (事件合并上报条数默认10 )
reportTime: 30 (事件上报异步队列的时间间隔 默认30ms)

小程序
(微信/字节/支付宝/百度/QQ等)

默认实时上报。

  • 1.x版本:支持开启enable_storage,开启后会默认每隔5秒、每次默认最多5条的方式进行上报。
  • 2.5版本及以上:支持enable_buffer(缓冲)、enable_cache(缓存)。
    缓冲的话:
    • buffer_interval:默认5秒,可以调整
    • buffer_number:默认5个,可以调整

可配置是否开启、间隔秒数、单次数量阈值
仅2.5.0及以上版本支持:

  • enable_buffer :true//开启缓冲
  • buffer_interval:5000//缓冲的间隔时间,单位是毫秒,默认值 5000
  • buffer_number:5//缓冲的最大数量,默认值 5
  • enable_cache:true //开启缓存

小游戏
(微信/字节/快游戏等)

同小程序

快应用

同小程序

数据缓存策略

SDK

网络异常、崩溃等情况导致上报失败后数据处理机制

是否压缩

压缩算法

算法是否可定制

Android

埋点打包会存db(sdk初始化前产生的埋点不会存db,最多缓存300条;初始化后才会存储db。只要没杀进程之前缓存的埋点都会落库),上报成功会从db删除,上报失败不会从db删除,直到10天过期才删除,db存储量跟随手机存储空间来定。

AES加密+gzip压缩

可(默认支持AES+CBC,需要跟服务端配套)

iOS

埋点打包会存SQLite3数据库,上报成功会从数据库删除,上报失败不会从db删除,ios不会删除本地数据,sdk没有存储限制,db存储跟随手机的硬盘大小限制。

AES加密+gzip压缩

可(默认支持AES+CBC,需要跟服务端配套)

小程序

默认下上报失败就失败了,在开启缓存(1.x版本参数enable_storage、2.5版本及以上参数enable_cache)的情况下,会放入本地存储等待下次进行补充上报(单个key允许存储的最大数据长度为1MB,所有数据存储上限为10MB)。

Web

默认无机制,可配置开启全局
使用enable_storage:true开启全局配置,在网络异常时导致上报失败的数据会存储到localstorage中,下次访问页面时会优先检查localstorage中的数据,如有则发送。(缓存限制条数默认不超过50条,可使用storage_num参数进行配置限制条数)

服务端实验SDK

集成逻辑

对比说明

服务端实验

实验描述

指通过服务端获取实验分组信息控制配置生效或下发的实验。

实验SDK逻辑

Image

  1. 客户服务端集成DataTester的服务端SDK,或者部署服务端的分流Agent。
  2. 服务端SDK初始化后会定时调用DataTester的元数据服务获取实验元信息(包括实验名称、版本分配、目标受众、白名单等)。
  3. 用户访问C端应用,C端应用向服务端发起请求;服务端SDK使用获取到的实验元信息进行计算,返回实验分流结果。
  4. 服务端同时上报预置的曝光事件,(abtest_exposure),曝光事件会携带用户命中实验的分组(VID)信息。
  5. 服务端的分流结果(版本配置信息)同时会向下游服务传递。

注意

服务端SDK/分流Agent仅完成实验分流和上报预置的曝光事件,如果您还需上报实验指标数据,可通过集成客户端SDK上报指标事件,或通过HTTP API、数据集成功能集成实验指标数据。

实验指标/参数数据落库流程

其中:

  • 行为数据:即根据分析业务目标制定的数据采集方案,在对应位置进行埋点,当用户触发关键事件时,就会将事件埋点上报给后台。
  • 用户数据:采集的用于唯一标识用户的用户ID相关数据,以及业务后期分析所需的用户特征相关数据。
  • 设备数据:采集的用于唯一标识设备的ID数据,以及业务后期分析所需的设备特征相关数据。

支持的端/语言类型

服务端SDK支持Java、Python、Go、PHP等。

通常进行实验SDK集成时,有以下通用流程与注意事项。

step1:准备工作

  1. 接入应用。
    确认管理员已完成创建集团、DataTester实验应用接入等操作,详情请参见快速入门:管理员(云原生)
  2. 创建实验并获取实验版本参数代码。
    登录DataTester控制台,创建A/B测试实验,获取实验的版本参数集成代码,详情请参见创建实验文档中的step3 配置实验版本章节。
    Image
  3. 获取APP Key等信息。
    登录DataTester控制台,获取后续数据接入所需的应用ID等信息。
    • SaaS-非云原生:
      Image
    • SaaS-云原生:
      Image

step2:了解注意事项

注意事项

引导说明

用户标识说明

根据数据接入方案,了解数据接入时支持的用户标识类型,统一统计口径,详情请参见支持的用户唯一标识

数据格式说明

如果需要自定义事件则需要了解对应事件及其属性对应的数据格式要求,详情请参见支持的数据格式(自定义事件/属性)

注意

如果数据格式不符合规范,可能会导致数据接入操作正常,但后续上报的数据落库后为空或出现异常,因此您需要关注数据格式要求,例如将数值类型的属性,数据类型定义为string,可能后续数据上报候后,进行分析时会出错。

预置事件及属性

根据数据接入方案,明确后续需要采集上报的事件及其属性,了解预置事件及属性列表是否满足业务需求,预置事件及属性详情请参见预置属性总表

step3:SDK集成

「A/B」测试支持客户端、Web端、服务端等多种集成方式。请您根据需集成的应用类型,选择合适的集成方式,并参考以下的视频和文档完成SDK的集成。

集成场景

操作指导

服务端

说明

服务端SDK/分流Agent仅完成实验分流和上报预置的曝光事件,如果您还需上报实验指标数据,可通过集成客户端SDK上报指标事件,或通过HTTP API、数据集成功能集成实验指标数据,可参考下文的 实验指标上报 章节。

step4:集成结果验证

可参考以下验证步骤对实验进行调试验证,调试成功后,可开启实验,后续可查看实验报告。

注意

如果实验是当天创建的实验报告和数据指标均为实时的,如果非当天创建,实验报告为非实时的,如果想查看实时数据,可以通过数据指标,选择5分钟级或小时级查看实时数据。

测试白名单验证

测试白名单为创建A/B实验时设置的测试用户,主要在实验创建完成、实验SDK集成操作完成后,用来调试实验/feature、检查白名单用户是否可以命中实验/feature,从而验证集成代码是否有误。

  • 白名单的创建使用详情可参见用户测试白名单
  • 创建实验时的白名单用户配置处:
    Image
    • 测试用户需配置为测试用户的decisionid。
    • 把测试用户的decisionid添加到哪个版本,就意味着让这个用户强制命中哪个版本。
      更多配置操作详情可参见step3 配置实验版本

分流结果验证

调试服务端代码,在控制台看到获取分流结果的信息,如果和添加的版本一致,意味着测试成功,可参考下图
Image

实验指标上报结果验证

在全局设置-用户细查查看指定用户的细查行为中有没有携带目标实验vid的实验曝光事件上报上来。
Image

常见服务端实验场景

不存在匿名用户实验

DecisionID和TrackID都使用uuid

User user = new User.UserBuilder().create("uuid", "uuid")

存在匿名用户实验

注意:python sdk目前暂不支持匿名用户实验,如有需求可联系火山引擎技术支持人员。

说明

匿名是针对火山而言,如何识别匿名用户,目前只能通过客户端SDK。

  1. 集成客户端SDK

(1)按照各端集成文档做正常集成即可,以android集成文档为例:Android SDK集成
(2)通过获取设备ID接口拿到火山设备id

  • Android获取设备id代码

    String did = AppLog.getDid(); // 获取设备id
    
  • iOS获取设备id代码

    #import <RangersApplog/BDAutoTrackNotifications.h>
    // 在初始化 sdk 之前设置监听
     [[NSNotificationCenter defaultCenter] addObserver:self
                                                selector:@selector(onRegisterSuccess:)
                                                    name:BDAutoTrackNotificationRegisterSuccess object:nil];
    //SDK 初始化代码部分
    //然后在 SDK 初始化之后设置回调
    - (void)onRegisterSuccess:(NSNotification *)noti  {
        // 请在初始化完成的3秒后开始获取,否则可能返回为空
        NSString *dids = [noti.userInfo objectForKey:kBDAutoTrackNotificationRangersDeviceID];
        NSString *ssids = [noti.userInfo objectForKey:kBDAutoTrackNotificationSSID]; 
        NSLog(@"onRegisterSuccess.dids:%@", dids); // 获取设备id
    }
    
  • 如果是网页/H5或者小程序(即集成JS SDK和小程序SDK),需要使用以下方法,获取web_id

    //网页&H5
    window.collectEvent('getToken', (token) => {
        //token数据内容类似如下:
        {
            "web_id":"6748002161499735560",
            "ssid":"579bc89a-bd45-4021-8314-669c35f38e3d",
            "user_unique_id":"xxx",
        }
    });
    //小程序
    this.$$Rangers.getToken(function(token) { 
            //token数据内容例如:
            // {
            //    "web_id":"6748002161499735560",
            //    "ssid":"579bc89a-bd45-4021-8314-669c35f38e3d",
            //    "user_unique_id":"xxx",
            // }
        });
    
  1. 服务端实验SDK

(1)参考集成文档集成,以java sdk为例:Java SDK
(2)decisionID(分流id)使用设备id或Webid(小程序和web使用webid);trackID(上报id)需要增加判断:

  • 当有uuid时trackID为uuid;
  • 无uuid时trackID为空字符串,且需要增加setDeviceId方法(如果是网页或者H5匿名用户,需要使用.setWebId方法)

移动端匿名用户场景

网页/H5或者小程序匿名用户场景

uuid有值

User user = new User.UserBuilder().create("device_id", "uuid") //decisionID为device_id,trackID为uuid
        .build();

uuid为空

User user = new User.UserBuilder().create("device_id", "") //decisionID为device_id,trackId设置空字符串
        .setDeviceId(6981329701821561868L) //注意:由于device_id是long类型,因此后面需要增加L
        .build();

uuid有值

User user = new User.UserBuilder().create("webid", "uuid") //decisionID为webid,trackID为uuid
        .build();

uuid为空

User user = new User.UserBuilder().create("webid", "") //decisionID为webid,trackId设置空字符串
        .setWebId(7018215618686981329L) //注意:由于webid是long类型,因此后面需要增加L
        .build();

对定向人群做实验

  • 服务端过滤参数介绍
    服务端的请求过滤参数主要用于服务端实验给特定人群做实验进行使用,需要注意服务端过滤参数及值不会实际上报入库,只是用于实时作为当前分流的过滤条件去使用,服务端在分流的时候,通过所构建的User对象,add一个过滤参数传过去。参考帮助文档:服务端请求参数

  • 使用流程说明
    第一步:根据业务设计服务端实验。
    第二步:思考做实验人群筛选条件,并且确定字段名称及对应的值,比如会员卡等级为金卡的人群,vip。
    第三步:在全局设置-服务端请求参数中添加过滤参数,注意参数类型要和SDK代码中的类型匹配。

    第四步:创建服务端实验,在用户受众规则选择对应的过滤端参数及值,保存

    。第五步:参考服务端集成代码做集成,Java SDK,服务端过滤参数参考下方使用,通过add方法进行添加。

实验指标上报

实验报告指标逻辑说明:AB曝光事件之后触发的指标事件算做实验的指标数据,与事件是否携带vid无关。

客户端SDK上报

集成客户端SDK做埋点事件上报,参考文档:iOS SDK集成开发指南

HTTP API上报

说明

注意:事件上报的用户标识一定得和服务端SDK里的用户标识保持一致,不然会出现无法关联的情况。

参考文档:HTTP API,body体示例如下:

  • 实名用户上报
{
    "user": {
        "user_unique_id": "1234567***"
    },
    "header": {
    },
    "events": [
        {
            "event": "event",
            "params": "{}",  
            "local_time_ms": 1692866701936
        }
    ]
}
  • 匿名用户上报
    • 移动端匿名用户

      {
          "user": {
              "user_unique_id": "",
              "device_id":"728269350799357****"  //注意:device_id为火山设备id
          },
          "header": {
          },
          "events": [
              {
                  "event": "event",
                  "params": "{}",  
                  "local_time_ms": 1692866701936
              }
          ]
      }
      
    • 网页&H5及小程序匿名用户

      {
          "user": {
              "user_unique_id": "",
              "web_id":"477892002****"  //注意:web_id为火山设备webid
          },
          "header": {
          },
          "events": [
              {
                  "event": "event",
                  "params": "{}",  
                  "local_time_ms": 1692866701936
              }
          ]
      }
      
最近更新时间:2025.03.06 16:23:57
这个页面对您有帮助吗?
有用
有用
无用
无用