欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何使用xUnit為.netcore程序進行單元測試

這篇文章主要介紹“如何使用xUnit為.net core程序進行單元測試”,在日常操作中,相信很多人在如何使用xUnit為.net core程序進行單元測試問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何使用xUnit為.net core程序進行單元測試”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

創(chuàng)新互聯(lián),為您提供網(wǎng)站建設公司網(wǎng)站制作、網(wǎng)站營銷推廣、網(wǎng)站開發(fā)設計,對服務生料攪拌車等多個行業(yè)擁有豐富的網(wǎng)站建設及推廣經(jīng)驗。創(chuàng)新互聯(lián)網(wǎng)站建設公司成立于2013年,提供專業(yè)網(wǎng)站制作報價服務,我們深知市場的競爭激烈,認真對待每位客戶,為客戶提供賞心悅目的作品。 與客戶共同發(fā)展進步,是我們永遠的責任!

一. 導讀

為什么要編寫自動化測試程序(Automated Tests)?

  • 可以頻繁的進行測試

  • 可以在任何時間進行測試,也可以按計劃定時進行,例如:可以在半夜進行自動測試。

  • 肯定比人工測試要快。

  • 可以更快速的發(fā)現(xiàn)錯誤。

  • 基本上是非常可靠的。

  • 測試代碼與生產(chǎn)代碼緊密結合。

  • 使得開發(fā)團隊更具有幸福感!

自動化測試的分類:

如何使用xUnit為.net core程序進行單元測試

縱軸表示測試的深度,也就是說測試的細致程度。

橫軸則表示測試的覆蓋程度。

  • Unit Test 單元測試, 它可以測試一個類,或者一個類的某個功能,它具有很好的深度,但是對整個應用來說它不具備很好的覆蓋面。

  • Integration Test 集成測試,它沒有單元測試那么細致,但是具有相對較好的測試覆蓋面。例如它可以測試功能的組合,以及像數(shù)據(jù)庫或文件系統(tǒng)這樣的外部資源等。

  • Subcutaneous Test 皮下測試,這種測試作用于UI層的下面一層,這也意味著它對整個應用來說有很好的覆蓋率,但是深度欠佳。那一個MVC結構的應用來說,它就是針對剛好在Controller下面一層的測試,對于Web service來說,它就是對節(jié)點下面那層的測試。

  • UI測試,它的測試覆蓋面很廣,直接從UI層面進行測試,但是深度欠佳。

從速度來看 單元是最快的,而UI測試是最慢的。

從脆弱性來看 UI測試是最差的,程序修改后極有可能需要修改測試代碼,而單元測試是最好的。

是測試行為還是測試私有方法(private method)?

public void IncreaseHeartBeatRate()

        {

            HeartBeatRate = CalculateHeartBeatRate() + 2;

        }

        private int CalculateHeartBeatRate()

        {

            var random = new Random();

            return random.Next(1, 100);

        }

多數(shù)情況下單元測試都應該是針對類的行為進行測試的,也就是public方法。當然也純在不同的觀點。

如果想要對private方法進行測試的話,是有很多缺點的:

  • 首先需要修改方法的訪問限制需要從private改為public,這就破壞了面向?qū)ο蟮姆庋b性。

  • 再者,這其實測試的是類的具體實現(xiàn)細節(jié),而不是類的行為。如果我們想要對類的內(nèi)部進行重構的話,就會破壞測試,導致測試也必須重構。如果必須對private方法進行測試,那么首先建議您把private修飾符改成internal,然后修改該項目(project)的AssemblyInfo.cs,它在項目的Debug或者Release文件夾下。代碼如下:

[assembly: InternalsVisibleTo("Hospital.Tests")]

這表示Hospital.Tests這個測試項目可以訪問該項目生產(chǎn)代碼(production code)的internal方法。

測試的三個階段 AAA

如何使用xUnit為.net core程序進行單元測試

  • Arrange,這里做一些先決的設定。例如創(chuàng)建對象實例,數(shù)據(jù),輸入等等。

  • Act,在這里執(zhí)行生產(chǎn)代碼并返回結果。例如調(diào)用方法,或者設置屬性(Properties)。

  • Assert,在這里檢查結果。測試通過或者失敗。

xUnit.net

官網(wǎng):https://xunit.github.io/

如何使用xUnit為.net core程序進行單元測試

xUnit是一個測試框架,可以針對.net/core進行測試。

測試項目需引用被項目從而對其進行測試,測試項目同時需要引用xUnit庫。測試編寫好后,用Test Runner來運行測試。Test Runner可以讀取測試代碼,并且會知道我們所使用的測試框架,然后執(zhí)行,并顯示結果。目前可用的Test Runner包括vs自帶的Test Explorer,或者dotnet core命令行,以及第三方工具,例如resharper等等。

xUnit支持的平臺:

.net full, .net core, .net standard, uwp, xamarin.

xUnit的例子:

        [Fact]

        public void TestIncreaseHeartBeatRate()

        {

            var patient = new Patient(); // Arrange

            patient.IncreaseHeartBeatRate(); // Act

            Assert.InRange(patient.HeartBeatRate, 40, 100); // Assert

        }

安裝配置xUnit.net

a.使用Visual Studio 2017

首先建立一個C# library項目,叫Hospital(下面部分截圖有個拼寫錯誤,應該是Hospital),然后建立一個xUnit Test項目,叫Hospital.Tests:

 如何使用xUnit為.net core程序進行單元測試

可以看到Hospital.Tests已經(jīng)包含里這幾個庫:

如何使用xUnit為.net core程序進行單元測試

然后為Hospital.Tests添加到Hospital項目的引用。

b.使用.net core 命令行

首先把剛才建立的Hospital.Tests項目移除(目錄需要手動刪除).

然后打開項目位置:

如何使用xUnit為.net core程序進行單元測試

按住shift打開命令行:

如何使用xUnit為.net core程序進行單元測試

用命令行創(chuàng)建項目:

如何使用xUnit為.net core程序進行單元測試

創(chuàng)建 Hospital.Tests目錄,進入目錄,使用命令dotnet new xunit創(chuàng)建xUnit單元測試項目。

添加項目的引用:

如何使用xUnit為.net core程序進行單元測試

最后添加項目到解決方案:

如何使用xUnit為.net core程序進行單元測試

回到VS界面,提示重新加載:

如何使用xUnit為.net core程序進行單元測試

確認后,VS中解決方案結構如:

如何使用xUnit為.net core程序進行單元測試

做第一個測試

對測試項目的文件名進行一些重構,編寫以下代碼,并進行Build:

如何使用xUnit為.net core程序進行單元測試

從Test Explorer我們可以看到一個待測試的項目。

在這里,我們可以對測試項目進行分組和排序,如圖:

如何使用xUnit為.net core程序進行單元測試

想要運行所有的測試,就點擊上面的Run All按鈕。如果像運行單個測試,那么右擊選擇Run Selected Tests:

如何使用xUnit為.net core程序進行單元測試

運行后,可以看到結果,Passed:

如何使用xUnit為.net core程序進行單元測試

我們同樣可以通過命令行來進行測試:

進入到Tests目錄,執(zhí)行 dotnet test命令,所有的測試都會被發(fā)現(xiàn),然后被執(zhí)行:

如何使用xUnit為.net core程序進行單元測試

因為我們并沒有在測試方法中寫任何的Assert,所以測試肯定是通過的,但這個測試也是個無效的測試。

Assert

Assert做什么?Assert基于代碼的返回值、對象的最終狀態(tài)、事件是否發(fā)生等情況來評估測試的結果。Assert的結果可能是Pass或者Fail。如果所有的asserts都pass了,那么整個測試就pass了;如果有任何assert fail了,那么測試就fail了。

xUnit提供了以下類型的Assert:

  • boolean:True/False

  • String:相等/不等,是否為空,以..開始/結束,是否包含子字符串,匹配正則表達式

  • 數(shù)值型:相等/不等,是否在某個范圍內(nèi),浮點的精度

  • Collection:內(nèi)容是否相等,是否包含某個元素,是否包含滿足某種條件(predicate)的元素,是否所有的元素都滿足某個assert

  • Raised events:Custom events,F(xiàn)ramework events(例如:PropertyChanged)

  • Object Type:是否是某種類型,是否某種類型或繼承與某種類型

一個test里應該有多少個asserts?

一種建議的做法是,每個test方法里面只有一個assert。

而還有一種建議就是,每個test里面可以有多個asserts,只要這些asserts都是針對同一個行為就行。

第一個Assert

目標類:

public class Patient

    {

        public Patient()

        {

            IsNew = true;

        }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        public string FullName => $"{FirstName} {LastName}";

        public int HeartBeatRate { get; set; }

        public bool IsNew { get; set; }

        public void IncreaseHeartBeatRate()

        {

            HeartBeatRate = CalculateHeartBeatRate() + 2;

        }

        private int CalculateHeartBeatRate()

        {

            var random = new Random();

            return random.Next(1, 100);

        }

    }

測試類:

public class PatientShould

    {

        [Fact]

        public void HaveHeartBeatWhenNew()

        {

            var patient = new Patient();

            Assert.True(patient.IsNew);

        }

    }

運行測試:

 如何使用xUnit為.net core程序進行單元測試

結果符合預期,測試通過。

改為Assert.False()的話:

如何使用xUnit為.net core程序進行單元測試

測試Fail。

String Assert

測試string是否相等:

        [Fact]

        public void CalculateFullName()

        {

            var p = new Patient

            {

                FirstName = "Nick",

                LastName = "Carter"

            };

            Assert.Equal("Nick Carter", p.FullName);

        }

然后你需要Build一下,這樣VS Test Explorer才能發(fā)現(xiàn)新的test。

運行測試,結果Pass:

如何使用xUnit為.net core程序進行單元測試

同樣改一下Patient類(別忘了Build一下),讓結果失敗:

如何使用xUnit為.net core程序進行單元測試

從失敗信息可以看到期待值和實際值。

StartsWith, EndsWith

[Fact]

        public void CalculateFullNameStartsWithFirstName()

        {

            var p = new Patient

            {

                FirstName = "Nick",

                LastName = "Carter"

            };

            Assert.StartsWith("Nick", p.FullName);

        }

        [Fact]

        public void CalculateFullNameEndsWithFirstName()

        {

            var p = new Patient

            {

                FirstName = "Nick",

                LastName = "Carter"

            };

            Assert.EndsWith("Carter", p.FullName);e);

        }

Build,然后Run Test,結果Pass:

如何使用xUnit為.net core程序進行單元測試

忽略大小寫 ignoreCase:

string默認的Assert是區(qū)分大小寫的,這樣就會失敗:

如何使用xUnit為.net core程序進行單元測試

可以為這些方法添加一個參數(shù)ignoreCase設置為true,就會忽略大小寫:

如何使用xUnit為.net core程序進行單元測試

包含子字符串 Contains

        [Fact]

        public void CalculateFullNameSubstring()

        {

            var p = new Patient

            {

                FirstName = "Nick",

                LastName = "Carter"

            };

            Assert.Contains("ck Ca", p.FullName);

        }

Build,測試結果Pass。

正則表達式,Matches

測試一下First name和Last name的首字母是不是大寫的:

        [Fact]

        public void CalculcateFullNameWithTitleCase()

        {

            var p = new Patient

            {

                FirstName = "Nick",

                LastName = "Carter"

            };

            Assert.Matches("[A-Z]{1}{a-z}+ [A-Z]{1}[a-z]+", p.FullName);

        }

Build,測試通過。

數(shù)值 Assert

首先為Patient類添加一個property: BloodSugar。

    public class Patient

    {

        public Patient()

        {

            IsNew = true;

            _bloodSugar = 5.0f;

        }

        private float _bloodSugar;

        public float BloodSugar

        {

            get { return _bloodSugar; }

            set { _bloodSugar = value; }

        }

        ...

Equal:

[Fact]      
 public void BloodSugarStartWithDefaultValue()        {            var p = new Patient();            Assert.Equal(5.0, p.BloodSugar);        }

Build,測試通過。

范圍, InRange:

首先為Patient類添加一個方法,病人吃飯之后血糖升高:

      public void HaveDinner()

        {

            var random = new Random();

            _bloodSugar += (float)random.Next(1, 1000) / 100; //  應該是1000

        }

添加test:

        [Fact]

        public void BloodSugarIncreaseAfterDinner()

        {

            var p = new Patient();

            p.HaveDinner();

            // Assert.InRange<float>(p.BloodSugar, 5, 6);

            Assert.InRange(p.BloodSugar, 5, 6);

        }

Build,Run Test,結果Fail:

如何使用xUnit為.net core程序進行單元測試

可以看到期待的Range和實際的值,這樣很好。如果你使用Assert.True(xx >= 5 && xx <= 6)的話,錯誤信息只能顯示True或者False。

因為HaveDinner方法里,表達式的分母應該是1000,修改后,Build,Run,測試Pass

到此,關于“如何使用xUnit為.net core程序進行單元測試”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

當前文章:如何使用xUnit為.netcore程序進行單元測試
分享路徑:http://chinadenli.net/article16/gshcgg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供用戶體驗虛擬主機企業(yè)建站App開發(fā)做網(wǎng)站全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網(wǎng)站建設