引言
在上一章節(jié)我們實(shí)戰(zhàn)了在Asp.Net Core
中的項(xiàng)目實(shí)戰(zhàn),這一章節(jié)講解一下如何測(cè)試Asp.Net Core
的中間件。
TestServer
還記得我們?cè)诩蓽y(cè)試中提供的TestServer
嗎?TestServer
是由 Microsoft.AspNetCore.TestHost
包提供的。包含了用于在測(cè)試環(huán)境中模擬 ASP.NET Core
應(yīng)用程序的類和方法。通過(guò)使用 TestServer
,開(kāi)發(fā)人員可以在測(cè)試中模擬整個(gè)應(yīng)用程序的運(yùn)行環(huán)境,包括中間件的執(zhí)行,從而進(jìn)行集成測(cè)試和端到端測(cè)試。
中間件可以使用 TestServer
單獨(dú)測(cè)試。 這樣便可以:
- 實(shí)例化只包含需要測(cè)試的組件的應(yīng)用管道。
- 發(fā)送自定義請(qǐng)求以驗(yàn)證中間件行為。
優(yōu)點(diǎn):
- 請(qǐng)求會(huì)發(fā)送到內(nèi)存中,而不是通過(guò)網(wǎng)絡(luò)進(jìn)行序列化。
- 這樣可以避免產(chǎn)生額外的問(wèn)題,例如端口管理和
HTTPS
證書(shū)。 - 中間件中的異??梢灾苯恿骰卣{(diào)用測(cè)試。
- 可以直接在測(cè)試中自定義服務(wù)器數(shù)據(jù)結(jié)構(gòu),如
HttpContext
。
實(shí)戰(zhàn)
VS
新建測(cè)試項(xiàng)目dotNetParadise.MiddlerWareTest
Nuget
安裝Microsoft.AspNetCore.TestHost
PM> NuGet\Install-Package Microsoft.AspNetCore.TestHost -Version 8.0.4
既然我們是要測(cè)試中間件 那首先得先在我們的Sample.Api
中創(chuàng)建一個(gè)中間件
定義MyMiddleware中間件
public class MyMiddleware(RequestDelegate next)
{
public async Task InvokeAsync(HttpContext context)
{
// 在請(qǐng)求處理前執(zhí)行的邏輯
context.Response.ContentType = "text/plain";
context.Response.Headers.TryAdd("X-Custom-Header", "CustomValue");
await context.Response.WriteAsync("Test My Middleware");
// 調(diào)用下一個(gè)中間件
await next(context);
// 在請(qǐng)求處理后執(zhí)行的邏輯
await context.Response.WriteAsync("Middleware Test Completed");
}
}
定義測(cè)試類
// Arrange
using var host = await new HostBuilder()
.ConfigureWebHost(webBuilder =>
{
webBuilder
.UseTestServer()
.ConfigureServices(services =>
{
// 在這里可以注入服務(wù)
})
.Configure(app =>
{
app.UseMiddleware<MyMiddleware>();
});
})
.StartAsync();
// Act
var response = await host.GetTestClient().GetAsync("/");
// Assert
response.EnsureSuccessStatusCode(); // 確保請(qǐng)求成功
var responseContent = await response.Content.ReadAsStringAsync();
Assert.Contains("Test My Middleware", responseContent);
Assert.Contains("Middleware Test Completed", responseContent);
Run Test
使用 HttpContext 發(fā)送請(qǐng)求
可以使用 TestServer
來(lái)設(shè)置測(cè)試環(huán)境,并創(chuàng)建一個(gè)模擬的 HttpContext
對(duì)象來(lái)代表一個(gè)請(qǐng)求
[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);
// 驗(yàn)證響應(yīng)
Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode);
var customHeader = context.Response.Headers["X-Custom-Header"].ToString();
Assert.Equal("CustomValue", customHeader);
}
使用 SendAsync
的好處包括:
通過(guò)設(shè)置 HttpContext
的任何屬性,從而精確控制請(qǐng)求的各個(gè)方面。相比于使用 HttpClient
,SendAsync
通常更快,因?yàn)樗@過(guò)了網(wǎng)絡(luò)層。
集成測(cè)試:這是測(cè)試整個(gè)請(qǐng)求處理管道(包括所有中間件)的好方法。
然而,它也有一些限制:
局限性:SendAsync
主要用于集成測(cè)試,而不是單元測(cè)試。它測(cè)試的是整個(gè)請(qǐng)求處理流程,而不是單個(gè)組件。
模擬限制:雖然你可以設(shè)置 HttpContext
的許多屬性來(lái)模擬請(qǐng)求,但某些方面(如用戶認(rèn)證狀態(tài)或外部依賴項(xiàng))可能難以完全模擬。
添加請(qǐng)求路由
這個(gè)比較好理解,就是在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);
}
在測(cè)試場(chǎng)景中,添加請(qǐng)求路由的好處主要體現(xiàn)在以下幾個(gè)方面:
-
模擬真實(shí)環(huán)境:
通過(guò)添加請(qǐng)求路由,你可以模擬出與真實(shí)生產(chǎn)環(huán)境相似的請(qǐng)求處理流程。這使得測(cè)試更加接近實(shí)際使用情況,從而提高了測(cè)試的可靠性和有效性。 -
控制測(cè)試的粒度:
你可以針對(duì)特定的路由進(jìn)行精確測(cè)試,確保每個(gè)路由都能正確響應(yīng)并返回預(yù)期的結(jié)果。這有助于發(fā)現(xiàn)潛在的路由錯(cuò)誤或邏輯問(wèn)題,提高了測(cè)試的精度。 -
隔離測(cè)試:
在測(cè)試過(guò)程中,你可以通過(guò)配置路由來(lái)隔離特定的功能或組件,從而避免其他部分的干擾。這種隔離測(cè)試有助于更準(zhǔn)確地定位問(wèn)題,提高了測(cè)試的效率。 -
模擬異常場(chǎng)景:
通過(guò)配置路由,你可以模擬各種異常場(chǎng)景,如路由不存在、參數(shù)錯(cuò)誤等。這有助于測(cè)試應(yīng)用程序在異常情況下的響應(yīng)和處理能力,提高了應(yīng)用程序的健壯性。 -
自動(dòng)化測(cè)試:
在自動(dòng)化測(cè)試框架中,添加請(qǐng)求路由可以使得測(cè)試用例更加易于編寫(xiě)和執(zhí)行。通過(guò)發(fā)送請(qǐng)求到特定的路由并驗(yàn)證響應(yīng),你可以自動(dòng)化地檢查應(yīng)用程序的功能和性能。
最后
本章我們探討了如何在Asp.Net Core
項(xiàng)目中測(cè)試中間件的方法和技巧。通過(guò)使用TestServer
和HttpContext
發(fā)送請(qǐng)求,我們可以模擬整個(gè)應(yīng)用程序的運(yùn)行環(huán)境,從而進(jìn)行集成測(cè)試和端到端測(cè)試。同時(shí),我們也介紹了如何添加請(qǐng)求路由來(lái)模擬不同的場(chǎng)景,并對(duì)中間件的行為進(jìn)行驗(yàn)證。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-855064.html
通過(guò)測(cè)試中間件,我們可以確保其在處理請(qǐng)求時(shí)的行為符合預(yù)期,提高應(yīng)用程序的穩(wěn)定性和可靠性。測(cè)試不僅可以幫助發(fā)現(xiàn)潛在的問(wèn)題,還可以在開(kāi)發(fā)過(guò)程中及早發(fā)現(xiàn)和解決 bug,提高代碼質(zhì)量和開(kāi)發(fā)效率。
??歡迎關(guān)注筆者公眾號(hào)一起學(xué)習(xí)交流,獲取更多有用的知識(shí)~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-855064.html
- 測(cè)試中間件
- 本文完整源代碼
到了這里,關(guān)于精通中間件測(cè)試:Asp.Net Core實(shí)戰(zhàn)指南,提升應(yīng)用穩(wěn)定性和可靠性的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!