asp.net core 使用 TestServer 來做集成測驗
Intro
之前我的專案里的集成測驗是隨機一個埠,每次都真實的啟動一個 WebServer,之前也有看到過微軟檔案上 TestServer 的介紹,當時沒仔細看過以為差不多就沒用,一直是啟動了一個真正的 WebServer 去跑集成測驗的,上次分享 Xunit.DependencyInjection 改造測驗專案的時候,寫的爛代碼被大師看到了之后, 大師建議用 TestServer 來做集成測驗,使用 TestServer 不會真正的占用埠號,不會出現權限問題,于是扒了扒 TestServer 的原始碼,并用 TestServer 改進了集成測驗專案,感謝大師[獻花鮮花]~~
Sample
之前的集成測驗監聽了一個埠號,使用了一個真實的 WebServer,下面改成使用 TestServer
TestServer 現在是在 Microsoft.AspNetCore.TestHost 這個 Nuget 包中,參考這個包就可以使用了
在服務注冊的時候呼叫 UseTestServer 這一擴展方法就可以注入 TestServer 了,集成測驗一般會用 HttpClient 來請求服務器端的 API 地址或頁面,TestServer 提供了一個方便的 CreateClient 的方法可以很方便的創建一個用來請求 TestServer 的 HttpClient,微軟也提供了一些比較方便的擴展方法,可以使用 IHost 的 GetTestClient 擴展方法來獲取 HttpClient
改成使用 TestServer 很簡單,參考 nuget 包 Microsoft.AspNetCore.TestHost,變更對比如下:

原始碼概覽
TestServer 在啟動的時候并沒有監聽埠,可以參考原始碼 IServer 的 Start

TestServer 通過 CreateClient 方法來創建呼叫 TestServer 介面的 HttpClient

通過上面的代碼可以看的出來核心代碼是在 ClientHandler 中定義的,原始碼有點多,詳細可以直接看原始碼 https://github.com/dotnet/aspnetcore/blob/v5.0.0/src/Hosting/TestHost/src/ClientHandler.cs#L58

ClientHandler 重寫了 HttpClientHandler 的 SendAsync 方法,使得請求直接攔截掉,不會真正的發生 Http 請求,實際的請求程序首先將 Http 請求的資訊轉換成 HttpRquestFeature 然后直接交給 TestServer 處理,其實也就是直接交給 asp.net core 的請求管道去處理,請求處理結束之后,獲取 HttpContext 回應,獲取 HttpResponseFeature 然后轉換成 HttpClient 需要的 HttpResponseMessage.
More
TestServer 不僅僅可以支持 HTTP 請求的處理,還支持 WebSocket 的處理,WebSocket 的集成測驗也可以使用 TestServer 來處理,
你如果還是比較懷疑是否真的沒有 HTTP 請求,可以用 Fildder 之類的 HTTP 抓包工具監控在跑測驗的期間是否真的有 HTTP 請求,如果是真正的 WebServer 會有 HTTP 請求,TestServer 不會有 HTTP 請求,
Reference
- https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-5.0
- https://github.com/dotnet/aspnetcore/tree/v5.0.0/src/Hosting/TestHost/src
- https://github.com/dotnet/aspnetcore/tree/v5.0.0/src/Hosting/TestHost/src/TestServer.cs
- https://github.com/dotnet/aspnetcore/blob/v5.0.0/src/Hosting/TestHost/src/ClientHandler.cs#L58
- https://github.com/OpenReservation/ReservationServer/blob/3.1.0/OpenReservation.API.Test/Startup.cs#L26
- https://github.com/OpenReservation/ReservationServer/commit/e683065bf76e3c51688238c382b2c1f0c8028e7d
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/225238.html
標籤:.NET Core
