.Net使用Xunit工具進行單元測試
不管你愛與不愛,單元測試對於一個軟件的長治久安還是必不可少的一環。在Visual Studio 2012後,VS中的測試瀏覽器也能與第三方的集成瞭,用起來還是非常方便的。目前在.Net框架下的測試工具主要有Nunit、內置的MSTest以及Xunit這三個工具,本文就簡單的介紹一下如何在VS中使用XUnit這個測試框架的後起之秀。
安裝Xunit:
Xunit的安裝現在不需要插件支持瞭,直接使用NuGet安裝如下兩個庫即可:
PM> Install-Package xunit PM> Install-Package xunit.runner.visualstudio -Pre (Visual Studio測試瀏覽器支持, VS2015目前必須裝Pre的)
編寫測試用例:
一個簡單的測試用例如下:
public class TestClass1 { [Fact] public void testMax() { Assert.Equal(3, Math.Max(3, 2)); } [Fact] public void testFail() { Assert.Equal(2, Math.Max(3, 2)); } }
執行測試用例
在測試瀏覽器中執行RunAll即可(修改後不用編譯,它會自動編譯)
測試方式說明:
聲明測試用例:
Xunit裡面不需要TestClass之類Attribute來標記測試用例類,隻需要滿足如下條件即可:
-
測試類必須是public的
-
測試用例用FactAttribute標記
斷言:
Assert類用來驗證測試測試函數的輸出結果。
Assert.Equal(3, Math.Max(3, 2));
也可以使用一些擴展的斷言庫,常用的就是xunit.should庫,它是以擴展函數的方式進行驗證,看起來更加舒服。
PM> Install-Package xunit.should
Math.Max(3, 2).ShouldBe(3);
不過,這個庫和新版本的XUnit適配不是很好,我這裡寫瞭一個簡單的版本:
static class AssertExtension { public static void ShouldBe<T>(this T value, T exprected) { if(Equals(value, exprected)) return; var msg = $"與預期結果不一致,當前值是 '{format(value)}', 期望值是 '{format(exprected)}'"; throw new InvalidOperationException(msg); } public static void ShouldNotBe<T>(this T value, T notExprected) { if (!Equals(value, notExprected)) return; var msg = $"與預期結果不一致,當前值不應該是 '{format(notExprected)}' "; throw new InvalidOperationException(msg); } static string format(object value) { return value == null ? "NULL" : value.ToString(); } }
構建和析構:
Xunit裡面並不是通過SetUp和TearDown標記來表明測試用例的構建和析構操作,它每次執行測試用例的時候都會插件測試用例類,執行完成後,如果其實現瞭IDispose接口,則會調用Dispose函數,更加簡潔明瞭。也就是說:
-
在測試用例類的構造函數指向數據構建操作
-
在Dispose函數中指向數據清理操作
異常測試
Xunit並不是通過Attribute來標記異常捕獲的,而是直接使用Assert.Throws斷言函數來驗證異常。
public class TestClass1 { [Fact] public void testException() { Assert.Throws<InvalidOperationException>(() => operation()); } void operation() { throw new InvalidOperationException(); } }
更改測試用例名稱:
[Fact(DisplayName = "Max函數測試")]
跳過測試用例:
[Fact(Skip ="重構未完成")]
分組:
[Trait("Group", "Category")]
到此這篇關於.Net使用Xunit工具進行單元測試的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- C#使用MSTest進行單元測試
- Assert.assertEquals()方法參數詳解
- Java Assert.assertEquals案例詳解
- 關於Net6 Xunit 集成測試的問題
- Java自定義異常與異常使用的最佳方式