新项目我们采用前后端分离,后端采用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为内存数据为库,而且代码变动也很少,是我们接下来的工作。 请经验的同学,请指教。

最新文章

  1. 《Web 前端面试指南》1、JavaScript 闭包深入浅出
  2. Pyqt5 获取命令行参数sys.argv
  3. Spring事务管理(转)
  4. Educational Codeforces Round 4 D. The Union of k-Segments 排序
  5. PostgreSQL的 fdw 跨库使用
  6. Quartz Scheduler(2.2.1) - hello world
  7. svn管理代码在cornerstone上无法添加.a 静态库文件
  8. hadoop资料汇总(网上)
  9. Bootstrap的datepicker控件
  10. 转:MySql的commit和rollback
  11. WinRAR5.31 注册码
  12. 20160222.CCPP体系详解(0032天)
  13. virtualbox中 Kali Linux安装增强功能
  14. 《剑指offer》-链表找环入口
  15. LeetCode——10. Regular Expression Matching
  16. django-全文检索
  17. Codeforces 623B Array GCD
  18. Linux基础之常用命令篇
  19. 2018 Multi-University Training Contest 10 Solution
  20. 4,临界区 之 synchronized

热门文章

  1. 前端开发 - JQuery - 中
  2. 如何使用 libtorch 实现 AlexNet 网络?
  3. 【opencv】ubuntu opencv imshow()报错
  4. 【opencv】c++ 读取图片 &amp; 绘制点 &amp; 绘制文字 &amp; 保存图片
  5. Proud Merchants---hdu3466(有01背包)
  6. Cassandra go语言client使用
  7. 入参是小数的String,返回小数乘以100的String
  8. MySQL中的索引详讲
  9. PAT 1048 Find Coins[比较]
  10. 20165324《Java程序设计》第七周