使用Visual Studio 2013進行單元測試
1.開啟VS2013 --> 新建一個專案。這裡我們預設建立一個控制檯專案。取名為UnitTestDemo
2.在解決方案裡面新增一個單元測試專案。取名為UnitTestDemoTest
建立完畢後項目結構大概如下:
3.進入控制檯專案UnitTestDemo的Program類,建立一個Add方法。
namespace UnitTestDemo { class Program { static void Main(string[] args) { } public static int Add(intnum1, int num2) { return num1 + num2; } } }
4.我們的目的就是測試上面的Add方法執行是否正常,返回結果是否正確。
5.在單元測試專案中引用控制檯專案,引用完畢後項目結構如下:
6.單元測試專案裡面UnitTest1這個類的名字取得太難看了,我們把名字改為ProgramTest,表明這是在測試Program類。改完如下:
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespaceUnitTestDemoTest { [TestClass] public class ProgramTest { [TestMethod] public void TestMethod1() { } } }
7.上面就是VS為ProgramTest類預設生成的方法。可以看到ProgramTest具有一個【TestClass】特性,表明這是一個測試類。TestMethod1具有一個【TestMethod】特性,表明這是一個測試方法。
8.可以這樣理解,一個方法必須具有【TestMethod】特性,且其所屬的類具有【TestClass】特性,那麼這個方法才會被VS承認為一個【單元測試方法】。
如果沒有上面的兩個特性中的一個,編譯生成是沒有任何問題的。但是VS不會把其作為一個【單元測試方法】。
9.“VS不把一個方法作為【單元測試方法】”是什麼意思呢?
依次點選VS的選單欄【測試】--> 【視窗】-->【測試資源管理器】,可以開啟測試資源管理器。
10.測試資源管理器裡面會顯示當前解決方案裡面的所有單元測試。說明白點就是這裡只顯示符合【第8點】要求的方法。
你可能會說,為什麼上面的圖裡面什麼都沒顯示,【TestMethod】特性和TestClass】特性現在不是都有嗎?
原因是你還沒有生成程式集。OK,按F6.就可以看到【測試資源管理器】中顯示了【TestMethod1】:
11.我們要清楚我們建立單元測試的初衷:是用工具幫助我們測試軟體的質量、穩定性、效能等等。【VS】在這裡就充當了工具的作用。
12.回到命名的問題,很明顯TestMethod這個名字太難看了,我們把它改成AddTest表示這是在測試Add方法。
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace UnitTestDemoTest { [TestClass] public class ProgramTest { [TestMethod] public void AddTest() { } } }
13.截止目前,我們已經建立了一個可以執行的測試框架,雖然沒有起到什麼作用,但是測試已經可以執行了。
執行測試的方法之一是:右鍵點選需要測試的【單元測試】方法的名稱,選擇執行:
執行測試之後,可以在測試資源管理器中檢視測試的結果:
執行單元測試的方法有很多,這些需要我們在不斷的學習中去體會。
14.接下來我們做一點有意義的事情。改進AddTest方法:
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace UnitTestDemoTest { [TestClass] public class ProgramTest { [TestMethod] public void AddTest() { int num1 = 100; int num2 = 200; Assert.AreEqual(Program.Add(num1, num2), 300); } } }
在這之前,請把Program類的可見性改為internal或者Public。
?15.“Assert”之前沒接觸過單元測試的朋友,或者英語差點的可能不認識。上谷歌翻譯:
清楚的看到,“Assert”的意思是“斷言”。所以“Assert.AreEqual(Program.Add(num1, num2), 300);”這句話的意思就是:我斷言“Program.Add(num1, num2)”的結果就是300。
而斷言的正確與否只需要通過測試工具測試即可。如果測試通過說明此斷言是正確的,反之就說明這個測試失敗了。
斷言有很多種,包括上面普通的Assert,還有字串斷言,集合斷言等等。
16.ok,執行測試可以看到測試通過。
17.如果上面所說的你都明白,那麼到這裡為止,你可以自己編寫簡單的單元測試程式碼並執行測試了。
最後還有一個要說的就是,如果你覺得手動編寫單元測試類和方法太麻煩,那麼可以使用“Unit Test Generator”外掛幫助你生成單元測試和方法。
這樣你可以把重心偏到編寫測試邏輯上。
“Unit Test Generator”可以通過VS選單欄【工具】-->【擴充套件和更新】-->搜尋““Unit Test Generator””取得。
18.安裝“Unit Test Generator”需要重啟VS。
在需要進行單元測試的類和方法上點選右鍵,如圖操作(圖中演示的是生成單元測試方法)
點選之後會彈出一個對話方塊,需要你配置一個名稱的規則,配置好後點擊ok即可生成測試方法。
19.最後希望大家養成隨時測試程式碼的好習慣。
2、編寫測試方法
單元測試的基本方法是呼叫被測程式碼的函式,輸入函式的引數值,獲取返回結果,然後與預期測試結果進行比較,如果相等則認為測試通過,否則認為測試不通過。
1、Assert類的使用
Assert.Inconclusive() 表示一個未驗證的測試;
Assert.AreEqual() 測試指定的值是否相等,如果相等,則測試通過;
AreSame() 用於驗證指定的兩個物件變數是指向相同的物件,否則認為是錯誤
AreNotSame() 用於驗證指定的兩個物件變數是指向不同的物件,否則認為是錯誤
Assert.IsTrue() 測試指定的條件是否為True,如果為True,則測試通過;
Assert.IsFalse() 測試指定的條件是否為False,如果為False,則測試通過;
Assert.IsNull() 測試指定的物件是否為空引用,如果為空,則測試通過;
Assert.IsNotNull() 測試指定的物件是否為非空,如果不為空,則測試通過;
2、CollectionAssert類的使用
用於驗證物件集合是否滿足條件
StringAssert類的使用
用於比較字串。
StringAssert.Contains
StringAssert.Matches
StringAssert.tartWith
3、資料驅動的單元測試
資料驅動的單元測試是指單元測試的輸入資料遍歷一個數據源的所有行。從資料來源的沒一行讀入資料並傳入給測試方法使用
3.1、ACCESS資料驅動單元測試
1)開啟測試檢視視窗,選擇測試檢視
2)在測試檢視視窗中選擇需要配置成資料驅動方式的單元測試方法,然後按F4,開啟單元測試的屬性視窗
3)編輯“資料連線字串”屬性,在“屬性”視窗中單擊該屬性,然後單擊省略號 (…)。這將開啟“選擇資料來源”對話方塊,其中列出了若干個可能的資料來源,包括 ODBC、Microsoft SQL Server 和 Microsoft Access。選擇一個數據源後將開啟一個特定於該資料來源型別的對話方塊;可以使用此對話方塊配置該資料來源的連線屬性。配置完資料連線後,連線字串會作為“資料連線字串”的值出現。此字串還會作為單元測試方法的一個屬性儲存起來
4)在這個介面中,選擇一個Acess表data.mdb,單擊“確定”按鈕完成設定,回到“單元測試屬性”視窗。可以看到資料來源的已經設定好。
5)在建立與資料來源的連線之後,可以選擇一個數據表。當您單擊“屬性”視窗的值列中的下拉列表時,將會列出所連線的資料庫中的表。從此列表中選擇的表就是在執行單元測試時將檢索其中的行的表。與“資料連線字串”等其他屬性一樣,“資料表名稱”也會作為單元測試方法的一個屬性儲存起來。
6)在“資料訪問方法”,請選擇“順序”或“隨機”;預設值為“順序”。此設定表示從資料來源的表中檢索記錄的順序。
可以看到,在測試方法前面已經添加了一行:
7)資料來源的使用
通過 TestContext 類的 DataRow 和 DataConnection 屬性將資料提供給正在執行的單元測試。下面為使用TestContext 類的 DataRow屬性來讀入資料行
8)Acess資料來源中的表為
3.2、讀取Excel的方法:
1)在桌面新建一個txt檔案,更改檔名為data.dsn
2)選中“資料庫連線字串”,單擊右邊列的按鈕,更改資料來源為Microsoft ODBC資料來源,點選“確定”按鈕
3)選擇使用連線字串,點選生成
4)選擇Excel資料來源的驅動程式,點選“下一步”
5)選擇data.dsn為資料來源儲存檔案,一直選擇“下一步”。
6)在彈出的選擇工作簿中,選擇用例的輸入檔案data.txt,點選“確定”
7)選擇用例所在的Sheet頁,選擇“完成”
8)資料來源的使用程式碼
4、單元測試的執行
單元測試的執行有兩種方式:除錯和執行。可以像除錯普通程式碼一樣對單元測試程式碼進行除錯,當然也可以直接執行,單元測試的結果將在“測試結果”介面中展示,雙擊測試結果,可以得到測試結果的詳細資訊。單元測試的程式碼覆蓋率可以在“程式碼覆蓋率結果”介面中展示。
5、附加測試屬性
“附加測試屬性”。預設都是被註釋掉的,只要我們取消註釋就可以使用了。這個功能的加入,很大程度上是為了增加測試的靈活性。具體的屬性有:
[ClassInitialize()]在執行類的第一個測試前先執行程式碼
[ClassCleanup()]在執行完類中的所有測試後再執行程式碼
[TestInitialize()]在執行每個測試前先執行程式碼
[TestCleanup()]在執行完每個測試後執行程式碼
如在執行測試時,將測試執行時間輸入到日誌中