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

  • 相关阅读:
    UVa 1151 Buy or Build【最小生成树】
    UVa 216 Getting in Line【枚举排列】
    UVa 729 The Hamming Distance Problem【枚举排列】
    HDU 5214 Movie【贪心】
    HDU 5223 GCD
    POJ 1144 Network【割顶】
    UVa 11025 The broken pedometer【枚举子集】
    HDU 2515 Yanghee 的算术【找规律】
    Java基本语法
    Java环境变量,jdk和jre的区别,面向对象语言编程
  • 原文地址:https://www.cnblogs.com/tylerzhou/p/11375098.html
Copyright © 2020-2023  润新知