[UWP] 对应用进行A/B测试
【对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密钥上方的新实验

输入实验名称
下面的测试实验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.

查看事件名称是用来向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.

然后是变体和设置
这里设置了两个变体 一个是Translate,代表显示翻译按钮,另一个NoTranslate代表不显示翻译按钮。
下方的三个输入框 分别填 设置名(可以理解成变量名) 变体1该设置的值 变体2该设置的值
值可以填String、Integer、Double、Boolean类型的,在写代码的时候有对应的方法直接获取

填完之后点保存,然后再点激活,Dev Center里的设置就完成了,下面开始敲代码
【应用内编写代码】
- 首先添加Microsoft Store Engagement SDK的引用
- 在项目的引用上右键单击 选择添加引用

然后就可以敲代码了,这个很明显要在各个页面中使用,所以写成一个Helper类
LogTranslateViewed在页面加载的时候调用,LogTranslateClick在翻译按钮点击时调用
public static class ExperimentHelper
{ #region const strings
private const string API_KEY = "Your Key Here"; public const string TranslateButtonVisibility = "TranslateButtonVisibility"; private const string UseTranslateButton = "useTranslateButton"; private const string ViewEventName = "userViewedTranslateButton";
#endregion private static ExperimentClient experimentClient; private static ExperimentVariation variation; private static ExperimentVariationResult result; static ExperimentHelper()
{
experimentClient = new ExperimentClient(API_KEY);
} /// <summary>
/// 获取变量
/// </summary>
private static async void GetExperimentVariation()
{
result = await experimentClient.GetVariationAsync();
variation = result.Variation;
} /// <summary>
/// 检查变量是否需要更新
/// </summary>
private static void CheckVariationUpdate()
{
if (result.ErrorCode != EngagementErrorCode.Success || result.Variation.NeedsRefresh)
{
UpdateExperimentVariation();
}
} /// <summary>
/// 更新变量
/// </summary>
private static async void UpdateExperimentVariation()
{
result = await experimentClient.RefreshVariationAsync();
if (result.ErrorCode == EngagementErrorCode.Success)
{
variation = result.Variation;
}
} /// <summary>
/// 获取int类型变量
/// </summary>
/// <param name="name">变量设置名称</param>
/// <param name="defaultValue">默认值</param>
/// <returns></returns>
public static int GetInt(string name, int defaultValue)
{
CheckVariationUpdate();
return variation.GetInteger(name, defaultValue);
} public static bool GetBool(string name,bool defaultValue)
{
CheckVariationUpdate();
return variation.GetBoolean(name, defaultValue);
} public static double GetDouble(string name,double defaultValue)
{
CheckVariationUpdate();
return variation.GetDouble(name, defaultValue);
} public static string GetString(string name,string defaultValue)
{
CheckVariationUpdate();
return variation.GetString(name, defaultValue);
} /// <summary>
/// 向Dev Center写日志
/// </summary>
public static void LogEventToDevCenter(string eventName,ExperimentVariation variation)
{
StoreServicesCustomEvents.Log(eventName, variation);
} /// <summary>
/// 翻译按钮点击
/// </summary>
public static void LogTranslateClick()
{
LogEventToDevCenter(UseTranslateButton, variation);
} /// <summary>
/// 用户看到翻译按钮
/// </summary>
public static void LogTranslateViewd()
{
LogEventToDevCenter(ViewEventName, variation);
}
}
ExperimentHelper.cs
我的应用使用了MVVM,所以在vm里加一个属性IsTranslateVisible
/// <summary>
/// 翻译按钮显示
/// </summary>
public bool IsTranslateVisible
{
get
{
return ExperimentHelper.GetBool(ExperimentHelper.TranslateButtonVisibility,false);
}
}
翻译按钮是否显示
然后把这个属性绑定到UI上就完成了(当然要使用一个Converter,太简单就不说了)
【运行应用收集数据】
把应用Run起来,看看我的翻译按钮是不是显示的,有种抽奖的感觉,我的pc端和模拟器分到了不同的变体,一个有翻译按钮,一个没有
获取更新的变量需要一点时间
Note that it may take up to two minutes for your app to receive an updated variation assignment.

做完上面的步骤之后,就可以开始等了,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
[UWP] 对应用进行A/B测试的更多相关文章
- 2019-11-25-加强版在国内分发-UWP-应用正确方式-通过win32安装UWP应用
原文:2019-11-25-加强版在国内分发-UWP-应用正确方式-通过win32安装UWP应用 title author date CreateTime categories 加强版在国内分发 UW ...
- C#单元测试面面观
标题有点标题党,但相信各位看完这篇文章一定会所收获,如果之前没有接触过单元测试或了解不深通过本文都能对单元测试有个全新认识.本文的特点是不脱离实际,所测试的代码都是常见的模式. 写完这篇文章后,我看了 ...
- xamarin.forms uwp app部署到手机移动设备进行测试,真机调试(device portal方式部署)
最近学习xamarin.刚好 手上有一个lumia 930.所以试一试把uwp app部署到手机上,并真机调试一把. 目前环境: 1.开发pc电脑是win10,版本1607.加入了insider,所以 ...
- UWP简单测试
随便写下,试试.Net Core与UWP开发,后台WCF XAML <Page x:Class="App3.MainPage" xmlns="http://sche ...
- UWP中实现自定义标题栏
UWP中实现自定义标题栏 0x00 起因 在UWP开发中,有时候我们希望实现自定义标题栏,例如在标题栏中加入搜索框.按钮之类的控件.搜了下资料居然在一个日文网站找到了一篇介绍这个主题的文章: http ...
- MVVM框架从WPF移植到UWP遇到的问题和解决方法
MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...
- UWP学习目录整理
UWP学习目录整理 0x00 可以忽略的废话 10月6号靠着半听半猜和文字直播的补充看完了微软的秋季新品发布会,信仰充值成功,对UWP的开发十分感兴趣,打算后面找时间学习一下.谁想到学习的欲望越来越强 ...
- UWP开发之Mvvmlight实践七:如何查找设备(Mobile模拟器、实体手机、PC)中应用的Log等文件
在开发中或者后期测试乃至最后交付使用的时候,如果应用出问题了我们一般的做法就是查看Log文件.上章也提到了查看Log文件,这章重点讲解下如何查看Log文件?如何找到我们需要的Packages安装包目录 ...
- UWP开发之Mvvmlight实践六:MissingMetadataException解决办法(.Net Native下Default.rd.xml配置问题)
最近完成一款UWP应用,在手机端测试发布版(Release)的时候应用莫名奇妙的强行关闭,而同样的应用包在PC端一点问题都没有,而且Debug版在两个平台都没有问题,唯独手机的Release版有问题. ...
随机推荐
- 经典的一款jQuery soChange幻灯片
soChange一款多很经典的幻灯片的jQuery插件. 实例预览 引入文件 <link rel="stylesheet" type="text/css" ...
- ios新手开发——toast提示和旋转图片加载框
不知不觉自学ios已经四个月了,从OC语法到app开发,过程虽然枯燥无味,但是结果还是挺有成就感的,在此分享我的ios开发之路中的小小心得~废话不多说,先上我们今天要实现的效果图: 有过一点做APP经 ...
- FineReport制作可动态展开的组织递归树报表
先看看效果: 报表软件:FineReport 1.分析-与正常查询的对比 如果不做这种树状结构展开的报表的话,正常的SQL应该是这样写的,以单据表为例,假设单据的机构为分公司,经营部 select 分 ...
- ArcGIS Engine开发前基础知识(4)
ArcGIS不同开发方式的比较 关于GIS应用软件的开发,通常有三种方式:C/S架构.网络GIS和移动GIS.ArcGIS平台提供了对三种开发方式的支持,对于采用从C/S架构的大多数开发者来讲,首先想 ...
- Android 弱引用和软引用
软引用 和 弱引用 1. SoftReference<T>:软引用-->当虚拟机内存不足时,将会回收它指向的对象:需要获取对象时,可以调用get方法. 2. WeakRefere ...
- 第三方开源库和jar包的区别
jar包和第三方开源库的根本区别在于,开源库的功能比jar包功能更强大,通过引入库项目可以访问java文件以及该开源库项目下的资源文件,例如图片,layout等文件 jar包中只能放class文件 引 ...
- TFFS格式化到创建成功过程
True FFS内核编程 1.格式化FLASH 即使FLASH没有和块设备驱动绑定,也可对其进行格式化. tffsDevFormat (int tffsDriveNo, int formatArg); ...
- Linux常见查看硬件信息指令
CPUlscpu 查看的是CPU的统计信息./proc/cpuinfo 查看每个cpu信息,如每个CPU的型号,主频等. 内存free -m 概要查看内存情况cat /proc/meminfo 查看内 ...
- 利用SQL Server 2008 R2创建自动备份计划
本文主要利用SQL Server 2008 R2自带的"维护计划"创建一个自动备份数据的任务. 首先,启动 Sql Management studio,确保"SQL Se ...
- MySql踩坑总结
衣带渐宽终不悔,为伊消得人憔悴,众里寻他千百度,蓦然回首,那人却在灯火阑珊处好通顺的句子哈哈 转了那么多弯,才明白问题就在一个地方.睡觉之前想明白了问题,还是经验太少.王国维的治学三境界: 昨夜西风凋 ...