asp.net core 使用 TestServer 来做集成测试的方法

 更新时间:2020年11月20日 09:27:16   作者:Love it or leave it  
这篇文章主要介绍了asp.net core 使用 TestServer 来做集成测试,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

Intro

之前我的项目里的集成测试是随机一个端口,每次都真实的启动一个 WebServer,之前也有看到过微软文档上 TestServer 的介绍,当时没仔细看过以为差不多就没用,一直是启动了一个真正的 WebServer 去跑集成测试的,上次分享 Xunit.DependencyInjection 改造测试项目的时候,写的烂代码被大师看到了之后, 大师建议用 TestServer 来做集成测试,使用 TestServer 不会真正的占用端口号,不会出现权限问题,于是扒了扒 TestServer 的源码,并用 TestServer 改进了集成测试项目,感谢大师[献花鲜花]~~

Sample

之前的集成测试监听了一个端口号,使用了一个真实的 WebServer,下面改成使用 TestServer

TestServer 现在是在 Microsoft.AspNetCore.TestHost 这个 Nuget 包中,引用这个包就可以使用了

在服务注册的时候调用 UseTestServer 这一扩展方法就可以注入 TestServer 了,集成测试一般会用 HttpClient 来请求服务器端的 API 地址或页面,TestServer 提供了一个方便的 CreateClient 的方法可以很方便的创建一个用来请求 TestServerHttpClient,微软也提供了一些比较方便的扩展方法,可以使用 IHostGetTestClient 扩展方法来获取 HttpClient

改成使用 TestServer 很简单,引用 nuget 包 Microsoft.AspNetCore.TestHost,变更对比如下:

源码概览

TestServer 在启动的时候并没有监听端口,可以参考源码 IServerStart

TestServer 通过 CreateClient 方法来创建调用 TestServer 接口的 HttpClient

通过上面的代码可以看的出来核心代码是在 ClientHandler 中定义的,源码有点多,详细可以直接看源码 https://github.com/dotnet/aspnetcore/blob/v5.0.0/src/Hosting/TestHost/src/ClientHandler.cs

ClientHandler 重写了 HttpClientHandler 的 SendAsync 方法,使得请求直接拦截掉,不会真正的发生 Http 请求,实际的请求过程首先将 Http 请求的信息转换成 HttpRquestFeature 然后直接交给 TestServer 处理,其实也就是直接交给 asp.net core 的请求管道去处理,请求处理结束之后,获取 HttpContext 响应,获取 HttpResponseFeature 然后转换成 HttpClient 需要的 HttpResponseMessage.

More

TestServer 不仅仅可以支持 HTTP 请求的处理,还支持 WebSocket 的处理,WebSocket 的集成测试也可以使用 TestServer 来处理。

你如果还是比较怀疑是否真的没有 HTTP 请求,可以用 Fildder 之类的 HTTP 抓包工具监控在跑测试的期间是否真的有 HTTP 请求,如果是真正的 WebServer 会有 HTTP 请求,TestServer 不会有 HTTP 请求。

https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-5.0
https://github.com/dotnet/aspnetcore/tree/v5.0.0/src/Hosting/TestHost/src
https://github.com/dotnet/aspnetcore/tree/v5.0.0/src/Hosting/TestHost/src/TestServer.cs
https://github.com/dotnet/aspnetcore/blob/v5.0.0/src/Hosting/TestHost/src/ClientHandler.cs#L58
https://github.com/OpenReservation/ReservationServer/blob/3.1.0/OpenReservation.API.Test/Startup.cs#L26
https://github.com/OpenReservation/ReservationServer/commit/e683065bf76e3c51688238c382b2c1f0c8028e7d

到此这篇关于asp.net core 使用 TestServer 来做集成测试的文章就介绍到这了,更多相关asp.net core 集成测试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • .NET C#使用微信公众号登录网站

    .NET C#使用微信公众号登录网站

    这篇文章主要介绍了.NET C#使用微信公众号登录网站,教大家利用微信公众号进行网站登录,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 如何在ASP.NET Core中给上传图片功能添加水印实例代码

    如何在ASP.NET Core中给上传图片功能添加水印实例代码

    这篇文章主要给大家介绍了关于如何在ASP.NET Core中给上传图片功能添加水印的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • 扩展 Entity Framework支持复杂的过滤条件(多个关键字模糊匹配)

    扩展 Entity Framework支持复杂的过滤条件(多个关键字模糊匹配)

    之前遇到一个棘手的Linq to EF查询的技术问题,现有产品表Product,需要根据多个关键字模糊匹配产品名称, 现将解决方案分享出来,按兴趣的朋友可以参考下
    2012-12-12
  • VS2017调用MySQL 8.0的方法

    VS2017调用MySQL 8.0的方法

    这篇文章主要为大家详细介绍了VS2017调用MySQL 8.0的方法,附上C++程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • 浅析Repeater控件的使用 (原样导出和动态显示/隐藏Repeater中的列)

    浅析Repeater控件的使用 (原样导出和动态显示/隐藏Repeater中的列)

    本文主要介绍了浅析Repeater控件的使用 (原样导出和动态显示/隐藏Repeater中的列)的具体方法,需要的朋友可以看下
    2016-12-12
  • Linux服务器下利用Docker部署.net Core项目的全过程

    Linux服务器下利用Docker部署.net Core项目的全过程

    这篇文章主要给大家介绍了关于在Linux服务器下利用Docker部署.net Core项目的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用.net Core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • 利用asp.net实现生成不重复订单号

    利用asp.net实现生成不重复订单号

    订单号在购物过程中起到了很好的识别作用,更方便的有利于工作人员识别商品,本文介绍利用asp.net实现生成订单号
    2012-12-12
  • .NET实现仓储Repository(AI)的操作方法

    .NET实现仓储Repository(AI)的操作方法

    仓储模式是一种在应用程序中使用的设计模式,它将数据访问逻辑与业务逻辑分离,通过仓储接口和仓储实现类,您可以定义和实现数据的增删改查操作,这篇文章主要介绍了.NET 实现仓储Repository(AI),需要的朋友可以参考下
    2023-09-09
  • asp.net中EXCEL数据导入到数据库的方法

    asp.net中EXCEL数据导入到数据库的方法

    这篇文章主要介绍了asp.net中EXCEL数据导入到数据库的方法,实现读取excel数据并导入到SQL Server数据库的功能,是非常实用的技巧,需要的朋友可以参考下
    2015-01-01
  • MVC 5 第一章 创建MVC 5 web应用程序

    MVC 5 第一章 创建MVC 5 web应用程序

    本章将讲述一些构建ASP.NET MVC 5 web application的一些基础知识, 通过本章学习,你应该能够掌握到构建MVC 5应用程序的基本步骤,并且通过展示一个完整的MVC 5 hello world应用程序了解MVC 5应用程序所带来的用户体验。
    2014-06-06

最新评论