天天看點

asp.net core 使用 TestServer 來做內建測試

asp.net core 使用 TestServer 做內建測試

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

,變更對比如下:

asp.net core 使用 TestServer 來做內建測試

源碼概覽

TestServer 在啟動的時候并沒有監聽端口,可以參考源碼

IServer

Start

asp.net core 使用 TestServer 來做內建測試

TestServer 通過

CreateClient

方法來建立調用 TestServer 接口的 HttpClient

asp.net core 使用 TestServer 來做內建測試

通過上面的代碼可以看的出來核心代碼是在

ClientHandler

中定義的,源碼有點多,詳細可以直接看源碼 https://github.com/dotnet/aspnetcore/blob/v5.0.0/src/Hosting/TestHost/src/ClientHandler.cs#L58

asp.net core 使用 TestServer 來做內建測試

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

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。