日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

asp.net core 使用 TestServer 来做集成测试

發布時間:2023/12/4 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,變更對比如下:

diff

源碼概覽

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

  • 使用 Xunit.DependencyInjection 改造測試項目

總結

以上是生活随笔為你收集整理的asp.net core 使用 TestServer 来做集成测试的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。