本文演示Util應用框架開發的項目中如何編寫集成測試. 準備 完成 Web Api 快速入門,本文將在之前生成的示例項目上講解集成測試的開發. 測試概述 自動化測試對於Util應用框架的開發非常重要,它能保證基礎功能的穩定性. 對於使用 Util 開發的業務項目,自動化測試不是必須的,但掌握它可能很 ...
本文演示Util應用框架開發的項目中如何編寫集成測試.
準備
完成 Web Api 快速入門,本文將在之前生成的示例項目上講解集成測試的開發.
測試概述
自動化測試對於Util應用框架的開發非常重要,它能保證基礎功能的穩定性.
對於使用 Util 開發的業務項目,自動化測試不是必須的,但掌握它可能很有用.
如果你使用 Util 開發 Web API,可能會使用 Swagger 進行測試.
將 Swagger 提供給前端人員是合適的,但後端人員使用它卻不夠省力.
原因很簡單,使用 Swagger 測試 API,需要設置一堆參數,這些參數無法保存,每次運行都需要設置.
使用 .Net 自動化測試會更加方便,並且現在開發集成測試的成本很低.
專業測試的分類非常細,下麵簡要討論自動化功能測試.
測試分類
這裡粗略的對自動化功能測試概括為兩類:
-
單元測試
- 隔絕外部依賴,僅測試自身的某些功能.
- 如果需要訪問外部依賴,通過定義抽象介面的方式使用,不能直接引用.
- 在 Util 分層架構中,一般對領域層實體,值對象,領域服務實施單元測試.
-
集成測試
- 直接訪問外部依賴,對關聯的所有類型進行測試.
- 在 Util 分層架構中,一般對基礎設施層倉儲,應用層應用服務和API介面進行集成測試.
測試的好處
修改任何一行業務代碼,都有可能影響之前的邏輯.
自動化測試基於對業務功能的預期反應,如果預期未發生變化,但你的代碼邏輯出現變化,就能幫你攔截這個錯誤.
測試的弊端
-
除了開發自動化測試本身的成本以外,更大的成本在於維護.
-
每當需求變更,需要刪除已經過時的測試,開發新的測試,修改之前的測試以符合當前預期.
測試編寫條件
自動化測試的語法非常簡單,但並不是掌握了測試語法就能編寫出有效的測試.
編寫單元測試需要開發人員有一定抽象思維,能夠抽象和隔離依賴,還需要瞭解一些單元測試技巧.
不要在公司全面推行單元測試,容易變成形式主義,僅讓團隊核心骨幹對高價值業務模塊編寫單元測試.
集成測試則要簡單得多,只要懂得測試語法就可以編寫.
集成測試由於直接訪問外部依賴,運行緩慢,而且任何環節變更都可能導致測試失敗,所以不宜大量編寫.
你是否需要它?
-
如果你僅負責編寫 Web API ,手頭沒有現成的UI進行測試,編寫集成測試比使用 Swagger 省力.
-
如果你沒有打算持續維護這些測試,不要編寫它們,那隻會浪費時間.
-
如果你的團隊精力有限,無法維護大量的測試,可以僅對高業務價值的模塊編寫測試.
測試框架選型
-
測試框架
- XUnit.Net - 提供基礎測試語法.
- XUnit.DependencyInjection - 為測試框架提供依賴註入能力.
-
模擬框架
- Moq - 為依賴服務介面創建模擬實現.
-
數據偽造框架
Util集成測試開發入門
單元測試用於測試複雜的業務邏輯,由於快速入門Demo僅包含簡單CRUD操作,無法演示單元測試的用法.
下麵介紹在Util項目中如何開發集成測試.
運行示例項目
打開示例項目解決方案 Demo.sln,查看 test 子目錄,它包含4個測試項目.
生成的測試項目已經將環境配置完成,你可以直接開始編寫測試.
Demo.Domain.Tests 是領域層的單元測試項目,如果你不需要編寫單元測試,直接刪掉它.
其它三個項目用於集成測試,下麵分別介紹.
數據訪問層集成測試
Demo.Data.SqlServer.Tests 是數據訪問層 Sql Server 集成測試項目.
如果支持多種資料庫,則每種資料庫應包含一個數據訪問層集成測試項目.
數據訪問層測試的重點是倉儲.
打開 StudentRepositoryTest 學生倉儲測試類.
在 StudentRepositoryTest 的構造方法中註入了依賴介面 IDemoUnitOfWork 和 IStudentRepository.
Util 代碼生成模板預設會創建 TestAddAsync 方法,它用於測試添加實體.
該測試使用偽數據生成框架創建學生實體,並通過倉儲保存到資料庫.
不宜編寫過多的CRUD集成測試,通常保留一兩個即可.
它們的作用不是測試邏輯,而是迅速識別開發環境是否通暢.
特別是當你升級框架或類庫時,有幾個簡單的集成測試非常有用.
運行數據訪問層集成測試
打開 appsettings.Development.json 配置文件,檢查連接字元串是否正確.
{
"ConnectionStrings": {
"connection": "Server=.;Database=Demo.Data.Test;uid=sa;pwd=Pass@word;TrustServerCertificate=true"
}
}
Demo示例的數據訪問層測試資料庫名為 Demo.Data.Test ,運行測試時, EntityFrameworkCore 會自動創建和刪除測試資料庫,非常方便.
使用 Visual Studio 運行測試
右鍵單擊 TestAddAsync 方法,彈出菜單選擇 運行測試.
彈出 測試資源管理器 視窗,並自動運行測試.
使用 Resharper 運行測試
如果你安裝了Resharper, VS中的測試方法會在左側顯示測試圖標,如下圖所示.
點擊 Run 按鈕,運行測試.
應用層集成測試
應用層集成測試包含 Demo.Application.Tests 和 Demo.Api.Tests 兩個測試項目.
應用服務集成測試
Demo.Application.Tests 側重於測試應用服務,並且沒有Asp.Net Core相關環境干擾.
對於普通項目,大多業務邏輯會寫到應用服務中, 所以它是比較理想的測試場所.
如果你不想維護太多測試項目,那麼僅保留應用服務集成測試即可.
打開 StudentServiceTest 測試類,代碼生成模板預設也創建了一個 TestCreateAsync 測試方法.
/// <summary>
/// 學生服務測試
/// </summary>
public class StudentServiceTest {
/// <summary>
/// 學生服務
/// </summary>
private readonly IStudentService _service;
/// <summary>
/// 測試初始化
/// </summary>
public StudentServiceTest( IStudentService service ) {
_service = service;
}
/// <summary>
/// 測試創建
/// </summary>
[Fact]
public async Task TestCreateAsync() {
//創建
var dto = StudentDtoFakeService.GetStudentDto();
var id = await _service.CreateAsync( dto );
//驗證
var result = await _service.GetByIdAsync( id );
Assert.NotNull( result );
Assert.Equal( id, result.Id );
}
}
StudentServiceTest 從構造方法註入了 IStudentService 應用服務介面.
使用偽數據生成框架創建DTO,並調用服務保存數據.
Web Api集成測試
Demo.Api.Tests 用於測試 Web Api控制器,它的測試環境要複雜一些.
打開 StudentControllerTest 測試類.
/// <summary>
/// 學生控制器測試
/// </summary>
public class StudentControllerTest : TestBase {
/// <summary>
/// 輸出工具
/// </summary>
private readonly ITestOutputHelper _testOutputHelper;
/// <summary>
/// 測試初始化
/// </summary>
public StudentControllerTest( ITestOutputHelperAccessor testOutputHelperAccessor,IHttpClient client ) : base( client ){
_testOutputHelper = testOutputHelperAccessor.Output;
}
/// <summary>
/// 測試創建
/// </summary>
[Fact]
public async Task TestCreateAsync() {
//服務地址
var url = "/api/student";
//創建實體
var dto = StudentDtoFakeService.GetStudentDto();
var result = await PostAsync<StudentDto>( url, dto );
//驗證
Assert.Equal( StateCode.Ok, result.Code );
Assert.NotEmpty( result.Data.Id );
_testOutputHelper.WriteLine( Json.ToJson( result ) );
}
}
Web Api的測試需要發送請求給控制器,並接收響應結果,所以需要一個Http客戶端.
StudentControllerTest 構造方法註入 Util Http客戶端介面,將介面傳遞給 TestBase 基類.
TestBase 進一步封裝對 GET, POST ,PUT ,DELETE 操作請求,以簡化測試的編寫.
預設生成的 TestCreateAsync 方法,使用偽數據生成框架創建DTO, 並使用 Post 請求指定 Url.
Web Api 控制器返回 Util 約定的特定消息.
對於開發 Web Api, 該集成測試能更好的反映與前端的交互.
運行 Web Api集成測試,如下所示.
Util應用框架交流群: 24791014 版權所有,轉載請註明出處 何鎮汐的技術博客 微信掃描二維碼支持Util