網(wǎng)站首頁 編程語言 正文
不管你愛與不愛,單元測試對(duì)于一個(gè)軟件的長治久安還是必不可少的一環(huán)。在Visual Studio 2012后,VS中的測試瀏覽器也能與第三方的集成了,用起來還是非常方便的。目前在.Net框架下的測試工具主要有Nunit、內(nèi)置的MSTest以及Xunit這三個(gè)工具,本文就簡單的介紹一下如何在VS中使用XUnit這個(gè)測試框架的后起之秀。
安裝Xunit:
Xunit的安裝現(xiàn)在不需要插件支持了,直接使用NuGet安裝如下兩個(gè)庫即可:
PM> Install-Package xunit
PM> Install-Package xunit.runner.visualstudio -Pre (Visual Studio測試瀏覽器支持, VS2015目前必須裝Pre的)
編寫測試用例:
一個(gè)簡單的測試用例如下:
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即可(修改后不用編譯,它會(huì)自動(dòng)編譯)
測試方式說明:
聲明測試用例:
Xunit里面不需要TestClass之類Attribute來標(biāo)記測試用例類,只需要滿足如下條件即可:
測試類必須是public的
測試用例用FactAttribute標(biāo)記
斷言:
Assert類用來驗(yàn)證測試測試函數(shù)的輸出結(jié)果。
Assert.Equal(3, Math.Max(3, 2));
也可以使用一些擴(kuò)展的斷言庫,常用的就是xunit.should庫,它是以擴(kuò)展函數(shù)的方式進(jìn)行驗(yàn)證,看起來更加舒服。
PM> Install-Package xunit.should
Math.Max(3, 2).ShouldBe(3);
不過,這個(gè)庫和新版本的XUnit適配不是很好,我這里寫了一個(gè)簡單的版本:?
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í)行測試用例的時(shí)候都會(huì)插件測試用例類,執(zhí)行完成后,如果其實(shí)現(xiàn)了IDispose接口,則會(huì)調(diào)用Dispose函數(shù),更加簡潔明了。也就是說:
在測試用例類的構(gòu)造函數(shù)指向數(shù)據(jù)構(gòu)建操作
在Dispose函數(shù)中指向數(shù)據(jù)清理操作
異常測試
Xunit并不是通過Attribute來標(biāo)記異常捕獲的,而是直接使用Assert.Throws斷言函數(shù)來驗(yàn)證異常。
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")]
原文鏈接:https://www.cnblogs.com/TianFang/p/4116367.html
相關(guān)推薦
- 2023-02-05 詳解Golang中Context的三個(gè)常見應(yīng)用場景_Golang
- 2022-08-02 利用go語言實(shí)現(xiàn)Git?重命名遠(yuǎn)程分支??_Golang
- 2022-07-11 lambda表達(dá)式和Stream
- 2022-07-30 一文掌握Python正則表達(dá)式_python
- 2022-04-04 HTML頁面在ios上滾動(dòng)卡頓的解決方案
- 2023-07-03 前端面試中遇到的垂直居中問題
- 2022-06-12 Android開發(fā)之保存圖片到相冊(cè)的三種方法詳解_Android
- 2023-04-12 Pandas創(chuàng)建DataFrame提示:type?object?'object'?has?no?at
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支