

精通中间件测试:Asp.Net Core实战指南,提升应用稳定性和可靠性 - 董瑞鹏
source link: https://www.cnblogs.com/ruipeng/p/18149582
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在上一章节我们实战了在Asp.Net Core
中的项目实战,这一章节讲解一下如何测试Asp.Net Core
的中间件。
TestServer
还记得我们在集成测试中提供的TestServer
吗?TestServer
是由 Microsoft.AspNetCore.TestHost
包提供的。包含了用于在测试环境中模拟 ASP.NET Core
应用程序的类和方法。通过使用 TestServer
,开发人员可以在测试中模拟整个应用程序的运行环境,包括中间件的执行,从而进行集成测试和端到端测试。
中间件可以使用 TestServer
单独测试。 这样便可以:
- 实例化只包含需要测试的组件的应用管道。
- 发送自定义请求以验证中间件行为。
- 请求会发送到内存中,而不是通过网络进行序列化。
- 这样可以避免产生额外的问题,例如端口管理和
HTTPS
证书。 - 中间件中的异常可以直接流回调用测试。
- 可以直接在测试中自定义服务器数据结构,如
HttpContext
。
VS
新建测试项目dotNetParadise.MiddlerWareTest
Nuget
安装Microsoft.AspNetCore.TestHost
PM> NuGet\Install-Package Microsoft.AspNetCore.TestHost -Version 8.0.4
既然我们是要测试中间件 那首先得先在我们的Sample.Api
中创建一个中间件
定义MyMiddleware
中间件
public class MyMiddleware(RequestDelegate next)
{
public async Task InvokeAsync(HttpContext context)
{
// 在请求处理前执行的逻辑
context.Response.ContentType = "text/plain";
context.Response.Headers.TryAdd("X-Custom-Header", "CustomValue");
await context.Response.WriteAsync("Test My Middleware");
// 调用下一个中间件
await next(context);
// 在请求处理后执行的逻辑
await context.Response.WriteAsync("Middleware Test Completed");
}
}
定义测试类
// Arrange
using var host = await new HostBuilder()
.ConfigureWebHost(webBuilder =>
{
webBuilder
.UseTestServer()
.ConfigureServices(services =>
{
// 在这里可以注入服务
})
.Configure(app =>
{
app.UseMiddleware<MyMiddleware>();
});
})
.StartAsync();
// Act
var response = await host.GetTestClient().GetAsync("/");
// Assert
response.EnsureSuccessStatusCode(); // 确保请求成功
var responseContent = await response.Content.ReadAsStringAsync();
Assert.Contains("Test My Middleware", responseContent);
Assert.Contains("Middleware Test Completed", responseContent);
Run Test
使用 HttpContext 发送请求
可以使用 TestServer
来设置测试环境,并创建一个模拟的 HttpContext
对象来代表一个请求
[Fact]
public async Task TestMiddleware_ExpectedResponse()
{
using var host = await new HostBuilder()
.ConfigureWebHost(webBuilder =>
{
webBuilder
.UseTestServer()
.ConfigureServices(services =>
{
})
.Configure(app =>
{
app.UseMiddleware<MyMiddleware>();
});
})
.StartAsync();
var server = host.GetTestServer();
server.BaseAddress = new Uri("http://localhost");
var context = await server.SendAsync(c =>
{
c.Request.Method = HttpMethods.Get;
c.Request.Path = "/";
c.Request.Host = new HostString("localhost");
c.Request.Scheme = "http";
});
//act
Assert.True(context.RequestAborted.CanBeCanceled);
Assert.Equal(HttpProtocol.Http11, context.Request.Protocol);
// 验证响应
Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode);
var customHeader = context.Response.Headers["X-Custom-Header"].ToString();
Assert.Equal("CustomValue", customHeader);
}
使用 SendAsync
的好处包括:
通过设置 HttpContext
的任何属性,从而精确控制请求的各个方面。相比于使用 HttpClient
,SendAsync
通常更快,因为它绕过了网络层。
集成测试:这是测试整个请求处理管道(包括所有中间件)的好方法。
然而,它也有一些限制:
局限性:SendAsync
主要用于集成测试,而不是单元测试。它测试的是整个请求处理流程,而不是单个组件。
模拟限制:虽然你可以设置 HttpContext
的许多属性来模拟请求,但某些方面(如用户认证状态或外部依赖项)可能难以完全模拟。
添加请求路由
这个比较好理解,就是在TestServer
中添加路由的功能和Asp.Net Core
中添加路由基本一致
[Fact]
public async Task TestWithEndpoint_ExpectedResponse()
{
using var host = await new HostBuilder()
.ConfigureWebHost(webBuilder =>
{
webBuilder
.UseTestServer()
.ConfigureServices(services =>
{
services.AddRouting();
})
.Configure(app =>
{
app.UseRouting();
//app.UseMiddleware<MyMiddleware>();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/hello", () =>
TypedResults.Text("Hello Tests"));
});
});
})
.StartAsync();
var client = host.GetTestClient();
var response = await client.GetAsync("/hello");
Assert.True(response.IsSuccessStatusCode);
var responseBody = await response.Content.ReadAsStringAsync();
Assert.Equal("Hello Tests", responseBody);
}
在测试场景中,添加请求路由的好处主要体现在以下几个方面:
-
模拟真实环境:
通过添加请求路由,你可以模拟出与真实生产环境相似的请求处理流程。这使得测试更加接近实际使用情况,从而提高了测试的可靠性和有效性。 -
控制测试的粒度:
你可以针对特定的路由进行精确测试,确保每个路由都能正确响应并返回预期的结果。这有助于发现潜在的路由错误或逻辑问题,提高了测试的精度。 -
隔离测试:
在测试过程中,你可以通过配置路由来隔离特定的功能或组件,从而避免其他部分的干扰。这种隔离测试有助于更准确地定位问题,提高了测试的效率。 -
模拟异常场景:
通过配置路由,你可以模拟各种异常场景,如路由不存在、参数错误等。这有助于测试应用程序在异常情况下的响应和处理能力,提高了应用程序的健壮性。 -
自动化测试:
在自动化测试框架中,添加请求路由可以使得测试用例更加易于编写和执行。通过发送请求到特定的路由并验证响应,你可以自动化地检查应用程序的功能和性能。
本章我们探讨了如何在Asp.Net Core
项目中测试中间件的方法和技巧。通过使用TestServer
和HttpContext
发送请求,我们可以模拟整个应用程序的运行环境,从而进行集成测试和端到端测试。同时,我们也介绍了如何添加请求路由来模拟不同的场景,并对中间件的行为进行验证。
通过测试中间件,我们可以确保其在处理请求时的行为符合预期,提高应用程序的稳定性和可靠性。测试不仅可以帮助发现潜在的问题,还可以在开发过程中及早发现和解决 bug,提高代码质量和开发效率。
😄欢迎关注笔者公众号一起学习交流,获取更多有用的知识~
__EOF__
Recommend
-
9
一.JSP运行环境搭建 1.JSP简介 在进行javaweb项目开发的时候,jsp是必不可少的,在一个jsp界面中,可一包括指令集,HTML,JavaScript,嵌入的java代码,注释和jsp动作标识等内容。jsp与HTML最大的区别点是:在jsp界面中可一穿插java语法片段,但HTML...
-
17
Vue概念 JavaScript在1995年由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。近年来发展非常迅速,标准也在不断完善已经达到ES6时代。 ECMAScript 6.0(简称 ES6)是JavaScript语言的下一代标准,已经在 2015 年 6 月...
-
5
Android 的 ViewPager2 实战详解:入门到精通 (查看原文) ViewPager2正式版的发布已经一年多了,目前ViewPager早已停止更新,官方...
-
2
Livepeer 公共测试网上线,将增加网络扩展性和可靠性
-
5
突破传统可靠性测试:混沌工程优秀实践-51CTO.COM 突破传统可靠性测试:混沌工程优秀实践 作者:叶青山 Perfma 2022-07-29 15:46:19 随着IT和互联网行业的快速发展,软件系统的复杂...
-
6
V2EX › 程序员 大家都知道软件可靠性都会测试弱网,那么弱网产生根本原因是啥?除了运营商丢包这些?
-
4
【RocketMQ入门到精通】— RocketMQ初级特性能力 | Message Reliablity,消息可靠性(不能多也不能丢)如何解决? 精选 原创
-
2
映泰发布B760NH-E主板支持DDR5-6400+,主打高可靠性和稳定性
-
5
异常的处理在我们应用程序中是至关重要的,在 dotNet 中有很多异常处理的机制,比如MVC的异常筛选器, 管道中间件定义try catch捕获异常处理亦或者第三方的解决方案
-
5
实战指南:使用 xUnit 和 ASP.NET Core 进行集成测试【完整教程】 ...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK