Visual Studio 2010運行和定義單元測試
在VS2010中,單元測試的功能很強大,使得建立單元測試和編寫單元測試代碼,以及管理和運行單元測試都變得簡單起來,通過私有訪問器可以對私有方法也能進行單元測試,並且支持數據驅動的單元測試。
1、建立單元測試項目
1.1、從被測試代碼生成單元測試
1)實例:創建VC#模式下的控制檯應用程序,工程名爲CUnitTest
2)輸入簡單的加、減、乘、除函數代碼,如下圖所示
- namespace CUnitTest
- {
- class Program
- {
- public int Add(int a, int b)
- {
- return a + b;
- }
- public int Dec(int a, int b)
- {
- return a - b;
- }
- public int Mul(int a, int b)
- {
- return a * b;
- }
- public int Div(int a, int b)
- {
- return a / b;
- }
- static void Main(string[] args)
- {
- }
- }
- }
3)可按如下步驟建立單元測試
(1)在Add方法體內,單擊鼠標右鍵,在菜單中選擇“創建單元測試”,就能把一個類的測試代碼的外殼都自動寫好。
(2)在出現的“創建單元測試”界面中,Add方法被自動勾上,表示要爲這個方法創建單元測試代碼的基本框架,單擊確定按鈕
(3)點擊確定後,在新建測試項目中,輸入需要創建的單元測試的新項目的名稱,然後單擊“創建”按鈕,則自動創建一個新的單元測試代碼項目。
(4)在“解決檔案資源管理器”中可以看到多了一個“AddTest”項目,可以看出“AddTest”項目引用了被測項目的程序集,和單元測試框架Microsoft.VisualStudio.QualityTools.UnitTestFrame,並且自動產生兩個C#代碼文件AssemblyInfo.cs和ProgramTest.cs
(5)ProgramTest.cs的代碼如下圖所示,從圖中可以看到,自動產生了一個“ProgramTest”類,並使用[TestClass()]標識爲一個單元測試類,以及一個“AddTest”測試方法,。並用[TestMethod()]標識。
- using CUnitTest;
- using Microsoft.VisualStudio.TestTools.UnitTesting;
- using System;
- namespace AddTest
- {
- /// <summary>
- ///這是 ProgramTest 的測試類,旨在
- ///包含所有 ProgramTest 單元測試
- ///</summary>
- [TestClass()]
- public class ProgramTest
- {
- private TestContext testContextInstance;
- /// <summary>
- ///獲取或設置測試上下文,上下文提供
- ///有關當前測試運行及其功能的信息。
- ///</summary>
- public TestContext TestContext
- {
- get
- {
- return testContextInstance;
- }
- set
- {
- testContextInstance = value;
- }
- }
- #region 附加測試特性
- //
- //編寫測試時,還可使用以下特性:
- //
- //使用 ClassInitialize 在運行類中的第一個測試前先運行代碼
- //[ClassInitialize()]
- //public static void MyClassInitialize(TestContext testContext)
- //{
- //}
- //
- //使用 ClassCleanup 在運行完類中的所有測試後再運行代碼
- //[ClassCleanup()]
- //public static void MyClassCleanup()
- //{
- //}
- //
- //使用 TestInitialize 在運行每個測試前先運行代碼
- //[TestInitialize()]
- //public void MyTestInitialize()
- //{
- //}
- //
- //使用 TestCleanup 在運行完每個測試後運行代碼
- //[TestCleanup()]
- //public void MyTestCleanup()
- //{
- //}
- //
- #endregion
- /// <summary>
- ///Add 的測試
- ///</summary>
- [TestMethod()]
- public void AddTest()
- {
- Program target = new Program(); // TODO: 初始化爲適當的值
- int a = 0; // TODO: 初始化爲適當的值
- int b = 0; // TODO: 初始化爲適當的值
- int expected = 0; // TODO: 初始化爲適當的值
- int actual;
- actual = target.Add(a, b);
- Assert.AreEqual(expected, actual);
- //Assert.Inconclusive("驗證此測試方法的正確性。");
- }
- /// <summary>
- ///Dec 的測試
- ///</summary>
- [TestMethod()]
- public void DecTest()
- {
- Program target = new Program(); // TODO: 初始化爲適當的值
- int a = 0; // TODO: 初始化爲適當的值
- int b = 0; // TODO: 初始化爲適當的值
- int expected = 0; // TODO: 初始化爲適當的值
- int actual;
- actual = target.Dec(a, b);
- Assert.AreEqual(expected, actual);
- //Assert.Inconclusive("驗證此測試方法的正確性。"); //<span style="color:black;">語句是默認添加的,意思是這個方法是</span><span style="color:black;">Visual Studio</span><span style="color:black;">自動創建,運行前自刪除或註釋此句,否則運行結果無法通過。</span>
- }
- }
- }
(6)ProgramTest.cs代碼文件詳講
[TestMethod()]:說明了以下代碼是一個測試用例
Int a = 0; // TODO: 初始化爲適當的值
int b = 0; // TODO: 初始化爲適當的值
這兩句是被測函數的輸入參數,需要我們去修改它的值,也就是我們輸入測試用例的地方。
double expected = 0; // TODO:初始化爲適當的值
double actual;
這兩句話淺顯易懂,前一句話是定義了期望值和對它進行初始化,後一句話是定義了實際值。默認Assert.AreEqual(expected, actual);Assert在這裏可以理解成斷言:在VSTS裏做單元測試是基於斷言的測試。默認代碼中Assert.Inconclusive表明這是一個未經驗證的單元測試。在實際的程序中可以註釋掉。