前言 在這回中主要介紹C#的單元測試。 將會以AspNetCore中的xUnit、Moq套件進行範例測試。
至於為什麼要單元測試? 因為能夠快速的驗證結果、在撰寫時也只要執行片段程式碼。 對於有些程式碼容易有改A壞B的問題,能夠透過測試直接幫我們一次測完。 讓我們只需要針對錯誤案例進行程式碼錯誤區塊修改,加快整體專案除錯的時間。
完整測試專案連結:https://github.com/yuhsiang237/csharp-unit-test
範例 使用Moq套件的Mock建立假的物件,並且設定函式、屬性、返回的值,再使用xUnit提供的驗證方法進行測試。
首先建立我們要測試的介面與類別,一個是IFoo.cs、Bar.cs。
csharp-unit-test/UnitTestProject/Bar.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 using System;using System.Collections.Generic;using System.Text;namespace UnitTestProject { public class Bar { public virtual bool Submit ( ) { return false ; } } }
csharp-unit-test/UnitTestProject/IFoo.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 using System;using System.Collections.Generic;using System.Text;namespace UnitTestProject { public interface IFoo { Bar Bar { get ; set ; } string Name { get ; set ; } int Value { get ; set ; } bool DoSomething (string value ) ; } }
再來建立測試,使用Moq、Xunit。 我們可以對函式返回值、假物件、屬性進行測試。 以下為測試範例:/csharp-unit-test/UnitTestProjectTests/UnitTest.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 using System;using Xunit;using Moq;using UnitTestProject;namespace UnitTestProjectTests { public class UnitTest { [Fact ] public void MethodsTest ( ) { var mock = new Mock<IFoo>(); mock.Setup(foo => foo.DoSomething("ping" )).Returns(true ); IFoo foo = mock.Object; Assert.True(foo.DoSomething("ping" )); } [Fact ] public void PropertiesTest ( ) { var mock = new Mock<IFoo>(); mock.SetupProperty(f => f.Name); mock.SetupProperty(f => f.Name, "foo" ); IFoo foo = mock.Object; Assert.Equal("foo" , foo.Name); foo.Name = "bar" ; Assert.Equal("bar" , foo.Name); } } }
再來開啟VisualStudio的測試視窗運行,可以得到以下結果:
表示測試成功。
總結 撰寫測試能夠改善平常除錯的速度,特別當專案大起來時。 此外有些平台有測試的功能(如Azure DevOps Server的TFS),可以在CI自動整合時跑測試。
參考資料