所謂的單元測試(Unit Test),就是對軟體的一些子產品進行測試以檢查其正确性和可靠性,這些子產品可以是一個類或者是一個方法等。在Visual studio中,這十分容易實作。
打開Visual studio,檔案->建立->項目,在此示範的是為通用Windows平台建立單元測試,是以展開Visual C#->Windows->通用->單元測試應用(通用Windows)。如圖,
這裡單元測試的項目名為UnitTest4Demo
建立完成後,為了使條理清晰,我們在解決方案中建立一個類庫(ClassLibrary),将要測試的方法放在類庫中,而UnitTest4Demo調用放在類庫中的待測試方法。
右擊解決方案->添加->建立項目->類庫(通用Windows),如圖
類庫取名為ClassLibrary4Test
建立完成後,解決方案管理器裡應類似下圖
剛剛已經說了,類庫裡面放待測試方法,UnitTest4Demo負責調用并測試類庫中的方法,是以UnitTest4Demo應引用ClassLibrary4Test。右擊UnitTest4Demo下的引用->添加引用->勾選ClassLibrary4Test,如圖
确定後,UnitTest4Demo下的引用應類似下圖,注意:紅線的部分就是剛剛添加的對類庫的引用
現在,在類庫ClassLirary4Test中的Class1.cs中寫個方法,簡單起見,就讓這個方法傳回個0
1 public class Class1
2 {
3 public static int ReturnZero()
4 {
5 return 0;
6 }
7 }
接着,在UnitTest4Demo中UnitTest.cs中的TestMethod1方法中調用此函數,如圖
在這個UnitTest1類中,第一點,我們注意到UnitTest1被添加了TestClass屬性類,方法TestMethod1被添加了TestMethod屬性類,這就是用來單元測試的類和函數與一般的類和函數不同之處,這就告訴了Visual Studio我這個函數是用來測試的,Visual Studio就會将這個帶有TestClass屬性的類下的,帶有TestMethod屬性的方法放到測試資料總管中(測試資料總管展開方法:菜單欄->測試->視窗->測試資料總管)
第二點就是這個函數裡面就寫了一句話,Assert是用于單元測試“斷言”的類,即我輸入一些參數(當然此示例沒有輸入參數),如果方法運作正确我“斷言”應得到的結果,如果不符,Visula studio在測試後會給出相關的資訊,這就達到了測試的效果。當然這個類有很多的重載,參見MSDN:Assert類
我們會注意到,此時測試資料總管空空如也,并沒有TestMehod1方法,這是我們沒有生成解決方法的原因,現在生成解決方案:菜單欄->生成->生成解決方案
生成之後,測試資料總管中會出現TestMehod1方法,如圖
下面執行測試,右擊測試單元管理器中的TestMethod1->運作標明的測試
稍等片刻,将會出現通過測試。
至此,一個簡單的單元測試完成了。
你可以在單元測試中測試更多,更複雜的方法,下面就展示一個稍微複雜一些的用于測試通用應用的網絡通信的示例。
在ClassLibrary4Test類庫中建立一個HttpHelper類,類中寫個用于Get請求的方法。
1 public class HttpHelper
2 {
3 /// <summary>
4 /// Send Get request and retrieve the response as a string
5 /// </summary>
6 /// <param name="url">url</param>
7 /// <returns>response</returns>
8 public static async Task<string> SendGetRequest(string url)
9 {
10 HttpClient httpClient = new HttpClient();
11 Uri uri = new Uri(url);
12 HttpResponseMessage response = new HttpResponseMessage();
13 string httpResonseBody = string.Empty;
14 try
15 {
16 response = await httpClient.GetAsync(uri);
17 response.EnsureSuccessStatusCode();
18 httpResonseBody = await response.Content.ReadAsStringAsync();
19 }
20 catch
21 { }
22 return httpResonseBody;
23 }
24 }
在UnitTest4Demo的UnitTest.cs中新寫個方法TestMothod_Http,調用剛寫的SendGetRequest方法。
1 [TestMethod]
2 public async Task TestMethod_Http()
3 {
4 string url = "http://mywebapidemo.azurewebsites.net/api/Default";
5 string response = await HttpHelper.SendGetRequest(url);
6 Assert.AreEqual("Hello,World!", response.Replace(""", ""));
7
8 }
生成解決方案,和剛剛一樣,測試資料總管中在生成會出現TestMethod_Http,測試之,可以順利通過測試。