asp.net core 使用 TestServer 來(lái)做集成測(cè)試的方法
Intro
之前我的項(xiàng)目里的集成測(cè)試是隨機(jī)一個(gè)端口,每次都真實(shí)的啟動(dòng)一個(gè) WebServer,之前也有看到過(guò)微軟文檔上 TestServer
的介紹,當(dāng)時(shí)沒(méi)仔細(xì)看過(guò)以為差不多就沒(méi)用,一直是啟動(dòng)了一個(gè)真正的 WebServer 去跑集成測(cè)試的,上次分享 Xunit.DependencyInjection
改造測(cè)試項(xiàng)目的時(shí)候,寫(xiě)的爛代碼被大師看到了之后, 大師建議用 TestServer
來(lái)做集成測(cè)試,使用 TestServer
不會(huì)真正的占用端口號(hào),不會(huì)出現(xiàn)權(quán)限問(wèn)題,于是扒了扒 TestServer 的源碼,并用 TestServer
改進(jìn)了集成測(cè)試項(xiàng)目,感謝大師[獻(xiàn)花鮮花]~~
Sample
之前的集成測(cè)試監(jiān)聽(tīng)了一個(gè)端口號(hào),使用了一個(gè)真實(shí)的 WebServer,下面改成使用 TestServer
TestServer
現(xiàn)在是在 Microsoft.AspNetCore.TestHost
這個(gè) Nuget 包中,引用這個(gè)包就可以使用了
在服務(wù)注冊(cè)的時(shí)候調(diào)用 UseTestServer
這一擴(kuò)展方法就可以注入 TestServer
了,集成測(cè)試一般會(huì)用 HttpClient
來(lái)請(qǐng)求服務(wù)器端的 API 地址或頁(yè)面,TestServer
提供了一個(gè)方便的 CreateClient
的方法可以很方便的創(chuàng)建一個(gè)用來(lái)請(qǐng)求 TestServer
的 HttpClient
,微軟也提供了一些比較方便的擴(kuò)展方法,可以使用 IHost
的 GetTestClient
擴(kuò)展方法來(lái)獲取 HttpClient
改成使用 TestServer
很簡(jiǎn)單,引用 nuget 包 Microsoft.AspNetCore.TestHost
,變更對(duì)比如下:
源碼概覽
TestServer 在啟動(dòng)的時(shí)候并沒(méi)有監(jiān)聽(tīng)端口,可以參考源碼 IServer
的 Start
TestServer 通過(guò) CreateClient
方法來(lái)創(chuàng)建調(diào)用 TestServer 接口的 HttpClient
通過(guò)上面的代碼可以看的出來(lái)核心代碼是在 ClientHandler
中定義的,源碼有點(diǎn)多,詳細(xì)可以直接看源碼 https://github.com/dotnet/aspnetcore/blob/v5.0.0/src/Hosting/TestHost/src/ClientHandler.cs
ClientHandler
重寫(xiě)了 HttpClientHandler 的 SendAsync
方法,使得請(qǐng)求直接攔截掉,不會(huì)真正的發(fā)生 Http 請(qǐng)求,實(shí)際的請(qǐng)求過(guò)程首先將 Http 請(qǐng)求的信息轉(zhuǎn)換成 HttpRquestFeature 然后直接交給 TestServer 處理,其實(shí)也就是直接交給 asp.net core 的請(qǐng)求管道去處理,請(qǐng)求處理結(jié)束之后,獲取 HttpContext 響應(yīng),獲取 HttpResponseFeature 然后轉(zhuǎn)換成 HttpClient 需要的 HttpResponseMessage.
More
TestServer
不僅僅可以支持 HTTP 請(qǐng)求的處理,還支持 WebSocket 的處理,WebSocket 的集成測(cè)試也可以使用 TestServer
來(lái)處理。
你如果還是比較懷疑是否真的沒(méi)有 HTTP 請(qǐng)求,可以用 Fildder 之類(lèi)的 HTTP 抓包工具監(jiān)控在跑測(cè)試的期間是否真的有 HTTP 請(qǐng)求,如果是真正的 WebServer 會(huì)有 HTTP 請(qǐng)求,TestServer 不會(huì)有 HTTP 請(qǐng)求。
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
到此這篇關(guān)于asp.net core 使用 TestServer 來(lái)做集成測(cè)試的文章就介紹到這了,更多相關(guān)asp.net core 集成測(cè)試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 如何在Asp.Net Core中集成ABP Dapper
- 如何在Asp.Net Core中集成Refit
- asp.net core集成CKEditor實(shí)現(xiàn)圖片上傳功能的示例代碼
- 在ASP.NET Core Mvc集成MarkDown的方法
- asp.net core集成JWT的步驟記錄
- Asp.Net Core利用xUnit進(jìn)行主機(jī)級(jí)別的網(wǎng)絡(luò)集成測(cè)試詳解
- asp.net core集成MongoDB的完整步驟
- ASP.NET Core與NLog集成的完整步驟
- ASP.NET Core+Docker+Jenkins實(shí)現(xiàn)持續(xù)集成的完整實(shí)例
- asp.net core 2.0 webapi集成signalr(實(shí)例講解)
- asp.net core集成kindeditor實(shí)現(xiàn)圖片上傳功能
- ASP.NET Core 集成 React SPA應(yīng)用的步驟
相關(guān)文章
解決iis7.5服務(wù)器上.net 獲取不到https頁(yè)面的信息
讓我糾結(jié)了一天多的問(wèn)題,給大家看下,有相同情況的可以不用浪費(fèi)時(shí)間了,本人當(dāng)時(shí)找了好半天都沒(méi)找到什么有用的信息,項(xiàng)目在本地沒(méi)有問(wèn)題,但部署在服務(wù)器后,獲取不到https頁(yè)面的信息,加入下面的代碼就可以了,因?yàn)閕is7.5的安全協(xié)議比較高的原因。2014-06-06GridView_RowUpdating取不到新值的解決方法
GridView_RowUpdating取不到新值的解決方法,需要的朋友可以參考一下2013-05-05使用正則Regex來(lái)移除網(wǎng)頁(yè)的EnableViewState實(shí)現(xiàn)思路及代碼
創(chuàng)建好網(wǎng)頁(yè)時(shí),什么都沒(méi)有寫(xiě),但運(yùn)行時(shí)會(huì)發(fā)現(xiàn)源程序(View Source),下面一段,此刻,也許你會(huì)想起,在網(wǎng)頁(yè)有一個(gè)屬性EnableViewState,在某些時(shí)候我們并不需要它,接下來(lái)將介紹如何移除它,感興趣的朋友可以了解下啊2013-01-01asp.net button 綁定多個(gè)參數(shù)
asp.net button 綁定多個(gè)參數(shù)的代碼2008-11-11asp.net中button控制先執(zhí)行js再執(zhí)行后臺(tái)程序的方法
這篇文章主要介紹了asp.net中button控制先執(zhí)行js再執(zhí)行后臺(tái)程序的方法,涉及button控件與js的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01.net平臺(tái)推送ios消息的實(shí)現(xiàn)方法
這篇文章主要介紹了.net平臺(tái)推送ios消息的實(shí)現(xiàn)方法,詳細(xì)講述了各個(gè)具體的實(shí)現(xiàn)步驟并附有源碼供大家參考之用,需要的朋友可以參考下2014-10-10.net GridView分頁(yè)模板的實(shí)例代碼
.net GridView分頁(yè)模板的實(shí)例代碼,對(duì)分頁(yè)代碼有興趣的朋友可以參考一下2013-03-03DataSet、DataTable、DataRow區(qū)別詳解
這篇文章主要介紹了DataSet、DataTable、DataRow區(qū)別詳解,需要的朋友可以參考下2014-02-02