欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# 單元測試全解析

 更新時間:2021年04月12日 08:53:25   作者:五維思考  
這篇文章主要介紹了C# 單元測試的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下

1、前言

“不會寫單元測試的程序員不是合格的程序員,不寫單元測試的程序員不是優(yōu)秀的工程師?!?/p>

那么問題來了,什么是單元測試,如何做單元測試。

2、單元測試

2.1 單元測試的定義

按照維基百科上的說法,單元測試(Unit Testing)又稱為模塊測試, 是針對程序模塊(軟件設(shè)計的最小單位)來進(jìn)行正確性檢驗(yàn)的測試工作。程序單元是應(yīng)用的最小可測試部件。在面向?qū)ο缶幊讨校钚卧褪欠椒?,包括基類、抽象類、或者派生類(子類)中的方法。按照通俗的理解,一個單元測試判斷某個特定場條件下某個特定方法的行為,如斐波那契數(shù)列算法,冒泡排序算法。

單元測試(unit testing),是指對軟件中的最小可測試單元進(jìn)行檢查和驗(yàn)證。對于單元測試中單元的含義,一般來說,要根據(jù)實(shí)際情況去判定其具體含義, 如C語言中單元指一個函數(shù),Java里單元指一個類,圖形化的軟件中可以指一個窗口或一個菜單等??偟膩碚f,單元就是人為規(guī)定的最小的被測功能模塊。單元測試是在軟件開發(fā)過程中要進(jìn)行的最低級別的測試活動,軟件的獨(dú)立單元將在與程序的其他部分相隔離的情況下進(jìn)行測試。

—— 百度百科

2.2 單元測試的好處

  • 它是一種驗(yàn)證行為。程序中的每一項(xiàng)功能都是測試來驗(yàn)證它的正確性。
  • 它是一種設(shè)計行為。編寫單元測試將使我們從調(diào)用者觀察、思考。特別是先寫測試(test-first),迫使我們把程序設(shè)計成易于調(diào)用和可測試的,有利于程序的解耦和模塊化。
  • 它是一種編寫文檔的行為。單元測試是一種無價的文檔,它是展示函數(shù)或類如何使用的最佳文檔。這份文檔是可編譯、可運(yùn)行的,并且它保持最新,永遠(yuǎn)與代碼同步。
  • 它具有回歸性。自動化的單元測試避免了代碼出現(xiàn)回歸,編寫完成之后,可以隨時隨地的快速運(yùn)行測試。
  • 高效。自動化的單元測試節(jié)省了開發(fā)上調(diào)試BUG的時間,絕大多數(shù)BUG可以通過單元測試測試出來,并且可以減少測試人員的測試時間。有時候通過寫單元測試能夠更好的完善自己程序的邏輯,讓程序變得更加美好。

2.3 單元測試的原則

  • 可重復(fù)運(yùn)行的
  • 持續(xù)長期有效,并且返回一致的結(jié)果
  • 在內(nèi)存中運(yùn)行,沒有外部依賴組件(比如說真實(shí)的數(shù)據(jù)庫,真實(shí)的文件存儲等)
  • 快速返回結(jié)果
  • 一個測試方法只測試一個問題

3、.NET 中的測試框架

現(xiàn)在比較流行的測試框架包括微軟的 MS Test(VS Test)、NUnit、XUnit

3.1 MS Test

VS單元測試的主要類:Assert、StringAssert、CollectionAssert,具體可參照 MSDN介紹

有些時候我們需要對測試的方法用到的數(shù)據(jù)或配置進(jìn)行初始化,有幾個特殊的測試方法。

如果需要針對測試中的所有虛擬用戶迭代僅執(zhí)行一次初始化操作,請使用 TestInitializeAttribute。

初始化方法的運(yùn)行順序如下:

  1. AssemblyInitializeAttribute 標(biāo)記的方法。
  2. ClassInitializeAttribute 特性標(biāo)記的方法。
  3. TestInitializeAttribute 特性標(biāo)記的方法。
  4. TestMethodAttribute 特性標(biāo)記的方法。

使用 VS Test 的時候,首先我們需要標(biāo)記測試方法所在類 TestClass,測試方法標(biāo)記為 TestMethod

3.2 NUnit

NUnit 測試框架使用方法與 MS Test 類似

有一些是 NUnit 中的,但是MS Test框架中是沒有的:

Assert.IsNaN/Assert.IsEmpty/Assert.IsNotEmpty/Assert.Greater/Assert.GreaterOrEqual

想要同時使用 VS Test 和 NUnit 的話可以使用宏來區(qū)分不同的測試框架,例如:

#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 是很類似的,聲明測試類,測試方法,初始化方法等

3.3 XUnit

XUnit 是另一個測試框架,個人覺得 XUnit 測試更加簡潔一些,初始化和釋放資源不需要標(biāo)記單獨(dú)的方法,初始化直接放在構(gòu)造方法里,資源釋放實(shí)現(xiàn) IDisposable 接口,在 Dispose 方法中進(jìn)行測試的清理工作即可,相比 ms test(vs test)和 NUnit,我覺得 Xunit 更方便一些,并且對于 Assert ,xunit 更簡潔,例如:在 ms test 中的 Assert.IsNull(null);/Assert.IsTrue(1 == 1); 在 xunit 中則是 Assert.Null(null);/Assert.True(1 == 1);,雖然看上去差不多,但是寫的多了就會覺得 xunit 更簡潔一些。

xunit 不需要對測試方法所在類型標(biāo)記 TestClass ,只需要在測試方法上標(biāo)記 Fact 或者使用數(shù)據(jù)驅(qū)動的 Theory

4、XUnit 的基本使用

使用 XUnit 來寫測試方法可以使得測試代碼更為簡潔,更加簡單,推薦使用 xunit 來測試自己的代碼

測試示例:

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);
    }
}

最基本的測試,使用 Fact 標(biāo)記測試方法,使用 Assert 來斷言自己對結(jié)果的預(yù)期

可以使用 Theory 來自己指定一批數(shù)據(jù)來進(jìn)行測試,來實(shí)現(xiàn)測試數(shù)據(jù)驅(qū)動測試,簡單的數(shù)據(jù)可以通過 InlineData 直接指定,也可以使用 MemberData 來指定一個方法來返回用于測試的數(shù)據(jù),也可以自定義一個繼承于 DataAttributeData Provider

5、其他

在我們開發(fā)過程中測試是非常重要的一部分,高質(zhì)量項(xiàng)目的一個重要指標(biāo)就是測試覆蓋率,一個高質(zhì)量的開源項(xiàng)目一定是有比較完善的測試項(xiàng)目的,所以對于測試非常有必要了解一下,并將它集成到自己的項(xiàng)目中持續(xù)保證項(xiàng)目的高質(zhì)量,同時完善的測試對于項(xiàng)目重構(gòu)也是非常有好處的,能夠很大程度上檢測是否有發(fā)生一些破壞性的變更。

以上就是C# 單元測試全解析的詳細(xì)內(nèi)容,更多關(guān)于C# 單元測試的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論