系列目錄html
從.net到.net core之後,微軟很是努力,以每一年一到兩個大版本的頻率在演進.net core,去年相繼發佈了.net core 2.1和2.2,其中2.1是長期支持版,不斷的快速更新一方面快速彌補了相比.net framework缺失的api,同時也帶來了很多激進性的改變,致使不少api,尤爲是較傳統framework相比新增的api不斷調整,有些api在上一個版本還能用,結果到下一個版本就不支持了.升級到2.1之後,微軟就更改了集成測試服務器的包名並改變了2.0的接口,進行了更高層次的封裝,下降了使用配置難度.可是截至寫本文時VisualStudio工具支持仍然不是太好,須要手動修改csproj文件.可是這個工做也是一次性的.配置好了就ok啦.api
看到這裏可能有些同志會擔憂接口變化很大之前學的東西都白瞎了,其實否則,只是建立TestServer的方式變了,咱們實際測試中用到的最多的是HttpClient這個對象,它並無變.服務器
下面就介紹一下.net core 2.1下如何搭建一個內存集成測試服務器.
首先咱們新建一個.net core 2.1的mvc項目,並建立一個Xunit單元測試項目,引用剛建立的這個mvc項目,關於建立跟前面同樣,這裏再也不贅述.mvc
下載如下兩個包:Microsoft.AspNetCore.App和Microsoft.AspNetCore.Mvc.Testing
框架
咱們建立一個名爲netcoremvc21
的測試類,它的代碼以下async
public class netcoremvc21: IClassFixture<WebApplicationFactory<CoreMvc21.Startup>> { //private readonly WebApplicationFactory<CoreMvc21.Startup> _factory; private HttpClient client; public netcoremvc21(WebApplicationFactory<CoreMvc21.Startup> factory) { this.client = factory.CreateClient(); } [Fact] public async Task GetTest() { var response = await client.GetAsync("/Home/Hello"); response.EnsureSuccessStatusCode(); var responseStr = await response.Content.ReadAsStringAsync(); Assert.Equal("Hello,world", responseStr); } } }
咱們建立的項目實現了IClassFixture泛型接口,前面咱們講了這個接口的做用了,這裏再也不贅述,它裏面的泛型參數是一個WebApplicationFactory
泛型對象,這個對象是微軟提供好的,不須要咱們本身建立,這個泛型對象的參數是一個TEntryPoint對象,其實就是指定程序的startup文件(這裏咱們提供的是mvc項目的startup文件,這個項目名爲CoreMvc21).它實際上是把建立內存測試服務器的方法給封裝了,相似咱們前面的封裝,減小了手寫代碼量,而且提供了最佳實踐,咱們前面說到過,若是對Xunit不熟悉在構造函數裏建立非託管對象非形成嚴重性能問題.函數
下面的測試代碼和前面的並沒太大區別,都是經過httpclient對象構造請求.工具
測試接口數據沒問題,咱們再來看看此次是沒有配置ContentRoot的,程序能不能正常找到頁面性能
測試代碼以下單元測試
[Fact] public async Task GetTest() { var response = await client.GetAsync("/Home/index"); response.EnsureSuccessStatusCode(); var responseStr = await response.Content.ReadAsStringAsync(); Assert.Contains("myCarousel", responseStr); }
以上代碼測試也是經過的,也就是咱們不須要額外的配置,基本功能都能正常運行了.當前以上能正常運行的前提是項目是按慣例配置的,若是你的資源文件和項目不在同一個目錄下,則以上就不能正常工做了,此時咱們能夠繼承WebApplicationFactory<TEntryPoint>
來自定義配置,和前面.net core 2.0的配置基本相似.
可能有些同事會有疑問,這裏的工做環境也沒有配置,它是否是Development環境呢,答案是的.
截至到發文時,.net core已經到 3.0 preview 7了.因爲工做比較忙,加之對新技術新框架不像之前那樣有激情了,筆者並無試用過.net core 3.0.以上的方法僅適用於.net core 2.1和2.2兩個版本(不適用於2.0版本,關於2.0版本的集成測試本系列也有介紹,感興趣的朋友能夠翻閱一下).