C# 使用Xunit 框架进行代码测试
生活随笔
收集整理的這篇文章主要介紹了
C# 使用Xunit 框架进行代码测试
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
如何引用xunit 管理包,和新建測試類這里就不在一一進行詳說,可以自行搜索。
為啥要進行代碼測試,這樣能有效減少我們代碼種的bug.好處多多,這里也不在進行贅述。
主要測試代碼:
using DemoXUnitText; using System; using Xunit;/*當(dāng)一個測試方法需要多組測試參數(shù)時候,Fact 標識屬性已經(jīng)不能滿足我們的需求,我們需要另外一種方式,InlineData,Theory 屬性標識 請看方式11方法雖然能夠?qū)崿F(xiàn)批量數(shù)據(jù)的測試,但是參數(shù)還是只能寫到測試代碼中,如果能夠讀取某個特定文件和數(shù)據(jù)庫就好了,請看方法二使用MemberData(屬性名,MemberType=類名) 標識進行方法標識,要求靜態(tài)字段,實現(xiàn)IEnumerable<Object[]>接口. 在加載靜態(tài)字段也可以通過IO來讀取數(shù)據(jù),進行測試。Over*/ namespace DemoText {[Trait("Calculator","計算機")]public class CalculatorTests{[Fact]public void CalculatorAdd(){//arrange var sut = new Calculator();//actint result = sut.Add(1, 4);//assertAssert.Equal(5, result);}[Trait("Cal","DataTestOne")][Theory][InlineData(1,2,3)][InlineData(2,3,5)]public void CalcultorAddMethodOne(int x,int y, int expectedNu){var sut = new Calculator();//actint result = sut.Add(x, y);//assert Assert.Equal(expectedNu, result);}[Trait("Cal", "DataTestTwo")][Theory][MemberData(nameof(TestData.DataTest),MemberType =typeof(TestData))]public void CalcultorAddMethodTwo(int x, int y, int expectedNu){var sut = new Calculator();//actint result = sut.Add(x, y);//assert Assert.Equal(expectedNu, result);}[Fact]public void CalculatorFlag(){//arrangevar sut = new Calculator();//actbool flag = sut.GetFlag();//assertAssert.True(flag);}} }//另一個類的測試
using DemoXUnitText; using System; using System.Collections.Generic; using System.Text; using Xunit; using Xunit.Abstractions;/*自定義信息輸出,要想在測試中和控制臺一樣的輸出, 需要實現(xiàn)ITestOutputHelper 進行依賴注入操作見構(gòu)造函數(shù)*//*如果測試中要釋放一些非托管代碼資源,可以實現(xiàn)IDisposable 接口詳情請見在 實現(xiàn)接口的偽代碼*//*有時候我們new一個測試對象相當(dāng)消耗時間, 例如下面中filter的 sut,如何創(chuàng)建一個通用上下文呢,此處要使用依賴注入。在測試類中實現(xiàn)一個泛型接口,IClassFixture*/namespace DemoText {public class PatientTests:IDisposable, IClassFixture<PatientFixTrue>//ICollectionFixture<PatientFixTrue>{private Patient sut;private readonly ITestOutputHelper _outPut;private int disSumNu = 0;//運行每一個測試方法都會走構(gòu)造函數(shù)public PatientTests(ITestOutputHelper output,PatientFixTrue patFixTrue){//assert//this.sut = new Patient();this.sut = patFixTrue.patient;sut.FirstName = "Bob";sut.LastName = "Man";//保存輸出幫助類this._outPut = output;}//Trait標記進行測試分組標記 key-value//一個方法名可以添加多個表示//也可可以作用到類級別[Trait("Pat","HeartBate")][Trait("Be","New")][Fact]public void PatientMeasurHeartbate(){//actint heartNu = sut.MeasurHeartbate();//assertAssert.InRange<int>(heartNu, 10, 100);}[Trait("Pat","Name")][Fact]public void PatentCheckFisrtName(){Assert.EndsWith("b", sut.FirstName);Assert.Contains("Bob", sut.FirstName);Assert.NotEqual("bob", sut.FirstName);Assert.Matches(@"^[a-zA-Z]+$", sut.FirstName);}//不需要運行某個測試可以在 Fact 標簽中添加 skip="注釋"[Fact(Skip ="跳過這個測試Create")]public void BeNewWhenCreate(){var result = sut.IsNew;Assert.True(result);}[Fact]public void HaveNoAddressWhenCreate(){Assert.Null(sut.HomeAddress);_outPut.WriteLine("測試文本信息輸出,自定義的。");}[Fact]public void HaveHadAccountProterty(){sut.AccountList.Add("賬戶1:1234");sut.AccountList.Add("賬戶2:456");sut.AccountList.Add("賬戶3:789");// Assert.Contains("1234", sut.AccountList);Assert.DoesNotContain("莊戶", sut.AccountList);Assert.Contains(sut.AccountList, ret => ret.Contains("1234"));List<string> ls = new List<string>();//Assert.Equal(sut.AccountList, ls);//判斷結(jié)果集所有的元素都包含 "賬戶"//Assert.All(sut.AccountList, x => x.Contains("賬戶"));//也可以這樣寫Assert.All(sut.AccountList, ret => Assert.Contains("賬戶", ret));Assert.All(sut.AccountList, ret=>Assert.True(ret.Length>=2));}[Trait ("Be","New")][Fact]public void BeAPatient(){Assert.IsType<Patient>(sut);Assert.IsAssignableFrom<Patient>(sut);}[Trait("Be", "New")][Fact]public void BeAAcctionHappen(){Assert.Raises<EventArgs>(handler=>sut.SleepEvent+=handler,handler=>sut.SleepEvent-=handler,()=>sut.Sleep());}public void Dispose(){_outPut.WriteLine("現(xiàn)在測試結(jié)束開始釋放非托管資源,運行次數(shù):{0}",this.disSumNu++);}} }源碼文件:https://download.csdn.net/download/weixin_43542114/16217298
總結(jié)
以上是生活随笔為你收集整理的C# 使用Xunit 框架进行代码测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是脏检查?
- 下一篇: 计算机网络符号意思,浅析网络语言中的符号