Microsoft的開發平台VSTS(Visual Studio Team System) 整合了單元測試架構(Team Test),即:
VSTS單元測試。 它支援:
1. 產生測試代碼架構;
2. 在IDE中運行測試;
3. 支援從資料庫中載入資料的測試;
4. 測試回合完成後,進行程式碼分析覆蓋。
使用VSTS寫單元測試的步驟如下:
1. 建立測試;
2. 編寫測試;
3. 運行測試;
4. 代碼覆蓋。
1. 建立測試
開啟解決方案中的.cs類檔案(如:StudentManager),在其中的一個方法(如:AddStudent() )上右擊,選擇“建立單元測試”命令。
在彈出的“建立單元測試”對話方塊中的“輸出項目”下拉框中選擇“建立新的Visual C# 測試專案”,單擊“確定”按鈕,並在“建立測試專案”對話方塊中輸入測試專案的名稱(如:MySchoolTest),單擊“建立”按鈕後,就看見在原有的解決方案中產生了一個新的項目“MySchoolTest”。
測試專案建立成功後,會同時產生4個與測試相關的檔案:
AuthoringTest.txt 提供建立測試的說明,包括向項目增加其他測試的說明;
StudentManagerTest.cs 包含AddStudent()的測試,以及測試初始化和測試清除的方法;
MySchoolPro.vsmdi 測試管理檔案;
localtestrun.testrunconfig 本地測試回合設定檔。
2. 編寫測試
建立測試完畢後,VSTS 為我們自動產生的只是一個測試架構,預設代碼中Assert.Inconclusive 表明這是一個未經驗證的單元測試。
開啟產生的測試檔案“StudentManagerTest.cs”, 如樣本1:
[TestMethod]
public void AddStudentTest()
{
global::MySchool.BLL.StudentManager target = new
global::MySchool.BLL.StudentManager();
// TODO:初始化為適當的值
global::MySchool.Models.Student student = null;
string expected = null;
string actual;
actual = target.AddStudent(student);
Assert.AreEqual(expected, actual,
"MySchool.BLL.StudentManager.AddStudent 未返回所需的值。");
Assert.Inconclusive("驗證此測試方法的正確性。");
}
單元測試中,幾個變數的簡單介紹:
target 表示測試目標對象,通過這個目標對象可以測試該類中的各個方法;
expected 表示期望得到的值;
actual 表示實際得到的值;
單元測試中,常用的斷言方法介紹:
Assert.AreEqual() 測試指定的值是否相等,如果相等,則測試通過;
Assert.Inconclusive() 表示一個未驗證的測試;
Assert.IsTrue() 測試指定的條件是否為True,如果為True,則測試通過;
Assert.IsFalse() 測試指定的條件是否為False,如果為False,則測試通過;
Assert.IsNull() 測試指定的對象是否為空白引用,如果為空白,則測試通過;
Assert.IsNotNull() 測試指定的對象是否為非空,如果不為空白,則測試通過;
我們通過對樣本1 添加測試所需的初始值,並對斷言進行簡單的修改後,便得到一個正式的單元測試。
如樣本2:
[TestMethod]
public void AddStudentTest()
{
global::MySchool.BLL.StudentManager target = new
global::MySchool.BLL.StudentManager();
// TODO:初始化為適當的值
global::MySchool.Models.Student student = new
global::MySchool.Models.Student(); // 修改1
student.LoginId = "003";
student.LoginPwd = "test003";
student.UserStateId = 1;
student.studentName = "test003";
student.studentNo = "test003";
student.Sex = "男";
student.ClassID = 1;
string expected = "學員帳戶建立成功!"; //修改2
string actual;
actual = target.AddStudent(student);
Assert.AreEqual(expected, actual,
"MySchool.BLL.StudentManager.AddStudent 未返回所需的值。");
// Assert.Inconclusive("驗證此測試方法的正確性。");
}
這樣,便得到了一個正式的單元測試。用斷言Assert.AreEqual()比較expected、actual是否相等。
如果相等,測試通過。
設定檔中的設定
由於我們的測試需要和資料庫打交道,並且資料庫的連接字串是從設定檔中讀取的,所以我們需要在測試專案中添加設定檔(app.config)。
如樣本3:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
//資料庫連接字串設定
<add name="DataBaseOwner" connectionString="dbo" />
<add name="MySchoolConnectionString"
connectionString=" Data Source=.; Initial Catalog=MySchool;
User ID=sa; Password=123456 "
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
3. 運行測試
開啟包含有測試專案的解決方案,在 工具列 就會出現與測試專案相關的 操作按鈕欄。
我們要運行項目中的測試,只需要運行測試專案。
測試專案的運行方式有兩種:
運行,並啟動調試功能;
運行,但不啟動調試功能;
1. 當我們運行測試後,在“測試結果”視窗中,將列出項目中所有的測試。
2. 開始的時候,測試會處於“掛起”的狀態,測試回合的結果是“通過”或者“失敗”。
3. 如果我們要查看測試結果的額外細節時,選定測試項並雙擊,便開啟了詳細資料視窗。
4. 代碼覆蓋
代碼覆蓋是單元測試的一個關鍵計量。
代碼覆蓋:是指單元測試運行時,覆蓋了多少代碼。
Team Test 包含了一個代碼覆蓋工具,可以詳細解釋被執行代碼的覆蓋率,並反白哪些代碼被執行,哪些代碼沒有被執行。
注意: VSTS 在產生單元測試架構時,預設沒有啟用“代碼覆蓋”功能。
啟用此功能的辦法:
1. 首先開啟“本地測試回合設定檔” localtestrun.testrunconfig ,在解決方案中。
2. 雙擊“localtestrun.testrunconfig”檔案,彈出該對話方塊視窗。
3. 在其對話方塊視窗的左側選擇“程式碼涵蓋範圍”,然後在右側的“要檢測的項目”中選擇要檢測的項目。
4. 單擊“應用”按鈕。
當我們啟用了代碼覆蓋功能後,再次運行單元測試時:
在“程式碼涵蓋範圍結果”視窗中,選中“AddStudent()”雙擊,便可查看程式碼涵蓋範圍。
在“程式碼涵蓋範圍結果”視窗中,我們還可以查看單元測試中代碼覆蓋的塊數,以及代碼覆蓋的百分比資訊。