欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

[UWP] 对应用进行A/B测试

程序员文章站 2022-03-08 16:03:24
【对A/B测试的看法】 开发者在Dev Center中设置几种应用变体,这几种变体有几个变量的值不一样,比如有变体A和变体B(当然还可以加上变体C,Dev Center最多支持5个变体),A和B的不同在于Button的颜色btnColor,A是Amber,B是Blue 这些值设置好之后,Dev Ce ......

【对A/B测试的看法】

开发者在Dev Center中设置几种应用变体,这几种变体有几个变量的值不一样,比如有变体A和变体B(当然还可以加上变体C,Dev Center最多支持5个变体),A和B的不同在于Button的颜色btnColor,A是Amber,B是Blue

这些值设置好之后,Dev Center通过设置的变体比例随机返回变体的变量值 ,比如变体A:变体B = 1:3,那么返回的btnColor值中Amber : Blue = 1:3

开发者根据这些值对应用做一些改变,不同的返回值对应不同的应用表现(比如界面的颜色,某个Button是否显示等等),开发者直接在应用内用随机数也可以粗浅的实现类似的效果,但Dev Center的A/B测试比应用内随机数强大太多了,比如可以方便的使用户在不同的变体间转化,还有日志功能

至于A/B测试的用途,让一小部分用户先用新功能,根据反馈数据决定是否全面上新版的用法我很喜欢,其他的自己搜吧

 

微软官方的例子是两种变体,差别在于Button的Content和背景色,用的事件有用户看到Button和点击Button,从这里就能看出一点A/B测试的用途了,用于判断哪种UI设计更优,然而本文的A/B测试并没有实际用途,只是我想试用一下这个新功能,做完后的效果应该是一半人看的到翻译按钮,一般人看不到翻译按钮

 

【进行A/B测试前置条件】

1.要测试的应用是UWP应用

2.设置好自己的开发机

搭建好一个UWP的开发环境,然后解锁设备,注册开发者账号,GetSetup 下载Microsoft Store Engagement and Monetization SDK,这个SDK取代了以前的Microsoft Universal Ad Client SDK,有A/B测试,应用反馈,显示广告的api

 【Dev Center中创建一个实验】

首先进入Dev Center的仪表板,网页左边会列出你所有的应用,选择要进行A/B测试的应用,选中服务下的实验模块,先新建一个API密钥, 点击 新API密钥给这个密钥取个名字 ,然后点击API密钥上方的新实验

[UWP] 对应用进行A/B测试

 

输入实验名称

下面的测试实验CheckBox 选中后 实验激活了之后还可以继续编辑,可以通过勾选这个来测试客户端是否真的获取到了变量的值 ,方法为将某一个变体的 分配 调整到100%然后观察程序的表现

但微软说这个应该只在内部测试的时候勾上

Note Check this box only if you are creating a test experiment to validate parameters through internal testing. Do not check this box if you are creating an experiment that you will release to customers.

[UWP] 对应用进行A/B测试

 

查看事件名称是用来向Dev Center写日志的,在这里的事件是 “用户看到翻译按钮”

目标名称

   对测试目标的描述,比如我这里的Add Translate Button,这个之后会显示在【结果摘要】里

转换事件名称

A conversion event is an arbitrary string that represents an objective for this goal. Your app code will send this conversion event string to Dev Center when the user reaches an objective

这里我的理解是,转换事件名称就代表一个目标,在程序中使用这个转换事件名称写Log时就代表这个目标完成了

目标

最大化或最小化转换事件的发生,这个不太清楚是什么意思,原文提到每个用户24h只记录一次事件,那这个最大化或最小化有什么区别呢?

Note Dev Center reports only the first conversion event for each user view in a 24-hour time period. If a user triggers multiple conversion events in your app within a 24-hour period, only the first conversion event is reported. This is intended to help prevent a single user from skewing the experiment results for a sample group of users when the goal is to maximize the number of users who perform a conversion.

 

[UWP] 对应用进行A/B测试

 

然后是变体和设置

这里设置了两个变体 一个是Translate,代表显示翻译按钮,另一个NoTranslate代表不显示翻译按钮。

下方的三个输入框 分别填 设置名(可以理解成变量名)  变体1该设置的值 变体2该设置的值

值可以填String、Integer、Double、Boolean类型的,在写代码的时候有对应的方法直接获取

[UWP] 对应用进行A/B测试

 

填完之后点保存,然后再点激活,Dev Center里的设置就完成了,下面开始敲代码

 

【应用内编写代码】

首先添加Microsoft Store Engagement SDK的引用 在项目的引用上右键单击 选择添加引用

[UWP] 对应用进行A/B测试

 

然后就可以敲代码了,这个很明显要在各个页面中使用,所以写成一个Helper类

LogTranslateViewed在页面加载的时候调用,LogTranslateClick在翻译按钮点击时调用

[UWP] 对应用进行A/B测试
  1 public static class ExperimentHelper
  2     {
  3 
  4         #region const strings 
  5         private const string API_KEY = "Your Key Here";
  6 
  7         public const string TranslateButtonVisibility = "TranslateButtonVisibility";
  8 
  9         private const string UseTranslateButton = "useTranslateButton";
 10 
 11         private const string ViewEventName = "userViewedTranslateButton";
 12         #endregion
 13 
 14         private static ExperimentClient experimentClient;
 15 
 16         private static ExperimentVariation variation;
 17 
 18         private static ExperimentVariationResult result;
 19 
 20         static ExperimentHelper()
 21         {
 22             experimentClient = new ExperimentClient(API_KEY);
 23         }
 24          
 25         /// <summary>
 26         /// 获取变量
 27         /// </summary>
 28         private static async void GetExperimentVariation()
 29         {
 30             result = await experimentClient.GetVariationAsync();
 31             variation = result.Variation;
 32         }
 33 
 34         /// <summary>
 35         /// 检查变量是否需要更新
 36         /// </summary>
 37         private static void CheckVariationUpdate()
 38         {
 39             if (result.ErrorCode != EngagementErrorCode.Success || result.Variation.NeedsRefresh)
 40             {
 41                 UpdateExperimentVariation();
 42             }
 43         }
 44 
 45         /// <summary>
 46         /// 更新变量
 47         /// </summary>
 48         private static async void UpdateExperimentVariation()
 49         {
 50             result = await experimentClient.RefreshVariationAsync();
 51             if (result.ErrorCode == EngagementErrorCode.Success)
 52             {
 53                 variation = result.Variation;
 54             }
 55         }
 56 
 57         /// <summary>
 58         /// 获取int类型变量
 59         /// </summary>
 60         /// <param name="name">变量设置名称</param>
 61         /// <param name="defaultValue">默认值</param>
 62         /// <returns></returns>
 63         public static int GetInt(string name, int defaultValue)
 64         {
 65             CheckVariationUpdate();
 66             return variation.GetInteger(name, defaultValue);
 67         }
 68          
 69         public static bool GetBool(string name,bool defaultValue)
 70         {
 71             CheckVariationUpdate();
 72             return variation.GetBoolean(name, defaultValue);
 73         }
 74 
 75         public static double GetDouble(string name,double defaultValue)
 76         {
 77             CheckVariationUpdate();
 78             return variation.GetDouble(name, defaultValue);
 79         }
 80 
 81         public static string GetString(string name,string defaultValue)
 82         {
 83             CheckVariationUpdate();
 84             return variation.GetString(name, defaultValue);
 85         }
 86 
 87         /// <summary>
 88         /// 向Dev Center写日志
 89         /// </summary>
 90         public static void LogEventToDevCenter(string eventName,ExperimentVariation variation)
 91         {
 92             StoreServicesCustomEvents.Log(eventName, variation);
 93         }
 94 
 95         /// <summary>
 96         /// 翻译按钮点击
 97         /// </summary>
 98         public static void LogTranslateClick()
 99         {
100             LogEventToDevCenter(UseTranslateButton, variation);
101         }
102 
103         /// <summary>
104         /// 用户看到翻译按钮
105         /// </summary>
106         public static void LogTranslateViewd()
107         {
108             LogEventToDevCenter(ViewEventName, variation);
109         }
110     }
ExperimentHelper.cs

我的应用使用了MVVM,所以在vm里加一个属性IsTranslateVisible

[UWP] 对应用进行A/B测试
 1 /// <summary>
 2        /// 翻译按钮显示
 3        /// </summary>
 4         public bool IsTranslateVisible
 5         {
 6             get
 7             {
 8                 return ExperimentHelper.GetBool(ExperimentHelper.TranslateButtonVisibility,false);
 9             }
10         }
翻译按钮是否显示

然后把这个属性绑定到UI上就完成了(当然要使用一个Converter,太简单就不说了)

 

【运行应用收集数据】

把应用Run起来,看看我的翻译按钮是不是显示的,有种抽奖的感觉,我的pc端和模拟器分到了不同的变体,一个有翻译按钮,一个没有

获取更新的变量需要一点时间

Note that it may take up to two minutes for your app to receive an updated variation assignment.

[UWP] 对应用进行A/B测试

 

做完上面的步骤之后,就可以开始等了,Dev Center的数据更新一直都不及时,官方的文档也说明了,坐和放宽,等几个小时吧,然后就能看到实验结果了

Note As soon as you activate an experiment, Dev Center immediately starts collecting data from any apps that are instrumented to log data for your experiment. However, it can take several hours for experiment data to appear in the dashboard.

 

【参考链接】

Create and run your first experiment with A/B testing

Monetize your app and engage customers with the Microsoft Store Engagement and Monetization SDK

Run app experiments with A/B testing

Define your experiment in the Dev Center dashboard

Code your app for experimentation