[UWP] 對應用進行A/B測試

来源:http://www.cnblogs.com/arcsinw/archive/2016/04/08/5361833.html
-Advertisement-
Play Games

【對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.設置好自己的開發機

 【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.

snip_20160406220004

 

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

 

screenshot-developer.microsoft.com 2016-04-07 22-15-27

 

然後是變體和設置

這裡設置了兩個變體 一個是Translate,代表顯示翻譯按鈕,另一個NoTranslate代表不顯示翻譯按鈕。

下方的三個輸入框 分別填 設置名(可以理解成變數名)  變體1該設置的值 變體2該設置的值

值可以填String、Integer、Double、Boolean類型的,在寫代碼的時候有對應的方法直接獲取

snip_20160406215833

 

填完之後點保存,然後再點激活,Dev Center里的設置就完成了,下麵開始敲代碼

 

【應用內編寫代碼】

  1. 首先添加Microsoft Store Engagement SDK的引用
  2. 在項目的引用上右鍵單擊 選擇添加引用

snip_20160406222416

 

然後就可以敲代碼了,這個很明顯要在各個頁面中使用,所以寫成一個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.

snip_20160407193339

 

做完上面的步驟之後,就可以開始等了,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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大家可以通過谷歌瀏覽器以網易網站做為範例,通過網站頂部的導航菜單欄來查看relative和aboulute的區別 CSS的很多其他屬性大多容易理解,比如字體,文本,背景等。有些CSS書籍也會對 這些簡單的屬性進行大張旗鼓的介紹,而偏偏忽略了對一些難纏的屬性講解,有避重就輕的嫌疑。CSS中主要難以理解 ...
  • 在jQuery1.9版本中,已經去掉了live和delegate方法,從而將on方法的地位進一步提升。 jQuery如此推崇on方法,必有其牛逼的地方。那麼我們就有必要瞭解這個on,併在代碼中利用它,從而優化代碼和提高性能。 註:在jQuery1.7後,on方法就可以全面綁定任何事件了。 .on( ...
  • 標題取自《css禪意花園》一書,還記得當年讀此書時的情景,真的是內容和書名一樣的優秀,就以此標題作為自己在該文的一種追求吧,儘管我的水平和見解都和Dave Shea相去甚遠。該文算是對前兩年寫頁面工作的總結吧,現在比較少關註css了,可能觀點有狹隘的地方,同時文中也有一定的思考和理解,也許並不一定特 ...
  • 今天開始記錄每天所學的重點,為了加深印象也為了今後的複習。 今天學習的重點是引用類型中Array類型,Array類型中的棧方法,隊列方法,重排序方法,操作方法,位置方法,迭代方法,歸併方法。這幾個方法我感覺尤為重要,因此記錄下來,以便忘記了可以回顧。 (一)棧方法 首先要知道的是棧是一種後進先出的數 ...
  • 一、事件編程 1、基本事件(以方法形式存在的) 基本語法: 原生Javascript代碼中的事件綁定方式: DOM對象.事件 = 事件的處理程式 jQuery代碼中的事件綁定方式: jQuery對象.事件(事件處理程式) 2、常用的事件列表 blur(fn) :當失去焦點時觸發 change(fn)... ...
  • 第一章 1、 郵箱地址的URL地址包括:mailto:+郵箱地址 2、 ../表示向上走一級,開頭直接使用/表示根目錄 第三章 1、 <header>: role = “banner”【 適用於頁面級的頁眉】 2、 <nav>標記導航: role = “navigation”不是必須的,提高可訪問性 ...
  • 4月7日學到的知識點: 一:<img src="1.png" alt="美女"/> alt是給圖片添加介紹,當圖片沒載入出來時,會直接顯示alt的值,在搜索引擎搜索時也可以讓搜索引擎更好的找到這張圖。 二:<a href="css2.ppt">標簽下載</a> 當href的值是一個文件名或者壓縮包時 ...
  • 性能優化一直是前端工作中十分重要的一環,都說從 10 到 1 容易,從 1 到 0 很難。而隨著前端技術的飛速發展,沒有什麼技術或者法則是金科玉律一成不變的。 很佩服那些勇於挑戰權威,推陳出新的勇者,是他們讓我們的技術不斷的變革更加的卓越。好像扯遠了,本文主要想談談兩個名詞,功能變數名稱發散和功能變數名稱收斂。 域 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...