2020/01/28, ASP.NET Core 3.1, VS2019, xUnit 2.4.0
摘要:基於ASP.NET Core 3.1 WebApi搭建后端多層網站架構【3-xUnit單元測試之簡單方法測試】
使用xUnit編寫單元測試,測試上一章節的基礎公共庫
上一章節已經建立了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中"測試"-"測試資源管理器",打開測試資源管理器:
在測試資源管理器中已經可以看到我們剛剛寫的測試用例。
點擊運行所有測試:
等待測試結束,便會給出測試結果:
以上便是最簡單的單元測試流程
針對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());
}
}
}
添加了一個簡單的單元測試用例,介紹了最基本的單元測試流程和方法
項目完成后,如下圖所示