目前在.Net框架下的測試工具主要有Nunit、內置的MSTest以及Xunit這三個工具,本文就簡單的介紹一下如何在VS中使用XUnit這個測試框架的后起之秀。
安裝Xunit:
Xunit的安裝現在不需要插件支持了,直接使用NuGet安裝如下兩個庫即可:
PM> install-package xunit -Version 2.1(我用的.Net4.5.2的,這里用2.2會安裝失敗,用2.1的,根據實際情況調整版本)
PM> install-package xunit.runner.visualstudio(測試適配器,感覺這是個坑,沒有這個無法進行測試,上面安裝xunit時不會自動安裝,而且沒有任何提示)
編寫測試用例:
先寫一個簡單的待測試方法:
public class Arithmetic
{
public int Add(int nb1, int nb2)
{
return nb1 + nb2;
}
}
然后就是對該方法的測試用例了。
[Fact]
public void Add()
{
Arithmetic a = new Arithmetic();
int res = a.Add(1, 2);
Assert.Equal(3, res);
}
ps:測試類必須是public的,測試用例用FactAttribute標記。
執行測試用例:
運行:Ctrl+R,T
調試:Ctrl+R,Ctrl+T
測試結果輸出:

異常測試
Xunit並不是通過Attribute來標記異常捕獲的,而是直接使用Assert.Throws斷言函數來驗證異常。
准備一個沒做檢查的除法方法。
public int Divide(int nb1, int nb2)
{
return nb1 / nb2;
}
捕獲異常
[Fact]
public void Divide()
{
Arithmetic a = new Arithmetic();
Assert.Throws<DivideByZeroException>(() => a.Divide(1, 0));
}
更改測試用例名稱:
[Fact(DisplayName = "除法測試")]

跳過測試用例:
[Fact(Skip ="重構未完成")]
分組:
[Fact]
[Trait("Group", "Category")]
點擊選擇按特征分組
多場景參數情況:
注意到測試代碼中的參數和結果都寫死了。如果我們要對多種情況進行測試,豈不是需要寫多個單元測試方法或者進行多次方法執行和斷言。這也太麻煩了。在XUnit框架中為我們提供了Theory特性。使用如下:
[Theory]
[InlineData(1, 2)]
[InlineData(1, 0)]
[InlineData(0, 2)]
public void AddMultiple(int parmaA, int parmaB)
{
Arithmetic a = new Arithmetic();
int res = a.Add(parmaA, parmaB);
Assert.Equal(parmaA + parmaB, res);
}
測試完成執行--清除垃圾數據:
我們一般的項目都離不開數據庫操作,都是我們會發現,鏈接數據庫操作時每測試一次都會產生對應的垃圾數據,為了避免對測試的無干擾性。我們需要在每次測試后清除垃圾數據。
這里我們可以通過實現IDisposable接口進行垃圾數據的清理。

測試開始前執行--初始化數據:構造方法
Stub:
單元測試的定義與原則要求我們寫的單元測試必須與外部環境、類別、資源、服務獨立,不能直接相依。這樣才是單純的測試目標物件本身的邏輯是否符合預期。
改寫待測試方法:

對比直接調用的方法和調用Stub的方法的結果。

我們知道對數據庫的操作是比較耗時的,而單元測試的要求是盡可能的減少測試方法的執行時間。因為單元測試執行的比較頻繁。基於前面已經對數據庫的實際操作已經測試過了,所以我們在后續的上層操作使用Stub(存根)來模擬,而不再對數據庫進行實際操作。
Mock:
雖然我們現在把測試方法分離了出來了,但每次都要手動重寫一個模擬方法還是很麻煩啊,好在Mock框架(Moq)可以自動幫我們完成這個步驟。

第三個方法MockAdd就是我們Mock出來的方法,相比上面的示例,是不是簡化多了。起碼代碼看起來清晰了,可以更加注重測試邏輯。
Mock方法時可以設置指定方法參數的返回值。

剛自學單元測試,如有高見,歡迎指教。