本文演示Util應(yīng)用框架開發(fā)的項目中如何編寫集成測試.
準(zhǔn)備
完成 Web Api 快速入門,本文將在之前生成的示例項目上講解集成測試的開發(fā).
測試概述
自動化測試對于Util應(yīng)用框架的開發(fā)非常重要,它能保證基礎(chǔ)功能的穩(wěn)定性.
對于使用 Util 開發(fā)的業(yè)務(wù)項目,自動化測試不是必須的,但掌握它可能很有用.
如果你使用 Util 開發(fā) Web API,可能會使用 Swagger 進(jìn)行測試.
將 Swagger 提供給前端人員是合適的,但后端人員使用它卻不夠省力.
原因很簡單,使用 Swagger 測試 API,需要設(shè)置一堆參數(shù),這些參數(shù)無法保存,每次運(yùn)行都需要設(shè)置.
使用 .Net 自動化測試會更加方便,并且現(xiàn)在開發(fā)集成測試的成本很低.
專業(yè)測試的分類非常細(xì),下面簡要討論自動化功能測試.
測試分類
這里粗略的對自動化功能測試概括為兩類:
-
單元測試
- 隔絕外部依賴,僅測試自身的某些功能.
- 如果需要訪問外部依賴,通過定義抽象接口的方式使用,不能直接引用.
- 在 Util 分層架構(gòu)中,一般對領(lǐng)域?qū)訉嶓w,值對象,領(lǐng)域服務(wù)實施單元測試.
-
集成測試
- 直接訪問外部依賴,對關(guān)聯(lián)的所有類型進(jìn)行測試.
- 在 Util 分層架構(gòu)中,一般對基礎(chǔ)設(shè)施層倉儲,應(yīng)用層應(yīng)用服務(wù)和API接口進(jìn)行集成測試.
測試的好處
修改任何一行業(yè)務(wù)代碼,都有可能影響之前的邏輯.
自動化測試基于對業(yè)務(wù)功能的預(yù)期反應(yīng),如果預(yù)期未發(fā)生變化,但你的代碼邏輯出現(xiàn)變化,就能幫你攔截這個錯誤.
測試的弊端
-
除了開發(fā)自動化測試本身的成本以外,更大的成本在于維護(hù).
-
每當(dāng)需求變更,需要刪除已經(jīng)過時的測試,開發(fā)新的測試,修改之前的測試以符合當(dāng)前預(yù)期.
測試編寫條件
自動化測試的語法非常簡單,但并不是掌握了測試語法就能編寫出有效的測試.
編寫單元測試需要開發(fā)人員有一定抽象思維,能夠抽象和隔離依賴,還需要了解一些單元測試技巧.
不要在公司全面推行單元測試,容易變成形式主義,僅讓團(tuán)隊核心骨干對高價值業(yè)務(wù)模塊編寫單元測試.
集成測試則要簡單得多,只要懂得測試語法就可以編寫.
集成測試由于直接訪問外部依賴,運(yùn)行緩慢,而且任何環(huán)節(jié)變更都可能導(dǎo)致測試失敗,所以不宜大量編寫.
你是否需要它?
-
如果你僅負(fù)責(zé)編寫 Web API ,手頭沒有現(xiàn)成的UI進(jìn)行測試,編寫集成測試比使用 Swagger 省力.
-
如果你沒有打算持續(xù)維護(hù)這些測試,不要編寫它們,那只會浪費(fèi)時間.
-
如果你的團(tuán)隊精力有限,無法維護(hù)大量的測試,可以僅對高業(yè)務(wù)價值的模塊編寫測試.
測試框架選型
-
測試框架
- XUnit.Net - 提供基礎(chǔ)測試語法.
- XUnit.DependencyInjection - 為測試框架提供依賴注入能力.
-
模擬框架
- Moq - 為依賴服務(wù)接口創(chuàng)建模擬實現(xiàn).
-
數(shù)據(jù)偽造框架
- Bogus - 為集成測試生成偽數(shù)據(jù)
- AutoBogus - Bogus 的擴(kuò)展
Util集成測試開發(fā)入門
單元測試用于測試復(fù)雜的業(yè)務(wù)邏輯,由于快速入門Demo僅包含簡單CRUD操作,無法演示單元測試的用法.
下面介紹在Util項目中如何開發(fā)集成測試.
運(yùn)行示例項目
打開示例項目解決方案 Demo.sln,查看 test 子目錄,它包含4個測試項目.
生成的測試項目已經(jīng)將環(huán)境配置完成,你可以直接開始編寫測試.
Demo.Domain.Tests 是領(lǐng)域?qū)拥膯卧獪y試項目,如果你不需要編寫單元測試,直接刪掉它.
其它三個項目用于集成測試,下面分別介紹.
數(shù)據(jù)訪問層集成測試
Demo.Data.SqlServer.Tests 是數(shù)據(jù)訪問層 Sql Server 集成測試項目.
如果支持多種數(shù)據(jù)庫,則每種數(shù)據(jù)庫應(yīng)包含一個數(shù)據(jù)訪問層集成測試項目.
數(shù)據(jù)訪問層測試的重點是倉儲.
打開 StudentRepositoryTest 學(xué)生倉儲測試類.
在 StudentRepositoryTest 的構(gòu)造方法中注入了依賴接口 IDemoUnitOfWork 和 IStudentRepository.
Util 代碼生成模板默認(rèn)會創(chuàng)建 TestAddAsync 方法,它用于測試添加實體.
該測試使用偽數(shù)據(jù)生成框架創(chuàng)建學(xué)生實體,并通過倉儲保存到數(shù)據(jù)庫.
不宜編寫過多的CRUD集成測試,通常保留一兩個即可.
它們的作用不是測試邏輯,而是迅速識別開發(fā)環(huán)境是否通暢.
特別是當(dāng)你升級框架或類庫時,有幾個簡單的集成測試非常有用.
運(yùn)行數(shù)據(jù)訪問層集成測試
打開 appsettings.Development.json 配置文件,檢查連接字符串是否正確.
{
"ConnectionStrings": {
"connection": "Server=.;Database=Demo.Data.Test;uid=sa;pwd=Pass@word;TrustServerCertificate=true"
}
}
Demo示例的數(shù)據(jù)訪問層測試數(shù)據(jù)庫名為 Demo.Data.Test ,運(yùn)行測試時, EntityFrameworkCore 會自動創(chuàng)建和刪除測試數(shù)據(jù)庫,非常方便.
使用 Visual Studio 運(yùn)行測試
右鍵單擊 TestAddAsync 方法,彈出菜單選擇 運(yùn)行測試.
彈出 測試資源管理器 窗口,并自動運(yùn)行測試.
使用 Resharper 運(yùn)行測試
如果你安裝了Resharper, VS中的測試方法會在左側(cè)顯示測試圖標(biāo),如下圖所示.
點擊 Run 按鈕,運(yùn)行測試.
應(yīng)用層集成測試
應(yīng)用層集成測試包含 Demo.Application.Tests 和 Demo.Api.Tests 兩個測試項目.
應(yīng)用服務(wù)集成測試
Demo.Application.Tests 側(cè)重于測試應(yīng)用服務(wù),并且沒有Asp.Net Core相關(guān)環(huán)境干擾.
對于普通項目,大多業(yè)務(wù)邏輯會寫到應(yīng)用服務(wù)中, 所以它是比較理想的測試場所.
如果你不想維護(hù)太多測試項目,那么僅保留應(yīng)用服務(wù)集成測試即可.
打開 StudentServiceTest 測試類,代碼生成模板默認(rèn)也創(chuàng)建了一個 TestCreateAsync 測試方法.
/// <summary>
/// 學(xué)生服務(wù)測試
/// </summary>
public class StudentServiceTest {
/// <summary>
/// 學(xué)生服務(wù)
/// </summary>
private readonly IStudentService _service;
/// <summary>
/// 測試初始化
/// </summary>
public StudentServiceTest( IStudentService service ) {
_service = service;
}
/// <summary>
/// 測試創(chuàng)建
/// </summary>
[Fact]
public async Task TestCreateAsync() {
//創(chuàng)建
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 從構(gòu)造方法注入了 IStudentService 應(yīng)用服務(wù)接口.
使用偽數(shù)據(jù)生成框架創(chuàng)建DTO,并調(diào)用服務(wù)保存數(shù)據(jù).
Web Api集成測試
Demo.Api.Tests 用于測試 Web Api控制器,它的測試環(huán)境要復(fù)雜一些.
打開 StudentControllerTest 測試類.
/// <summary>
/// 學(xué)生控制器測試
/// </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>
/// 測試創(chuàng)建
/// </summary>
[Fact]
public async Task TestCreateAsync() {
//服務(wù)地址
var url = "/api/student";
//創(chuàng)建實體
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的測試需要發(fā)送請求給控制器,并接收響應(yīng)結(jié)果,所以需要一個Http客戶端.
StudentControllerTest 構(gòu)造方法注入 Util Http客戶端接口,將接口傳遞給 TestBase 基類.
TestBase 進(jìn)一步封裝對 GET, POST ,PUT ,DELETE 操作請求,以簡化測試的編寫.
默認(rèn)生成的 TestCreateAsync 方法,使用偽數(shù)據(jù)生成框架創(chuàng)建DTO, 并使用 Post 請求指定 Url.
Web Api 控制器返回 Util 約定的特定消息.
對于開發(fā) Web Api, 該集成測試能更好的反映與前端的交互.
運(yùn)行 Web Api集成測試,如下所示.文章來源:http://www.zghlxwxcb.cn/news/detail-711089.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-711089.html
到了這里,關(guān)于Util應(yīng)用框架快速入門(4) - 集成測試開發(fā)入門的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!