使用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();
}
}
每个类都发送请求,所以这里有个TestBase的基类,里面有一个agent的http的对象,是我们封闭了restsharp的http请求对象,这里就不贴了。
还有如果没有登录,所有如果想使用登录的cookie,这里我是直接添加了一个头信息,相当于一个登录,但是这里肯定有问题可能会过期,当然办法总比困难多。
还有一个难点,就是这里的测试,还是用的我们的开发数据库,这个测试会污染数据,由于开发数据的变量,也会影响测试结果,如果替换开发数据库oracle为内存数据为库,而且代码变动也很少,是我们接下来的工作。 请经验的同学,请指教。
使用xunit对asp.net core webapi进行集成测试的更多相关文章
- 使用 xUnit 编写 ASP.NET Core WebAPI单元测试
本文使用xUnit对ASP.NET Core WebAPI做单元测试,使用HttpClient的同步和异步请求,下面详细介绍xUnit的使用过程: 一.创建示例项目 模板为我们自动创建了一个Value ...
- asp.net core webapi之跨域(Cors)访问
这里说的跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作 ...
- ASP.NET Core WebAPI 开发-新建WebAPI项目
ASP.NET Core WebAPI 开发-新建WebAPI项目, ASP.NET Core 1.0 RC2 即将发布,我们现在来学习一下 ASP.NET Core WebAPI开发. 网上已经有泄 ...
- Asp.net Core WebApi 使用Swagger做帮助文档,并且自定义Swagger的UI
WebApi写好之后,在线帮助文档以及能够在线调试的工具是专业化的表现,而Swagger毫无疑问是做Docs的最佳工具,自动生成每个Controller的接口说明,自动将参数解析成json,并且能够在 ...
- Asp.Net Core WebApi学习笔记(四)-- Middleware
Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...
- Asp.net core WebApi 使用Swagger生成帮助页
最近我们团队一直进行.net core的转型,web开发向着前后端分离的技术架构演进,我们后台主要是采用了asp.net core webapi来进行开发,开始每次调试以及与前端人员的沟通上都存在这效 ...
- ASP.Net Core WebApi几种版本控制对比
版本控制的好处: (1)助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方式进行控制,方法如下: (1)在 URL 中追加版本或 ...
- ASP.NET Core WebApi 返回统一格式参数(Json 中 Null 替换为空字符串)
相关博文:ASP.NET Core WebApi 返回统一格式参数 业务场景: 统一返回格式参数中,如果包含 Null 值,调用方会不太好处理,需要替换为空字符串,示例: { "respon ...
- ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...
随机推荐
- System.ArgumentException: 字体“Courier New”不支持样式“Regular”。
使用MongoVUE,发现报错,报错信息如下: System.ArgumentException: 字体“Courier New”不支持样式“Regular”. 说明本机字体安装不够:需安装完整的Co ...
- Oulipo----poj3461(kmp模板)
题目链接:http://poj.org/problem?id=3461 和 减花布条 的题对比一下: 求s2中s1的个数kmp模板: #include<stdio.h> #include& ...
- Android中TextView设置最大长度,超出显示省略号
今天在项目中碰到一个问题,在一个页面的顶部的标题栏显示公司的名字,但由于公司名称较长,显示不开,影响美观.故在网上查阅资料,在此做个小的总结. TextView中有个ellipsize属性,作用是当文 ...
- android推送,极光推送
android中简单易用的消息推送方式之中的一个 -------> 极光推送 首先来介绍一下极光推送. 极光推送:英文简称 JPush,是一个面向普通开发人员免费.开放的第三方消息推送服务,我们 ...
- 《Python入门》Windows 7下Python Web开发环境搭建笔记
最近想尝试一下在IBM Bluemix上使用Python语言创建Web应用程序,所以需要在本地搭建Python Web的开发测试环境. 关于Python的版本 进入Python的网站,鼠标移到导航条上 ...
- 斯坦福第二课:单变量线性回归(Linear Regression with One Variable)
二.单变量线性回归(Linear Regression with One Variable) 2.1 模型表示 2.2 代价函数 2.3 代价函数的直观理解 I 2.4 代价函数的直观理解 I ...
- fzu1901Period II
地址:http://acm.fzu.edu.cn/problem.php?pid=1901 题目: Problem 1901 Period II Accept: 442 Submit: 1099 ...
- ZOJ - 2587 Unique Attack (判断最小割是否唯一)
题意:判断最小割是否唯一. 分析:跑出最大流后,在残余网上从源点和汇点分别dfs一次,对访问的点都打上标记. 若还有点没有被访问到,说明最小割不唯一. https://www.cnblogs.com/ ...
- ZOJ - 3229 Shoot the Bullet (有源汇点上下界最大流)
题意:要在n天里给m个女生拍照,每个女生有拍照数量的下限Gi,每天有拍照数量的上限Di,每天当中每个人有拍照的上限Lij和Rij.求在满足限制的基础上,所有人最大能拍多少张照片. 分析:抛开限制,显然 ...
- 利用page_source抓取网页中的URL,进行链接测试
selenium的page_source方法可以获取到页面源码,下面就把它应用到链接测试中. # coding:utf-8 __author__ = 'helen' import re,request ...