新项目我们采用前后端分离,后端采用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:

  1. public class ApiServerRunning : IDisposable
  2. {
  3. private IWebHost _builder;
  4.  
  5. public void Dispose()
  6. {
  7. _builder?.Dispose();
  8. }
  9.  
  10. public void GivenRunningOn(string url)
  11. {
  12. _builder = new WebHostBuilder()
  13. .UseUrls(url)
  14. .UseKestrel()
  15. .UseContentRoot(Directory.GetCurrentDirectory())
  16. .UseStartup<Startup>()
  17. .Build();
  18. _builder.Start();
  19. }
  20. }

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

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

  1. /// <summary>
  2. /// used to startup weiapi, run only once
  3. /// </summary>
  4. public class TestFixture : IDisposable
  5. {
  6. public ApiServerRunning _server = new ApiServerRunning();
  7.  
  8. public TestFixture()
  9. {
  10. this.Given(s => _server.GivenRunningOn(TestConst.SERVER_URL))
  11. .Then(x => x.Connect())
  12. .BDDfy();
  13.  
  14. }
  15. private void Connect()
  16. {
  17. Console.WriteLine("webapi startup successfully!!! ");
  18. }
  19.  
  20. public void Dispose()
  21. {
  22. }
  23. }
  1. /// <summary>
  2. /// used to tag every class using test fixture
  3. /// </summary>
  4. [CollectionDefinition("TestCollection")]
  5. public class TestCollection:ICollectionFixture<TestFixture>
  6. {
  7. }

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

  1. [Collection("TestCollection")]
  2. public class TaskControllerTest : TestBase
  3. {
  4. [Fact(DisplayName = "获取列表")]
  5. private void GetOpinionTaskHospitals_Test()
  6. {
  7. var req = agent.CreateRequest("GetTasks")
  8. .AddParameter("month", "2015-07-01")
  9. .AddHeader(FmConsts.HeaderName_UserInfo, TestConst.USER_INFO);
  10.  
  11. var rel = agent.Execute<<List<Task>>>(req);
  12.  
  13. rel.Result.Count.ShouldNotBe();
  14.  
  15. }
  16. }

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

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

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

使用xunit对asp.net core webapi进行集成测试的更多相关文章

  1. 使用 xUnit 编写 ASP.NET Core WebAPI单元测试

    本文使用xUnit对ASP.NET Core WebAPI做单元测试,使用HttpClient的同步和异步请求,下面详细介绍xUnit的使用过程: 一.创建示例项目 模板为我们自动创建了一个Value ...

  2. asp.net core webapi之跨域(Cors)访问

    这里说的跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作 ...

  3. ASP.NET Core WebAPI 开发-新建WebAPI项目

    ASP.NET Core WebAPI 开发-新建WebAPI项目, ASP.NET Core 1.0 RC2 即将发布,我们现在来学习一下 ASP.NET Core WebAPI开发. 网上已经有泄 ...

  4. Asp.net Core WebApi 使用Swagger做帮助文档,并且自定义Swagger的UI

    WebApi写好之后,在线帮助文档以及能够在线调试的工具是专业化的表现,而Swagger毫无疑问是做Docs的最佳工具,自动生成每个Controller的接口说明,自动将参数解析成json,并且能够在 ...

  5. Asp.Net Core WebApi学习笔记(四)-- Middleware

    Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...

  6. Asp.net core WebApi 使用Swagger生成帮助页

    最近我们团队一直进行.net core的转型,web开发向着前后端分离的技术架构演进,我们后台主要是采用了asp.net core webapi来进行开发,开始每次调试以及与前端人员的沟通上都存在这效 ...

  7. ASP.Net Core WebApi几种版本控制对比

    版本控制的好处: (1)助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方式进行控制,方法如下: (1)在 URL 中追加版本或 ...

  8. ASP.NET Core WebApi 返回统一格式参数(Json 中 Null 替换为空字符串)

    相关博文:ASP.NET Core WebApi 返回统一格式参数 业务场景: 统一返回格式参数中,如果包含 Null 值,调用方会不太好处理,需要替换为空字符串,示例: { "respon ...

  9. ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

    引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...

随机推荐

  1. Linux上安装Zabbix客户端

    rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-agent-3.4.4-2.el7.x86_64.rpm cp /etc ...

  2. 13.Query for Null or Missing Fields-官方文档摘录

    1 插入数据 db.inventory.insertMany([ { _id: 1, item: null }, { _id: 2 } ]) 2 查询null值 db.inventory.find({ ...

  3. Python高级特性(1):Iterators、Generators和itertools(转)

    译文:Python高级特性(1):Iterators.Generators和itertools [译注]:作为一门动态脚本语言,Python 对编程初学者而言很友好,丰富的第三方库能够给使用者带来很大 ...

  4. LINux网络的NAPI机制详解一

    在查看NAPI机制的时候发现一篇介绍NAPI引入初衷的文章写的很好,通俗易懂,就想要分享下,重要的是博主还做了可以在他基础上任意修改,而并不用注明出处的声明,着实令我敬佩,不过还是附上原文链接! ht ...

  5. javascript 之 typeof 与 instanceof

    1.typeof:返回一个表达式的数据类型的字符串 返回结果为js的数据类型,包括number,boolean,string,object,undefined,function. var a = 1; ...

  6. 【云安全与同态加密_调研分析(3)】国内云安全组织及标准——By Me

    ◆3. 国内云安全组织及标准◆ ◆云安全标准机构(主要的)◆ ◆标准机构介绍◆ ◆相关标准制定◆ ◆建立的相关模型参考◆ ◆备注(其他参考信息)◆ ★中国通信标准化协会(CCSA) ●组织简介:200 ...

  7. 教你编译PHP7 (nginx+mysql+php7)

    # 安装编译工具: yum install gcc automake autoconf libtool gcc-c++ # 安装基础库 yum install gd zlib zlib-devel o ...

  8. CentOS 7中使用iptables

    1.关闭firewall systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止fir ...

  9. JavaScript和jQuery的学习

    还有12天就要回学校了,我的假期计划还能实现吗?在这12天里,需要把JavaScript和jQuery学完.我知道这两个技术对于前端网页开发非常重要.前期把HTML和CSS学完了,学的不是特别深,只是 ...

  10. luaIDE选择

    luaIDE选择 本人测试过各种luaIDE, 包括luaStudio, 不过我还是推荐eclipse+ldt的方式: http://zengrong.net/post/1951.htm 原因如下: ...