翼度科技»论坛 编程开发 .net 查看内容

使用 Alba 对 AspnetCore项目进行测试

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
前言

在AspnetCore生态系统中,我们测试项目一般使用Microsoft.AspNetCore.TestHost的TestServer 到.NET6后提供的Microsoft.AspNetCore.Mvc.Testing的WebApplicationFactory,后者是前者的封装,专门用于测试 ASP.NET Core 应用程序。它简化了创建和配置测试服务器的过程。而Alba也是基于前者的封装,同样提供了一些好用的测试体验
使用 Alba 进行集成测试

以下我们来体验一下TA的一些好用的测试体验:
首先,你需要在项目中安装 Alba 包。可以使用以下命令通过 NuGet 包管理器进行安装:
  1. dotnet add package Alba
复制代码
为了演示 Alba 的使用,我们首先创建一个简单的 ASP.NET Core 应用程序。这个应用程序包含一个返回 "Hello, World!" 的 MinimalApi请求。
  1. var builder = WebApplication.CreateBuilder(args);
  2. var app = builder.Build();
  3. app.MapGet("/", () => "Hello, World!");
  4. app.Run();
  5. namespace TestCase
  6. {
  7.     public partial class Program { } //定义一个入口点用于测试
  8. }
复制代码
接下来,我们使用 Alba 创建一个基于xUnit的集成测试,测试上述应用程序。
  1. using Alba;
  2. public class IntegrationTests
  3. {
  4.     [Fact]
  5.     public async Task Get_Home_Returns_HelloWorld()
  6.     {
  7.         using var host = await AlbaHost.For<TestCase.Program>(builder =>
  8.         {
  9.             // 这里可以配置服务和中间件
  10.         });
  11.         await host.Scenario(scenario =>
  12.         {
  13.             scenario.Get.Url("/");
  14.             scenario.StatusCodeShouldBeOk();
  15.             scenario.ContentShouldBe("Hello, World!");
  16.         });
  17.     }
  18. }
复制代码
AlbaHost有一个方法Scenario(x=>{})用于定义测试场景,比如上面的测试用例,场景使用GET请求起始页并断言是否返回200,以及返回的文本是否是Hello, World!
对于内置场景没有支撑到位的断言,我们也可以使用参数接收IScenarioResult自行断言:
  1. var myScenario = await _host.Scenario(_ =>
  2. {
  3.     _.Get.Url("/");
  4. });
  5. Assert.Equal("true", myScenario.ReadAsText());
  6. Assert.Equal(200, myScenario.Context.Response.StatusCode);
复制代码
对于POST等方式提供链式的语法风格,Alba会自动帮我们序列化:
  1. using Alba;
  2. public class IntegrationTests
  3. {
  4.     [Fact]
  5.     public async Task Post_Data_Returns_Correct_Response()
  6.     {
  7.         using var host = await AlbaHost.For<TestCase.Program>();
  8.         await host.Scenario(scenario =>
  9.         {
  10.             scenario.Post.Json(new { Name = "Test" }).ToUrl("/data");
  11.             scenario.StatusCodeShouldBeOk();
  12.             scenario.ContentShouldBe("Received: Test");
  13.         });
  14.     }
  15. }
复制代码
对于Xml和FormData的POST,Scenario也是提供支持的,例如:
  1. //xml
  2. scenario.Post.Xml(new Input {Name = "vipwan", Age = 18});
  3. //form
  4. public async Task write_form_data(IAlbaHost system)
  5. {
  6.     var form1 = new Dictionary<string, string>
  7.     {
  8.         ["a"] = "what?",
  9.         ["b"] = "now?",
  10.         ["c"] = "really?"
  11.     };
  12.     await system.Scenario(_ =>
  13.     {
  14.         // This writes the dictionary values to the HTTP
  15.         // request as form data, and sets the content-length
  16.         // header as well as setting the content-type
  17.         // header to application/x-www-form-urlencoded
  18.         _.WriteFormData(form1);
  19.     });
  20. }
复制代码
当然除了传参的时候自动序列化,Alba对响应的返回也提供了反序列化支持:
  1. public async Task read_json(IAlbaHost host)
  2. {
  3.     var result = await host.Scenario(_ =>
  4.     {
  5.         _.Get.Url("/output");
  6.     });
  7.     var output = result.ReadAsJsonAsync<Output>();
  8. }
  9. //或者
  10. public async Task read_json_shorthand(IAlbaHost host)
  11. {
  12.     var output = await host.GetAsJson<Output>("/output");
  13. }
复制代码
如果需要测试需要鉴权认证的请求,Alba也帮我们做了封装.我们只需要实例化AuthenticationStub或者JwtSecurityStub亦或者实现OpenConnectExtension,然后在实例化AlbaHost时传入即可!
  1. var securityStub = new AuthenticationStub()
  2.     .With("foo", "bar")//演示添加的claim
  3.     .With(JwtRegisteredClaimNames.Email, "vipwan@co.ltd")//演示添加的claim
  4.     .WithName("vipwan");
  5. myHost = await AlbaHost.For<WebAppSecuredWithJwt.Program>(securityStub);
复制代码
如上面的代码只要我们使用myHost实例创建的任何场景将自动附加相应的认证信息:
  1. //当请求需要认证的时候也可以通过测试
  2. app.MapGet("/", () => "Hello, World!").RequireAuthorization();
复制代码
对于请求Alba还支持请求的AOP,比如请求前后我们需要对HttpContext做一些改动:
  1. public void sample_usage(AlbaHost system)
  2. {
  3.     // Synchronously
  4.     system.BeforeEach(context =>
  5.     {
  6.         // Modify the HttpContext immediately before each
  7.         // Scenario()/HTTP request is executed
  8.         context.Request.Headers.Add("trace", "something");
  9.     });
  10.     system.AfterEach(context =>
  11.     {
  12.         // perform an action immediately after the scenario/HTTP request
  13.         // is executed
  14.     });
  15.     // Asynchronously
  16.     system.BeforeEachAsync(context =>
  17.     {
  18.         // do something asynchronous here
  19.         return Task.CompletedTask;
  20.     });
  21.     system.AfterEachAsync(context =>
  22.     {
  23.         // do something asynchronous here
  24.         return Task.CompletedTask;
  25.     });
  26. }
复制代码
这里介绍了一些Alba的特性和使用方式,当然还不完善,如果你对这个库感兴趣可以点击链接查看官方的文档
总结

Alba 是一个比较简单的测试库,提供了我们对Web项目测试常用的场景封装,下图是AlbaHost简单架构:

Alba 提供了多种便捷的测试方式,使得编写和执行集成测试变得更加简单和高效。无论是基本的 HTTP 请求测试、带有依赖注入的请求测试、POST 请求测试、带有认证的请求测试,还是复杂的请求和响应测试,Alba 都能很好地满足你的需求。通过使用 Alba,你可以更轻松地编写可靠的集成测试,确保你的应用程序在各种情况下都能正常工作。

来源:https://www.cnblogs.com/vipwan/p/18340537
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具