在 MSTestEnhancer 的幫助下,單元測試將更加容易編寫、理解和維護。因為它讓單元測試方法和被測類本身之間的關係更加緊密。
- 在單元測試項目中安裝 NuGet 包:MSTestEnhancer。
- 現在就可以開始編寫下文那種風格的單元測試代碼了。
假設你希望測試一個名為 被測類名
的類,其中包含一個名為 被測方法名
的方法。你可以這樣編寫單元測試:
[TestClass]
public class 被測類名Test
{
[ContractTestCase]
public void 被測方法名()
{
"契約 1(當 Xxx 時,應該發生 Yyy)".Test(() =>
{
// 測試用例代碼
});
"契約 2(但當 Zzz 時,應該發生 Www)".Test(() =>
{
// 測試用例代碼
});
}
}
注意到單元測試類的名稱和原本的類名稱是一一對應的,方法名和原本的方法名是一模一樣的;於是,我們不再需要為任何一個單元測試思考命名問題。
有些契約需要更多的值組合來驗證正確性,那麼可以在契約測試用例的後面添加參數。
"質數".Test((int num) =>
{
// 測試用例代碼
}).WithArguments(2, 3, 5, 7, 11);
"{0} 不是質數".Test((int num) =>
{
// 測試用例代碼
}).WithArguments(1, 4);
也可以添加多個參數(最多支持 8 個):
"契約 1,參數中可以帶 {0} 和 {1}。".Test((int a, int b) =>
{
// 現在,a 會等於 2,b 會等於 3。
}).WithArguments(2, 3);
"契約 2".Test((int a, int b) =>
{
// 現在有兩組代碼,一組 a=2, b=3;另一組 a=10, b=20。
// 當然也可以傳入元組數組。
}).WithArguments((2, 3), (10, 20));
在顯示單元測試結果時,如果契約字符串中含有格式化佔位符 {0}
、{1}
等,會被自動替換為參數的值。
Test
方法中傳入的每個 Action
都支持 async
關鍵字,並會在執行測試用例時等待異步操作結束。
MSTest v2 支持嵌套類型的單元測試。也就是說,我們可以利用這一點做出近乎無限層級的單元測試樹出來。