asp.net core 使用 TestServer 來做整合測試
導讀 |
之前我的專案裡的整合測試是隨機一個埠,每次都真實的啟動一個 WebServer,之前也有看到過微軟文件上 TestServer 的介紹,當時沒仔細看過以為差不多就沒用,一直是啟動了一個真正的 WebServer 去跑整合測試的,上次分享 Xunit.DependencyInjection 改造測試專案的時候,寫的爛程式碼被大師看到了之後, 大師建議用 TestServer 來做整合測試,使用 TestServer 不會真正的佔用埠號,不會出現許可權問題,於是扒了扒 TestServer 的原始碼,並用 TestServer 改進了整合測試專案,感謝大師[獻花鮮花]~~ |
之前的整合測試監聽了一個埠號,使用了一個真實的 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 中定義的。
ClientHandler 重寫了 HttpClientHandler 的 SendAsync 方法,使得請求直接攔截掉,不會真正的發生 Http 請求,實際的請求過程首先將 Http 請求的資訊轉換成 HttpRquestFeature 然後直接交給 TestServer 處理,其實也就是直接交給 asp.net core 的請求管道去處理,請求處理結束之後,獲取 HttpContext 響應,獲取 HttpResponseFeature 然後轉換成 HttpClient 需要的 HttpResponseMessage.
TestServer 不僅僅可以支援 HTTP 請求的處理,還支援 WebSocket 的處理,WebSocket 的整合測試也可以使用 TestServer 來處理。
你如果還是比較懷疑是否真的沒有 HTTP 請求,可以用 Fildder 之類的 HTTP 抓包工具監控在跑測試的期間是否真的有 HTTP 請求,如果是真正的 WebServer 會有 HTTP 請求,TestServer 不會有 HTTP 請求。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2740185/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 體驗 ASP.NET Core 整合測試三劍客:xUnit.net、TestServer、EF Core InMemoryASP.NETServer
- ASP.NET Core Web API 整合測試ASP.NETWebAPI
- ASP.NET Core Web API 整合測試中使用 Bearer TokenASP.NETWebAPI
- 實戰指南:使用 xUnit 和 ASP.NET Core 進行整合測試【完整教程】ASP.NET
- ASP.NET Core 2.0 整合測試無法執行的問題ASP.NET
- 使用grpcui測試ASP.NET core gRPC服務RPCUIASP.NET
- asp.net core 整合JWTASP.NETJWT
- asp.net core 整合 PrometheusASP.NETPrometheus
- 測試 ASP.NET Core API ControllerASP.NETAPIController
- ASP.NET Core 整合測試中通過 Serilog 向控制檯輸出日誌ASP.NET
- 【效能測試】使用ab做Http效能測試HTTP
- Api閘道器Kong整合Consul做服務發現及在Asp.Net Core中的使用APIASP.NET
- asp.net core 整合swagger uiASP.NETSwaggerUI
- ASP.NET Core ----ASP.NET Core中使用Code FirstASP.NET
- 【Jeffrey Zhao】不妨來做個嘗試:UpdatePanel for ASP.NET MVCASP.NETMVC
- 自動化測試資料生成:Asp.Net Core單元測試利器AutoFixture詳解ASP.NET
- 使用Wiremock進行整合測試 - kubilayREMMock
- 使用Gradle執行整合測試Gradle
- 使用 OpenTelemetry 構建 .NET 應用可觀測性(4):ASP.NET Core 應用中整合 OTelASP.NET
- 使用 Moq 測試.NET Core 應用 -- 其它
- ASP.NET Core2利用MassTransit整合RabbitMQASP.NETMQ
- ASP.NET Core整合Zipkin鏈路跟蹤ASP.NET
- 使用遠端Docker進行整合測試Docker
- 使用 Moq 測試.NET Core 應用 -- Mock 方法Mock
- 使用 Moq 測試.NET Core 應用 - Why Moq?
- [轉載]使用uiautomator做UI測試UI
- 使用 testng 做介面自動化測試
- 在ASP.NET Core中用HttpClient(六)——ASP.NET Core中使用HttpClientFactoryASP.NETHTTPclient
- ASP.NET 5 已終結,迎來 ASP.NET Core 1.0 和 .NET Core 1.0ASP.NET
- ASP.NET Core 中使用TypeScriptASP.NETTypeScript
- Android單元測試(6):使用dagger2來做依賴注入Android依賴注入
- 使用 Xcode Server 持續整合 & 打包測試XCodeServer
- ASP.Net Core5.0 EF Core使用記錄ASP.NET
- 使用 Moq 測試.NET Core 應用 -- Mock 行為Mock
- 使用 Moq 測試.NET Core 應用 -- Mock 屬性Mock
- 大型專案裡Flutter測試應用例項整合測試深度使用Flutter
- flutter driver 整合測試Flutter
- 使用 JMH 做 Kotlin 的基準測試Kotlin