zoukankan      html  css  js  c++  java
  • 使用xunit对asp.net core webapi进行集成测试

    新项目我们采用前后端分离,后端采用asp.net core webapi, 如何对后端代码进行自动化测试呢,有以下几种方案:

    1. 单元测试,目前这个方案对我们来说难度很大,抛开时间的问题,单元测试对开发人员的水平要求很高,暂且不提。

    2. 使用postman等第三方工具,模拟http请求对webapi进行测试。缺点就是webapi必须跑起来,不能像单元测试一样,点一个按扭就可以跑测试。

    3. 使用xunit等单元测试工具对webapi进行测试,为了解决postmam问题,我们使用xunit对webapi进行类单元测试。

    使用xunit等单元测试工具对webapi进行测试的主要思路:

    1. 使用代码启动webapi项目,就像program.cs中代码一样

    2. 借助http工具类库对webapi发送http请求,这里我们使用RestSharp,详见官网:http://restsharp.org/。

    3. 接收返回值,进行断言判断,我们使用的Shouldly框架。

    下面是具体的代码:

    首先创建测试项目,这是visual studio 2017自带的xunit的测试项目,足可以看到ms的诚意了。

    然后我们创建一个类,用于启动webapi:

    public class ApiServerRunning : IDisposable
        {
            private IWebHost _builder;
    
            public void Dispose()
            {
                _builder?.Dispose();
            }
    
            public void GivenRunningOn(string url)
            {
                _builder = new WebHostBuilder()
                       .UseUrls(url)
                       .UseKestrel()
                       .UseContentRoot(Directory.GetCurrentDirectory())
                       .UseStartup<Startup>()
                       .Build();
                _builder.Start();
            }
        }

    然后我们就碰到一个问题,什么时候启动webapi,不是每个单元测试都要启动一次,不是运行每个类都启动一次,而是整个测试项目只运行一个,这里就用到了xunit的ICollectionFixture,

    想具体了解的话,请自行百度。这里就直接上代码了:

    /// <summary>
        /// used to startup weiapi, run only once
        /// </summary>
        public class TestFixture : IDisposable
        {
            public ApiServerRunning _server = new ApiServerRunning();
    
            public TestFixture()
            {
                this.Given(s => _server.GivenRunningOn(TestConst.SERVER_URL))
                    .Then(x => x.Connect())
                    .BDDfy();
    
            }
            private void Connect()
            {
                Console.WriteLine("webapi startup successfully!!! ");
            }
    
            public void Dispose()
            {
            }
        }
        /// <summary>
        /// used to tag every class using test fixture
        /// </summary>
        [CollectionDefinition("TestCollection")]
        public class TestCollection:ICollectionFixture<TestFixture>
        {
        }

    有了以上两个类,我们接下来就可以写单元测试了:

    [Collection("TestCollection")]
        public class TaskControllerTest : TestBase
        {
            [Fact(DisplayName = "获取列表")]
            private void GetOpinionTaskHospitals_Test()
            {
                var req = agent.CreateRequest("GetTasks")
                    .AddParameter("month", "2015-07-01")
                    .AddHeader(FmConsts.HeaderName_UserInfo, TestConst.USER_INFO);
    
                var rel = agent.Execute<<List<Task>>>(req);
    
                rel.Result.Count.ShouldNotBe(0);
    
            }
        }

    每个类都发送请求,所以这里有个TestBase的基类,里面有一个agent的http的对象,是我们封闭了restsharp的http请求对象,这里就不贴了。

    还有如果没有登录,所有如果想使用登录的cookie,这里我是直接添加了一个头信息,相当于一个登录,但是这里肯定有问题可能会过期,当然办法总比困难多。

    还有一个难点,就是这里的测试,还是用的我们的开发数据库,这个测试会污染数据,由于开发数据的变量,也会影响测试结果,如果替换开发数据库oracle为内存数据为库,而且代码变动也很少,是我们接下来的工作。 请经验的同学,请指教。

  • 相关阅读:
    项目Alpha冲刺(团队)-第七天冲刺
    NOIP模拟赛[补档]
    关于补档
    noip2017集训测试赛(三) Problem B: mex [补档]
    初赛准备 [补档]
    记录 [补档]
    Leave It Behind and Carry On ---- 高一下期末考反思 [补档]
    NOIP 2017 赛后反思 [补档]
    囤题 [补档]
    组合游戏学习笔记 [补档]
  • 原文地址:https://www.cnblogs.com/hankuikui/p/9597105.html
Copyright © 2011-2022 走看看