網站首頁 編程語言 正文
不管你愛與不愛,單元測試對于一個軟件的長治久安還是必不可少的一環。在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")]
原文鏈接:https://www.cnblogs.com/TianFang/p/4116367.html
相關推薦
- 2023-02-26 flutter中的網絡請求數據獲取詳解_Android
- 2022-05-31 如何利用python給微信公眾號發消息實例代碼_python
- 2022-09-29 解決react組件渲染兩次的問題_React
- 2022-07-20 react中事件處理與柯里化的實現_React
- 2022-08-29 Python通用驗證碼識別OCR庫ddddocr的安裝使用教程_python
- 2022-07-25 基于?Redis?實現接口限流的方式_Redis
- 2022-08-04 Python練習之讀取XML節點和屬性值的方法_python
- 2022-09-17 關于NumPy中asarray的用法及說明_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支