C# 單元測(cè)試全解析
1、前言
“不會(huì)寫單元測(cè)試的程序員不是合格的程序員,不寫單元測(cè)試的程序員不是優(yōu)秀的工程師。”
那么問題來了,什么是單元測(cè)試,如何做單元測(cè)試。
2、單元測(cè)試
2.1 單元測(cè)試的定義
按照維基百科上的說法,單元測(cè)試(Unit Testing)又稱為模塊測(cè)試, 是針對(duì)程序模塊(軟件設(shè)計(jì)的最小單位)來進(jìn)行正確性檢驗(yàn)的測(cè)試工作。程序單元是應(yīng)用的最小可測(cè)試部件。在面向?qū)ο缶幊讨?,最小單元就是方法,包括基類、抽象類、或者派生類(子類)中的方法。按照通俗的理解,一個(gè)單元測(cè)試判斷某個(gè)特定場(chǎng)條件下某個(gè)特定方法的行為,如斐波那契數(shù)列算法,冒泡排序算法。
單元測(cè)試(unit testing),是指對(duì)軟件中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證。對(duì)于單元測(cè)試中單元的含義,一般來說,要根據(jù)實(shí)際情況去判定其具體含義, 如C語言中單元指一個(gè)函數(shù),Java里單元指一個(gè)類,圖形化的軟件中可以指一個(gè)窗口或一個(gè)菜單等??偟膩碚f,單元就是人為規(guī)定的最小的被測(cè)功能模塊。單元測(cè)試是在軟件開發(fā)過程中要進(jìn)行的最低級(jí)別的測(cè)試活動(dòng),軟件的獨(dú)立單元將在與程序的其他部分相隔離的情況下進(jìn)行測(cè)試。
—— 百度百科
2.2 單元測(cè)試的好處
- 它是一種驗(yàn)證行為。程序中的每一項(xiàng)功能都是測(cè)試來驗(yàn)證它的正確性。
- 它是一種設(shè)計(jì)行為。編寫單元測(cè)試將使我們從調(diào)用者觀察、思考。特別是先寫測(cè)試(test-first),迫使我們把程序設(shè)計(jì)成易于調(diào)用和可測(cè)試的,有利于程序的解耦和模塊化。
- 它是一種編寫文檔的行為。單元測(cè)試是一種無價(jià)的文檔,它是展示函數(shù)或類如何使用的最佳文檔。這份文檔是可編譯、可運(yùn)行的,并且它保持最新,永遠(yuǎn)與代碼同步。
- 它具有回歸性。自動(dòng)化的單元測(cè)試避免了代碼出現(xiàn)回歸,編寫完成之后,可以隨時(shí)隨地的快速運(yùn)行測(cè)試。
- 高效。自動(dòng)化的單元測(cè)試節(jié)省了開發(fā)上調(diào)試BUG的時(shí)間,絕大多數(shù)BUG可以通過單元測(cè)試測(cè)試出來,并且可以減少測(cè)試人員的測(cè)試時(shí)間。有時(shí)候通過寫單元測(cè)試能夠更好的完善自己程序的邏輯,讓程序變得更加美好。
2.3 單元測(cè)試的原則
- 可重復(fù)運(yùn)行的
- 持續(xù)長(zhǎng)期有效,并且返回一致的結(jié)果
- 在內(nèi)存中運(yùn)行,沒有外部依賴組件(比如說真實(shí)的數(shù)據(jù)庫(kù),真實(shí)的文件存儲(chǔ)等)
- 快速返回結(jié)果
- 一個(gè)測(cè)試方法只測(cè)試一個(gè)問題
3、.NET 中的測(cè)試框架
現(xiàn)在比較流行的測(cè)試框架包括微軟的 MS Test(VS Test)、NUnit、XUnit
3.1 MS Test
VS單元測(cè)試的主要類:Assert、StringAssert、CollectionAssert,具體可參照 MSDN介紹
有些時(shí)候我們需要對(duì)測(cè)試的方法用到的數(shù)據(jù)或配置進(jìn)行初始化,有幾個(gè)特殊的測(cè)試方法。
如果需要針對(duì)測(cè)試中的所有虛擬用戶迭代僅執(zhí)行一次初始化操作,請(qǐng)使用 TestInitializeAttribute。
初始化方法的運(yùn)行順序如下:
- 用
AssemblyInitializeAttribute標(biāo)記的方法。 - 用
ClassInitializeAttribute特性標(biāo)記的方法。 - 用
TestInitializeAttribute特性標(biāo)記的方法。 - 用
TestMethodAttribute特性標(biāo)記的方法。
使用 VS Test 的時(shí)候,首先我們需要標(biāo)記測(cè)試方法所在類 TestClass,測(cè)試方法標(biāo)記為 TestMethod
3.2 NUnit
NUnit 測(cè)試框架使用方法與 MS Test 類似
有一些是 NUnit 中的,但是MS Test框架中是沒有的:
Assert.IsNaN/Assert.IsEmpty/Assert.IsNotEmpty/Assert.Greater/Assert.GreaterOrEqual 等
想要同時(shí)使用 VS Test 和 NUnit 的話可以使用宏來區(qū)分不同的測(cè)試框架,例如:
#if !NUNIT using Microsoft.VisualStudio.TestTools.UnitTesting; using Category = Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute; #else using NUnit.Framework; using TestClass = NUnit.Framework.TestFixtureAttribute; using TestMethod = NUnit.Framework.TestAttribute; using TestInitialize = NUnit.Framework.SetUpAttribute; using TestCleanup = NUnit.Framework.TearDownAttribute; using TestContext = System.Object; using ClassCleanup = NUnit.Framework.TestFixtureTearDownAttribute; using ClassInitialize = NUnit.Framework.TestFixtureSetUpAttribute; #endif
從上面可以看得出來 nunit 很多東西和 vs test 是很類似的,聲明測(cè)試類,測(cè)試方法,初始化方法等
3.3 XUnit
XUnit 是另一個(gè)測(cè)試框架,個(gè)人覺得 XUnit 測(cè)試更加簡(jiǎn)潔一些,初始化和釋放資源不需要標(biāo)記單獨(dú)的方法,初始化直接放在構(gòu)造方法里,資源釋放實(shí)現(xiàn) IDisposable 接口,在 Dispose 方法中進(jìn)行測(cè)試的清理工作即可,相比 ms test(vs test)和 NUnit,我覺得 Xunit 更方便一些,并且對(duì)于 Assert ,xunit 更簡(jiǎn)潔,例如:在 ms test 中的 Assert.IsNull(null);/Assert.IsTrue(1 == 1); 在 xunit 中則是 Assert.Null(null);/Assert.True(1 == 1);,雖然看上去差不多,但是寫的多了就會(huì)覺得 xunit 更簡(jiǎn)潔一些。
xunit 不需要對(duì)測(cè)試方法所在類型標(biāo)記 TestClass ,只需要在測(cè)試方法上標(biāo)記 Fact 或者使用數(shù)據(jù)驅(qū)動(dòng)的 Theory
4、XUnit 的基本使用
使用 XUnit 來寫測(cè)試方法可以使得測(cè)試代碼更為簡(jiǎn)潔,更加簡(jiǎn)單,推薦使用 xunit 來測(cè)試自己的代碼
測(cè)試示例:
public class ResultModelTest
{
[Fact]
public void SuccessTest()
{
var result = ResultModel.Success();
Assert.Null(result.ErrorMsg);
Assert.Equal(ResultStatus.Success, result.Status);
}
[Theory]
[InlineData(ResultStatus.Unauthorized)]
[InlineData(ResultStatus.NoPermission)]
[InlineData(ResultStatus.RequestError)]
[InlineData(ResultStatus.NotImplemented)]
[InlineData(ResultStatus.ResourceNotFound)]
[InlineData(ResultStatus.RequestTimeout)]
public void FailTest(ResultStatus resultStatus)
{
var result = ResultModel.Fail("test error", resultStatus);
Assert.Equal(resultStatus, result.Status);
}
}
最基本的測(cè)試,使用 Fact 標(biāo)記測(cè)試方法,使用 Assert 來斷言自己對(duì)結(jié)果的預(yù)期
可以使用 Theory 來自己指定一批數(shù)據(jù)來進(jìn)行測(cè)試,來實(shí)現(xiàn)測(cè)試數(shù)據(jù)驅(qū)動(dòng)測(cè)試,簡(jiǎn)單的數(shù)據(jù)可以通過 InlineData 直接指定,也可以使用 MemberData 來指定一個(gè)方法來返回用于測(cè)試的數(shù)據(jù),也可以自定義一個(gè)繼承于 DataAttribute 的 Data Provider
5、其他
在我們開發(fā)過程中測(cè)試是非常重要的一部分,高質(zhì)量項(xiàng)目的一個(gè)重要指標(biāo)就是測(cè)試覆蓋率,一個(gè)高質(zhì)量的開源項(xiàng)目一定是有比較完善的測(cè)試項(xiàng)目的,所以對(duì)于測(cè)試非常有必要了解一下,并將它集成到自己的項(xiàng)目中持續(xù)保證項(xiàng)目的高質(zhì)量,同時(shí)完善的測(cè)試對(duì)于項(xiàng)目重構(gòu)也是非常有好處的,能夠很大程度上檢測(cè)是否有發(fā)生一些破壞性的變更。
以上就是C# 單元測(cè)試全解析的詳細(xì)內(nèi)容,更多關(guān)于C# 單元測(cè)試的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 使用 BenchmarkDotNet 對(duì) C# 代碼進(jìn)行基準(zhǔn)測(cè)試
- C#建立測(cè)試用例系統(tǒng)的示例代碼
- 關(guān)于Unity C# Mathf.Abs()取絕對(duì)值性能測(cè)試詳解
- C#使用base64對(duì)字符串進(jìn)行編碼和解碼的測(cè)試
- C#使用String和StringBuilder運(yùn)行速度測(cè)試及各自常用方法簡(jiǎn)介
- 詳解C# WebApi 接口測(cè)試工具:WebApiTestClient
- c# 插入數(shù)據(jù)效率測(cè)試(mongodb)
- 京東聯(lián)盟C#接口測(cè)試示例分享
- C#/.Net 中快速批量給SQLite數(shù)據(jù)庫(kù)插入測(cè)試數(shù)據(jù)
- C#代碼性能測(cè)試類(簡(jiǎn)單實(shí)用)
- C#控制臺(tái)下測(cè)試多線程的方法
- c#測(cè)試反射性能示例
- c#測(cè)試本機(jī)sql運(yùn)算速度的代碼示例分享
相關(guān)文章
C#把數(shù)字轉(zhuǎn)換成大寫金額的代碼實(shí)例
這篇文章主要介紹了C#把數(shù)字轉(zhuǎn)換成大寫金額的代碼實(shí)例,例如把200轉(zhuǎn)換成“貳佰元”,需要的朋友可以參考下2014-05-05
C#線性漸變畫刷LinearGradientBrush用法實(shí)例
這篇文章主要介紹了C#線性漸變畫刷LinearGradientBrush用法,實(shí)例分析了線性漸變畫刷LinearGradientBrush的相關(guān)使用技巧,需要的朋友可以參考下2015-06-06
C# double和decimal數(shù)據(jù)類型以截?cái)嗟姆绞奖A糁付ǖ男?shù)位數(shù)
從事ASP.NET in C#開發(fā)快一年了,今天才知道,C#中保留小數(shù)位數(shù)時(shí)沒有使用截?cái)嗟姆绞?/div> 2012-05-05
C# Socket編程實(shí)現(xiàn)簡(jiǎn)單的局域網(wǎng)聊天器的示例代碼
這篇文章主要介紹了C# Socket編程實(shí)現(xiàn)簡(jiǎn)單的局域網(wǎng)聊天器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
C#模擬實(shí)現(xiàn)抽獎(jiǎng)小程序的示例代碼
這篇文章主要介紹了通過C#模擬實(shí)現(xiàn)一個(gè)簡(jiǎn)單的抽獎(jiǎng)小程序,文中的示例代碼講解詳細(xì),對(duì)我們了解C#有一定的幫助,需要的可以參考一下2021-12-12
C#調(diào)用halcon實(shí)現(xiàn)使用鼠標(biāo)滾輪對(duì)圖片進(jìn)行縮放顯示
這篇文章主要為大家詳細(xì)介紹了C#如何調(diào)用halcon實(shí)現(xiàn)使用鼠標(biāo)滾輪對(duì)圖片進(jìn)行縮放顯示,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
C#調(diào)用執(zhí)行命令行窗口(CMD)的方法與技巧
在 C# 的編程世界里,我們常常會(huì)遇到需要與操作系統(tǒng)底層進(jìn)行交互的場(chǎng)景,這時(shí),調(diào)用命令行窗口(CMD)就成為了一個(gè)強(qiáng)大的工具,通過 C# 調(diào)用 CMD 都能為我們提供極大的便利,極大地拓展了 C# 應(yīng)用程序的功能邊界,本文介紹了C#中調(diào)用執(zhí)行CMD的方法與技巧2025-01-01最新評(píng)論

