1. 程式人生 > >.netcore持續整合測試篇之 .net core 2.1專案整合測試

.netcore持續整合測試篇之 .net core 2.1專案整合測試

系列目錄

從.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啦.

看到這裡可能有些同志會擔心介面變化很大以前學的東西都白瞎了,其實不然,只是建立TestServer的方式變了,我們實際測試中用到的最多的是HttpClient這個物件,它並沒有變.

下面就介紹一下.net core 2.1下如何搭建一個記憶體整合測試伺服器.
首先我們新建一個.net core 2.1的mvc專案,並建立一個Xunit單元測試專案,引用剛建立的這個mvc專案,關於建立跟前面一樣,這裡不再贅述.

下載以下兩個包:Microsoft.AspNetCore.App和Microsoft.AspNetCore.Mvc.Testing

我們建立一個名為netcoremvc21的測試類,它的程式碼如下

  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版本的整合測試本系列也有介紹,感興趣的朋友可以翻閱一下).