<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          .NET 項(xiàng)目中的單元測(cè)試

          共 4505字,需瀏覽 10分鐘

           ·

          2021-01-23 19:09


          .NET 項(xiàng)目中的單元測(cè)試

          Intro

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

          —— 一只想要成為一個(gè)優(yōu)秀程序員的渣逼程序猿。

          那么問(wèn)題來(lái)了,什么是單元測(cè)試,如何做單元測(cè)試。

          單元測(cè)試

          單元測(cè)試的定義

          按照維基百科上的說(shuō)法,單元測(cè)試(Unit Testing)又稱為模塊測(cè)試, 是針對(duì)程序模塊(軟件設(shè)計(jì)的最小單位)來(lái)進(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è)試中單元的含義,一般來(lái)說(shuō),要根據(jù)實(shí)際情況去判定其具體含義, 如C語(yǔ)言中單元指一個(gè)函數(shù),Java里單元指一個(gè)類,圖形化的軟件中可以指一個(gè)窗口或一個(gè)菜單等??偟膩?lái)說(shuō),單元就是人為規(guī)定的最小的被測(cè)功能模塊。單元測(cè)試是在軟件開發(fā)過(guò)程中要進(jìn)行的最低級(jí)別的測(cè)試活動(dòng),軟件的獨(dú)立單元將在與程序的其他部分相隔離的情況下進(jìn)行測(cè)試。

          —— 百度百科 http://baike.baidu.com/view/106237.htm

          單元測(cè)試的好處

          1. 它是一種驗(yàn)證行為

            程序中的每一項(xiàng)功能都是測(cè)試來(lái)驗(yàn)證它的正確性。

          2. 它是一種設(shè)計(jì)行為

            編寫單元測(cè)試將使我們從調(diào)用者觀察、思考。特別是先寫測(cè)試(test-first),迫使我們把程序設(shè)計(jì)成易于調(diào)用和可測(cè)試的,有利于程序的解耦和模塊化。

          3. 它是一種編寫文檔的行為

            單元測(cè)試是一種無(wú)價(jià)的文檔,它是展示函數(shù)或類如何使用的最佳文檔。這份文檔是可編譯、可運(yùn)行的,并且它保持最新,永遠(yuǎn)與代碼同步。

          4. 它具有回歸性

            自動(dòng)化的單元測(cè)試避免了代碼出現(xiàn)回歸,編寫完成之后,可以隨時(shí)隨地的快速運(yùn)行測(cè)試。

          5. 高效

            自動(dòng)化的單元測(cè)試節(jié)省了開發(fā)上調(diào)試BUG的時(shí)間,絕大多數(shù)BUG可以通過(guò)單元測(cè)試測(cè)試出來(lái),并且可以減少測(cè)試人員的測(cè)試時(shí)間。有時(shí)候通過(guò)寫單元測(cè)試能夠更好的完善自己程序的邏輯,讓程序變得更加美好。

            —— 單元測(cè)試的優(yōu)點(diǎn) http://jingyan.baidu.com/article/d713063522ab4e13fdf47533.html

          單元測(cè)試的原則

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

          .NET 中的測(cè)試框架

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

          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)行順序如下:

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

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

          NUnit

          NUnit 測(cè)試框架使用方法與 MS Test 類似

          有一些是 NUnit 中的,但是MS Test框架中是沒(méi)有的:

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

          想要同時(shí)使用 VS Test 和 NUnit 的話可以使用宏來(lái)區(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

          從上面可以看得出來(lái) nunit 很多東西和 vs test 是很類似的,聲明測(cè)試類,測(cè)試方法,初始化方法等

          XUnit

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

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

          XUnit 的基本使用

          使用 XUnit 來(lái)寫測(cè)試方法可以使得測(cè)試代碼更為簡(jiǎn)潔,更加簡(jiǎn)單,推薦使用 xunit 來(lái)測(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?來(lái)斷言自己對(duì)結(jié)果的預(yù)期

          可以使用?Theory?來(lái)自己指定一批數(shù)據(jù)來(lái)進(jìn)行測(cè)試,來(lái)實(shí)現(xiàn)測(cè)試數(shù)據(jù)驅(qū)動(dòng)測(cè)試,簡(jiǎn)單的數(shù)據(jù)可以通過(guò)?InlineData?直接指定,也可以使用?MemberData?來(lái)指定一個(gè)方法來(lái)返回用于測(cè)試的數(shù)據(jù),也可以自定義一個(gè)繼承于?DataAttribute?的 Data Provider

          More

          我覺(jué)得在我們開發(fā)過(guò)程中測(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è)試吧,為成為一個(gè)優(yōu)秀的工程師而努力~~

          Reference

          • MSDN - Microsoft.VisualStudio.TestTools.UnitTesting
          • 單元測(cè)試之道
          • VS2012 Unit Test 個(gè)人學(xué)習(xí)匯總(含目錄)
          • 單元測(cè)試的優(yōu)點(diǎn)
          • 對(duì)比MS Test與NUnit Test框架
          • https://stackoverflow.com/questions/261139/nunit-vs-mbunit-vs-mstest-vs-xunit-net
          • https://docs.microsoft.com/en-us/dotnet/core/testing/unit-testing-with-dotnet-test
          • https://xunit.net



          往期精彩回顧




          【推薦】.NET Core開發(fā)實(shí)戰(zhàn)視頻課程?★★★

          .NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門篇-開篇及總體規(guī)劃

          【.NET Core微服務(wù)實(shí)戰(zhàn)-統(tǒng)一身份認(rèn)證】開篇及目錄索引

          Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)

          .NET Core中的一個(gè)接口多種實(shí)現(xiàn)的依賴注入與動(dòng)態(tài)選擇看這篇就夠了

          10個(gè)小技巧助您寫出高性能的ASP.NET Core代碼

          用abp vNext快速開發(fā)Quartz.NET定時(shí)任務(wù)管理界面

          在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實(shí)現(xiàn)作業(yè)調(diào)度

          現(xiàn)身說(shuō)法:實(shí)際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化

          關(guān)于C#異步編程你應(yīng)該了解的幾點(diǎn)建議

          C#異步編程看這篇就夠了


          瀏覽 28
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久久久国产精品嫩草影院 | 久久受| 中国黄色学生妹一级片 | 日韩美美少少妇在线观看 | 蜜桃亚洲AV啪啪无码片 |