asp.net core 使用 TestServer 來做集成測試

2020-12-16 紙鶴視界

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.0https://github.com/dotnet/aspnetcore/tree/v5.0.0/src/Hosting/TestHost/srchttps://github.com/dotnet/aspnetcore/tree/v5.0.0/src/Hosting/TestHost/src/TestServer.cshttps://github.com/dotnet/aspnetcore/blob/v5.0.0/src/Hosting/TestHost/src/ClientHandler.cs#L58https://github.com/OpenReservation/ReservationServer/blob/3.1.0/OpenReservation.API.Test/Startup.cs#L26https://github.com/OpenReservation/ReservationServer/commit/e683065bf76e3c51688238c382b2c1f0c8028e7d

相關焦點

  • ASP.NET Core概述、安裝和常用命令介紹
    5、dotnet test使用project.json中指定的測試執行工具執行單元測試。測試項目需要在project.json中使用testRunner節點指定測試運行程序屬性。此值應包含單元測試框架的名稱。
  • 避免在ASP.NET Core 3.0中為啟動類注入服務
    原文: https://andrewlock.net/avoiding-startup-service-injection-in-asp-net-core-3/作者: Andrew Lock譯者: Lamond Lu本篇是如何升級到ASP.NET
  • NET開發-在ASP.NET WebForm應用程式中,使用C#操作單選按鈕
    如下是在aspx頁面上添加的RadioButtonList按鈕完整Html代碼:這裡在aspx頁面上拖放了RadioButtonList按鈕,源碼為:<asp:RadioButtonList ID="RadioButtonList1" runat="server"
  • ASP.NET動態網站開發試題與答案B卷
    2、在Asp.net中所有的自定義用戶控制項都必須繼承自____________________________。 3、當類T只聲明了私有實例構造函數時,則在T的程序文本外部,_________(可以or不可以)從T派生出新的類,__________直接創建T的任何實例。
  • 基於.net core 實現類似Spring的Autowired注入,不用構造函數
    其開源主頁介紹NAutowired的理念與定位如下:我們不做容器,我們只是NET Core Container的搬運工(在默認容器的基礎上增加了一些功能)。不要在構造函數中使用NAutowired。由於我們與那些妖豔的第三方IoC Container有些不同,我們沒有替換NetCore默認的Container,這意味著您依然可以在Startup裡使用IServiceCollection將服務加入到Container並使用NAutowired還原這些依賴。雖然有人覺得Spring風格的DI有點反模式(顯式依賴),但是寫起來爽。
  • 在ASP.NET Core中使用dotConnect for SQL Server
    dotConnect for SqlServer(以前稱為SQLDirect.NET)是一種快速,可擴展的數據訪問框架,可以在WinForms,ASP.NET等中使用。選擇ASP.NET Core 3.1或更高版本您應該通過禁用相應的複選框來禁用「配置HTTPS」和「啟用Docker支持」選項由於在此示例中我們將不使用身份驗證,因此將身份驗證指定為「無身份驗證」
  • 一文教你使用Jenkins集成Junit自動化測試,超簡單!
    Jenkins是一個開源的、提供友好操作界面的持續集成(CI)工具,主要用於持續、自動的構建/測試軟體項目。Jenkins通常與版本管理工具(SCM)、構建工具結合使用。常用的版本控制工具有SVN、GIT,構建工具有Maven、Ant、Gradle。然而Jenkins只負責軟體產品的發布,本身並不負責軟體的測試工作。
  • 基於.NET 5.0跨平臺全棧開發福音來了
    .NET 5下的全棧開發-B/S模式我們知道.net下的web開發從最古老的asp.net WebForm-> asp.net mvc -> .net core mvc 然後再到現在流行的前後端分離(前端vue,angular,react + 後端微服務/RESTful 接口)。
  • iOS應用如何使用testflight做測試?附testflight上架、安裝教程
    #是蘋果官方的內測ios應用分發渠道,也就是說ios內測應用,可以通過上架testflight,分發給內測用戶進行安裝使用,實現內測的目的,不需要上架App Store,審核也比較容易通過,testflight對於ios應用內測是非常方便的,下面我們就來說ios應用功能如何使用testflight做測試。
  • 如何在 ASP.Net Core 中使用 Swagger - 51CTO.COM
    可以利用快捷工具 Swagger,它的可視化 UI 可輕鬆助你 API 文檔化的同時還方便測試 API。Swashbuckle 就是一個用於生成 Swagger 文檔的開源工具包,這篇文章將會討論如何利用 Swashbuckle 來為你的 Restful API 生成可交互的文檔。
  • .Net Core 會逆襲成為最受歡迎開發平臺嗎?
    重點來啦:跨平臺:可在 Windows、macOS 和 Linux 作業系統上運行跨體系結構保持一致:在多個體系結構(包括 x64、x86 和 ARM)上以相同的行為運行代碼命令行工具:包括可用於本地開發和持續集成方案中的易於使用的命令行工具。
  • web 自動化測試框架 TestCafe:聽說用過的人都愛上了它
    TestCafe 介紹: TestCafe 是一款基於 Node.js 的端到端 Web 自動化測試框架,支持 TypeScript 或 JavaScript 來編寫測試用例,運行用例,並生成自動化測試報告。
  • Ookla Speedtest安卓專業版v4.5.11 網速測試
    Ookla Speedtest,手機網速測試工具,全球排名第一的網絡測速網站Speedtest.net安卓客戶端,30秒內即可完成網速測試,支持查看Ping值、下載速度、上傳速度,實時圖表顯示測試結果,排除故障或確認您應有的網速,跟蹤過往測試結果可以得出詳細報告,分享你的測試結果,
  • testflight是幹什麼的?testflight使用教程,超詳細!
    如何使用?本文就來詳細介紹一下testflight。testflight是什麼意思?在ios應用正式提交App Store上架之前,需要進行內測,邀請一些內測用戶在多機型上測試一下,這就需要用到testflight,當應用提交到testflight並且通過審核後,受邀的內測用戶就可以安裝應用了。我們可以簡單地將它看作是ios系統的內測分發渠道。
  • Graphcore IPU-M2000在基準測試中性能卓越
    Graphcore軟體高級副總裁Matt Fyles在對測試結果發表評論時說:「這一整套全面的benchmark表明Graphcore的IPU-M2000和IPU-POD64在許多流行模型上的性能均優於GPU。」
  • Speedtest for mac(網速測試工具)
    Ookla Speedtest 是一款 Mac 網速測試工具。可以幫助您進行 30 秒上傳速度測試及下載速度測試。Speedtest 設計美觀,使用簡單,全球分布的網絡可以讓您在任何地方測速都變得既方便又準確。
  • 開源軟體分享-基於.net core 3.1的快速開發框架
    不過現在.net core誕生以後,.net的生態也越來越好了,各種開源社區在為豐富.net生態世界努力。Vue.NetCore以前在github上搜索這種前後端分離快速開發框架基本是java的(如jeecg、jeesite、ruoyi),今天我要介紹的是一個基於.net core 3.1
  • Graphcore IPU-M2000在首個benchmark測試中顯著優於GPU
    Graphcore軟體高級副總裁Matt Fyles在對測試結果發表評論時說:「這一整套全面的benchmark表明Graphcore的IPU-M2000和IPU-POD64在許多流行模型上的性能均優於GPU。」