ASP.NET Core搭建多層網站架構【3-xUnit單元測試之簡單方法測試】

2020/01/28, ASP.NET Core 3.1, VS2019, xUnit 2.4.0html

摘要:基於ASP.NET Core 3.1 WebApi搭建後端多層網站架構【3-xUnit單元測試之簡單方法測試】
使用xUnit編寫單元測試,測試上一章節的基礎公共庫git

文章目錄github

此分支項目代碼後端

上一章節已經創建了Common公共類庫,本章節介紹編寫簡單的單元測試,對上一章節的公共類庫中EnumExtension方法編寫單元測試,同時也是介紹上一章節中公共類庫EnumExtension的使用方法
官方文檔對測試的最佳實踐架構

新建測試項目

在tests解決方案文件夾下,新建xUnit測試項目,存放在解決方案tests路徑下:

我這裏測試項目名稱規則爲"測試目標項目名稱+Tests",這裏測試的是Common項目,因此測試項目取名CommonTests
項目新建成功後,記得要引用MS.Common類庫單元測試

新建一個枚舉用於測試

既然是爲了測試枚舉方法,固然須要先有一個枚舉StatusCodeEnum.cs類,就存放在測試項目下:測試

using System.ComponentModel;

namespace CommonTests
{
    public enum StatusCode
    {
        [Description("已刪除")]
        Deleted = -1,//軟刪除,已刪除的沒法恢復,沒法看見,暫未使用
        [Description("生效")]
        Enable = 0,
        [Description("失效")]
        Disable = 1//失效的還能夠改成生效
    }
}

編寫枚舉方法測試代碼

把原先的UnitTest1.cs刪除,新建EnumExtensionTest.cs類:
能夠看到我這裏測試類命名規則爲"測試目標類名稱+Test",這裏測試的是EnumExtension類,因此取名爲EnumExtensionTest
將EnumExtensionTest類修改成pulic類型
在其中添加測試一個測試方法:網站

[Fact]
[Trait("GetEnum", "itemName")]
public void GetEnum_EnumName_ReturnCorrespondEnum()
{
    //Arrange
    StatusCode statusCode = StatusCode.Deleted;

    //Act
    string actual = statusCode.ToString();

    //Assert
    Assert.Equal(statusCode, actual.GetEnum<StatusCode>());
}
  • 測試類必須是public類型
  • 測試用例須要打上[Fact]特性標記,Fact特性還能夠給測試用例取別名
  • Trait特性能夠對測試用例進行分組說明
  • 更多特性和使用方法能夠搜索相關資源
  • 測試方法命名規則爲"要測試的方法的名稱+測試的方案+調用方案時的預期行爲":
    • 此處測的是GetEnum方法,使用Enum名稱,獲取對應的枚舉
    • 因此叫GetEnum_EnumName_ReturnCorrespondEnum
    • 總體方法名要易於理解測試的目的
  • 測試要分爲三部分(AAA):Arrange、Act、Assert:
    • 安排對象,根據須要對其進行建立和設置
    • 做用於對象
    • 斷言某些項按預期進行

運行測試

在VS中"測試"-"測試資源管理器",打開測試資源管理器:
spa

在測試資源管理器中已經能夠看到咱們剛剛寫的測試用例。
點擊運行全部測試:
3d

等待測試結束,便會給出測試結果:

以上即是最簡單的單元測試流程
針對EnumExtension方法完整的測試用例代碼:

using MS.Common.Extensions;
using Xunit;

namespace CommonTests
{
    public class EnumExtensionTest
    {
        [Fact]
        [Trait("GetEnum", "itemName")]
        public void GetEnum_EnumName_ReturnCorrespondEnum()
        {
            //Arrange
            StatusCode statusCode = StatusCode.Deleted;

            //Act
            string actual = statusCode.ToString();

            //Assert
            Assert.Equal(statusCode, actual.GetEnum<StatusCode>());
        }
        [Fact]
        [Trait("GetEnum", "itemValue")]
        public void GetEnum_EnumValue_ReturnCorrespondEnum()
        {
            //Arrange
            StatusCode statusCode = StatusCode.Disable;

            //Act
            int actual = statusCode.GetHashCode();

            //Assert
            Assert.Equal(statusCode, actual.GetEnum<StatusCode>());
        }

        [Fact]
        [Trait("GetEnumName", "itemValue")]
        public void GetEnumName_EnumValue_ReturnCorrespondEnumName()
        {
            //Arrange
            StatusCode statusCode = StatusCode.Enable;

            //Act
            int actual = statusCode.GetHashCode();

            //Assert
            Assert.Equal(statusCode.ToString(), actual.GetEnumName<StatusCode>());
        }

        [Fact]
        [Trait("GetEnumValue", "itemName")]
        public void GetEnumValue_EnumName_ReturnCorrespondEnumValue()
        {
            //Arrange
            StatusCode statusCode = StatusCode.Disable;

            //Act
            string actual = statusCode.ToString();

            //Assert
            Assert.Equal(statusCode.GetHashCode(), actual.GetEnumValue<StatusCode>());
        }

        [Fact]
        [Trait("GetDescription", "Enum")]
        public void GetDescription_Enum_ReturnCorrespondEnumDescription()
        {
            //Arrange
            StatusCode statusCode = StatusCode.Deleted;

            //Assert
            Assert.Equal("已刪除", statusCode.GetDescription());
        }
    }
}

添加了一個簡單的單元測試用例,介紹了最基本的單元測試流程和方法

項目完成後,以下圖所示

相關文章
相關標籤/搜索