.Net使用Xunit工具進(jìn)行單元測試
不管你愛與不愛,單元測試對于一個軟件的長治久安還是必不可少的一環(huán)。在Visual Studio 2012后,VS中的測試瀏覽器也能與第三方的集成了,用起來還是非常方便的。目前在.Net框架下的測試工具主要有Nunit、內(nèi)置的MSTest以及Xunit這三個工具,本文就簡單的介紹一下如何在VS中使用XUnit這個測試框架的后起之秀。
安裝Xunit:
Xunit的安裝現(xiàn)在不需要插件支持了,直接使用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));
}
}執(zhí)行測試用例
在測試瀏覽器中執(zhí)行RunAll即可(修改后不用編譯,它會自動編譯)

測試方式說明:
聲明測試用例:
Xunit里面不需要TestClass之類Attribute來標(biāo)記測試用例類,只需要滿足如下條件即可:
測試類必須是public的
測試用例用FactAttribute標(biāo)記
斷言:
Assert類用來驗證測試測試函數(shù)的輸出結(jié)果。
Assert.Equal(3, Math.Max(3, 2));
也可以使用一些擴(kuò)展的斷言庫,常用的就是xunit.should庫,它是以擴(kuò)展函數(shù)的方式進(jìn)行驗證,看起來更加舒服。
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 = $"與預(yù)期結(jié)果不一致,當(dāng)前值是 '{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 = $"與預(yù)期結(jié)果不一致,當(dāng)前值不應(yīng)該是 '{format(notExprected)}' ";
throw new InvalidOperationException(msg);
}
static string format(object value)
{
return value == null ? "NULL" : value.ToString();
}
}構(gòu)建和析構(gòu):
Xunit里面并不是通過SetUp和TearDown標(biāo)記來表明測試用例的構(gòu)建和析構(gòu)操作,它每次執(zhí)行測試用例的時候都會插件測試用例類,執(zhí)行完成后,如果其實現(xiàn)了IDispose接口,則會調(diào)用Dispose函數(shù),更加簡潔明了。也就是說:
在測試用例類的構(gòu)造函數(shù)指向數(shù)據(jù)構(gòu)建操作
在Dispose函數(shù)中指向數(shù)據(jù)清理操作
異常測試
Xunit并不是通過Attribute來標(biāo)記異常捕獲的,而是直接使用Assert.Throws斷言函數(shù)來驗證異常。
public class TestClass1
{
[Fact]
public void testException()
{
Assert.Throws<InvalidOperationException>(() => operation());
}
void operation()
{
throw new InvalidOperationException();
}
}更改測試用例名稱:
[Fact(DisplayName =?"Max函數(shù)測試")]
跳過測試用例:
[Fact(Skip ="重構(gòu)未完成")]
分組:
[Trait("Group",?"Category")]
到此這篇關(guān)于.Net使用Xunit工具進(jìn)行單元測試的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Asp.net Socket客戶端(遠(yuǎn)程發(fā)送和接收數(shù)據(jù))
通過Socket遠(yuǎn)程發(fā)送與接收數(shù)據(jù)的代碼類2008-11-11
ASP.NET(C#) Web Api通過文件流下載文件的實例
這篇文章主要介紹了ASP.NET(C#) Web Api通過文件流下載文件的方法,提供源碼下載,需要的朋友可以參考下。2016-06-06
asp.net下gridview 批量刪除的實現(xiàn)方法
asp.net下gridview 批量刪除的實現(xiàn)方法...2007-11-11
ASP.NET?MVC5網(wǎng)站開發(fā)顯示文章列表(九)
顯示文章列表分兩塊,管理員可以顯示全部文章列表,一般用戶只顯示自己的文章列表。文章列表的顯示采用easyui-datagrid,后臺需要與之對應(yīng)的action返回json類型數(shù)據(jù),感興趣的小伙伴們可以參考一下2015-09-09
ASP.NET Core 奇技淫巧之接口代理轉(zhuǎn)發(fā)的實現(xiàn)
這篇文章主要介紹了ASP.NET Core 奇技淫巧之接口代理轉(zhuǎn)發(fā)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
ASP.NET簡化編輯界面解決思路及實現(xiàn)代碼(2)
這篇與前一篇改進(jìn)部分,也許大家會留意到動畫演示,主要是GridVeiw的更新與刪除會在每row都有。因此Insus.NET把它抽取出來,放在GridView外,感興趣的朋友可以了解下啊,希望本文對你有所幫助2013-01-01
使用HtmlAgilityPack XPath 表達(dá)式抓取博客園數(shù)據(jù)的實現(xiàn)代碼
使用HtmlAgilityPack XPath表達(dá)式來抓取博客園數(shù)據(jù)使用WebClient 下載數(shù)據(jù),HtmlAgilityPack XPath表達(dá)式解析數(shù)據(jù),并綁定到Repeater控件2011-12-12
.NET性能調(diào)優(yōu)之一:ANTS Performance Profiler的使用介紹
本系列文章主要會介紹一些.NET性能調(diào)優(yōu)的工具、Web性能優(yōu)化的規(guī)則(如YSlow)及方法等等內(nèi)容。成文前最不希望看到的就是園子里不間斷的“哪個語言好,哪個語言性能高”的爭論,不多說,真正的明白人都應(yīng)該知道這樣的爭論有沒有意義,希望我們能從實際性能優(yōu)化的角度去討論問題2013-01-01
給Asp.Net初學(xué)者的關(guān)于繼承和多態(tài)性的例子
給Asp.Net初學(xué)者的關(guān)于繼承和多態(tài)性的例子...2006-09-09

