Visual Studio 2010單元測試(普通單元測試)

Visual Studio 2010運行和定義單元測試

VS2010中,單元測試的功能很強大,使得建立單元測試和編寫單元測試代碼,以及管理和運行單元測試都變得簡單起來,通過私有訪問器可以對私有方法也能進行單元測試,並且支持數據驅動的單元測試。

1、建立單元測試項目

1.1、從被測試代碼生成單元測試

1)實例:創建VC#模式下的控制檯應用程序,工程名爲CUnitTest

2)輸入簡單的加、減、乘、除函數代碼,如下圖所示

[csharp] view plaincopy
  1. namespace CUnitTest  
  2. {  
  3.     class Program  
  4.     {  
  5.         public int Add(int a, int b)  
  6.         {  
  7.             return a + b;  
  8.         }  
  9.         public int Dec(int a, int b)  
  10.         {  
  11.             return a - b;  
  12.         }  
  13.         public int Mul(int a, int b)  
  14.         {  
  15.             return a * b;  
  16.         }  
  17.         public int Div(int a, int b)  
  18.         {  
  19.             return a / b;      
  20.         }  
  21.         static void Main(string[] args)  
  22.         {  
  23.         }  
  24.     }  
  25. }  


3)可按如下步驟建立單元測試

 1)在Add方法體內,單擊鼠標右鍵,在菜單中選擇“創建單元測試”,就能把一個類的測試代碼的外殼都自動寫好。

(2)在出現的“創建單元測試”界面中,Add方法被自動勾上,表示要爲這個方法創建單元測試代碼的基本框架,單擊確定按鈕

3)點擊確定後,在新建測試項目中,輸入需要創建的單元測試的新項目的名稱,然後單擊“創建”按鈕,則自動創建一個新的單元測試代碼項目。

4)在“解決檔案資源管理器”中可以看到多了一個“AddTest”項目,可以看出“AddTest”項目引用了被測項目的程序集,和單元測試框架Microsoft.VisualStudio.QualityTools.UnitTestFrame,並且自動產生兩個C#代碼文件AssemblyInfo.csProgramTest.cs

5ProgramTest.cs的代碼如下圖所示,從圖中可以看到,自動產生了一個“ProgramTest”類,並使用[TestClass()]標識爲一個單元測試類,以及一個“AddTest”測試方法,。並用[TestMethod()]標識。

[csharp] view plaincopy
  1. using CUnitTest;  
  2. using Microsoft.VisualStudio.TestTools.UnitTesting;  
  3. using System;  
  4. namespace AddTest  
  5. {  
  6.       
  7.       
  8.     /// <summary>  
  9.     ///這是 ProgramTest 的測試類,旨在  
  10.     ///包含所有 ProgramTest 單元測試  
  11.     ///</summary>  
  12.     [TestClass()]  
  13.     public class ProgramTest  
  14.     {  
  15.   
  16.         private TestContext testContextInstance;  
  17.   
  18.         /// <summary>  
  19.         ///獲取或設置測試上下文,上下文提供  
  20.         ///有關當前測試運行及其功能的信息。  
  21.         ///</summary>  
  22.         public TestContext TestContext  
  23.         {  
  24.             get  
  25.             {  
  26.                 return testContextInstance;  
  27.             }  
  28.             set  
  29.             {  
  30.                 testContextInstance = value;  
  31.             }  
  32.         }  
  33.  
  34.         #region 附加測試特性  
  35.         //   
  36.         //編寫測試時,還可使用以下特性:  
  37.         //  
  38.         //使用 ClassInitialize 在運行類中的第一個測試前先運行代碼  
  39.         //[ClassInitialize()]  
  40.         //public static void MyClassInitialize(TestContext testContext)  
  41.         //{  
  42.         //}  
  43.         //  
  44.         //使用 ClassCleanup 在運行完類中的所有測試後再運行代碼  
  45.         //[ClassCleanup()]  
  46.         //public static void MyClassCleanup()  
  47.         //{  
  48.         //}  
  49.         //  
  50.         //使用 TestInitialize 在運行每個測試前先運行代碼  
  51.         //[TestInitialize()]  
  52.         //public void MyTestInitialize()  
  53.         //{  
  54.         //}  
  55.         //  
  56.         //使用 TestCleanup 在運行完每個測試後運行代碼  
  57.         //[TestCleanup()]  
  58.         //public void MyTestCleanup()  
  59.         //{  
  60.         //}  
  61.         //  
  62.         #endregion  
  63.   
  64.   
  65.         /// <summary>  
  66.         ///Add 的測試  
  67.         ///</summary>  
  68.         [TestMethod()]  
  69.         public void AddTest()  
  70.         {  
  71.             Program target = new Program(); // TODO: 初始化爲適當的值  
  72.             int a = 0; // TODO: 初始化爲適當的值  
  73.             int b = 0; // TODO: 初始化爲適當的值  
  74.             int expected = 0; // TODO: 初始化爲適當的值  
  75.             int actual;  
  76.             actual = target.Add(a, b);  
  77.             Assert.AreEqual(expected, actual);  
  78.             //Assert.Inconclusive("驗證此測試方法的正確性。");  
  79.         }  
  80.   
  81.         /// <summary>  
  82.         ///Dec 的測試  
  83.         ///</summary>  
  84.         [TestMethod()]  
  85.         public void DecTest()  
  86.         {  
  87.             Program target = new Program(); // TODO: 初始化爲適當的值  
  88.             int a = 0; // TODO: 初始化爲適當的值  
  89.             int b = 0; // TODO: 初始化爲適當的值  
  90.             int expected = 0; // TODO: 初始化爲適當的值  
  91.             int actual;  
  92.             actual = target.Dec(a, b);  
  93.             Assert.AreEqual(expected, actual);  
  94.             //Assert.Inconclusive("驗證此測試方法的正確性。"); //<span style="color:black;">語句是默認添加的,意思是這個方法是</span><span style="color:black;">Visual Studio</span><span style="color:black;">自動創建,運行前自刪除或註釋此句,否則運行結果無法通過。</span>  
  95.         }  
  96.     }  
  97. }  


6ProgramTest.cs代碼文件詳講

[TestMethod()]:說明了以下代碼是一個測試用例

Int a = 0; // TODO: 初始化爲適當的值

int b = 0; // TODO: 初始化爲適當的值

這兩句是被測函數的輸入參數,需要我們去修改它的值,也就是我們輸入測試用例的地方。

double expected = 0; // TODO:初始化爲適當的值

double actual;

      這兩句話淺顯易懂,前一句話是定義了期望值和對它進行初始化,後一句話是定義了實際值。默認Assert.AreEqual(expected, actual);Assert在這裏可以理解成斷言:在VSTS裏做單元測試是基於斷言的測試。默認代碼中Assert.Inconclusive表明這是一個未經驗證的單元測試。在實際的程序中可以註釋掉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章