.netcore持续集成测试篇之 .net core 2.1项目集成测试

系列目录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版本的集成测试本系列也有介绍,感兴趣的朋友能够翻阅一下).