【對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密鑰上方的新實驗
輸入實驗名稱
下麵的測試實驗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在翻譯按鈕點擊時調用
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
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.
做完上面的步驟之後,就可以開始等了,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