首页 > 编程语言 >使用 Alba 对 AspnetCore项目进行测试

使用 Alba 对 AspnetCore项目进行测试

时间:2024-08-03 14:49:54浏览次数:15  
标签:scenario Alba AspnetCore host 测试 var public

前言

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

使用 Alba 进行集成测试

以下我们来体验一下TA的一些好用的测试体验:

首先,你需要在项目中安装 Alba 包。可以使用以下命令通过 NuGet 包管理器进行安装:

dotnet add package Alba

为了演示 Alba 的使用,我们首先创建一个简单的 ASP.NET Core 应用程序。这个应用程序包含一个返回 "Hello, World!" 的 MinimalApi请求。

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello, World!");
app.Run();

namespace TestCase
{
    public partial class Program { } //定义一个入口点用于测试
}

接下来,我们使用 Alba 创建一个基于xUnit的集成测试,测试上述应用程序。

using Alba;
public class IntegrationTests
{
    [Fact]
    public async Task Get_Home_Returns_HelloWorld()
    {
        using var host = await AlbaHost.For<TestCase.Program>(builder =>
        {
            // 这里可以配置服务和中间件
        });
        await host.Scenario(scenario =>
        {
            scenario.Get.Url("/");
            scenario.StatusCodeShouldBeOk();
            scenario.ContentShouldBe("Hello, World!");
        });
    }
}

AlbaHost有一个方法Scenario(x=>{})用于定义测试场景,比如上面的测试用例,场景使用GET请求起始页并断言是否返回200,以及返回的文本是否是Hello, World!

对于内置场景没有支撑到位的断言,我们也可以使用参数接收IScenarioResult自行断言:

var myScenario = await _host.Scenario(_ =>
{
    _.Get.Url("/");
});
Assert.Equal("true", myScenario.ReadAsText());
Assert.Equal(200, myScenario.Context.Response.StatusCode);

对于POST等方式提供链式的语法风格,Alba会自动帮我们序列化:

using Alba;
public class IntegrationTests
{
    [Fact]
    public async Task Post_Data_Returns_Correct_Response()
    {
        using var host = await AlbaHost.For<TestCase.Program>();
        await host.Scenario(scenario =>
        {
            scenario.Post.Json(new { Name = "Test" }).ToUrl("/data");
            scenario.StatusCodeShouldBeOk();
            scenario.ContentShouldBe("Received: Test");
        });
    }
}

对于XmlFormData的POST,Scenario也是提供支持的,例如:

//xml
scenario.Post.Xml(new Input {Name = "vipwan", Age = 18});
//form
public async Task write_form_data(IAlbaHost system)
{
    var form1 = new Dictionary<string, string>
    {
        ["a"] = "what?",
        ["b"] = "now?",
        ["c"] = "really?"
    };
    await system.Scenario(_ =>
    {
        // This writes the dictionary values to the HTTP
        // request as form data, and sets the content-length
        // header as well as setting the content-type
        // header to application/x-www-form-urlencoded
        _.WriteFormData(form1);
    });
}

当然除了传参的时候自动序列化,Alba对响应的返回也提供了反序列化支持:

public async Task read_json(IAlbaHost host)
{
    var result = await host.Scenario(_ =>
    {
        _.Get.Url("/output");
    });
    var output = result.ReadAsJsonAsync<Output>();
}
//或者
public async Task read_json_shorthand(IAlbaHost host)
{
    var output = await host.GetAsJson<Output>("/output");
}

如果需要测试需要鉴权认证的请求,Alba也帮我们做了封装.我们只需要实例化AuthenticationStub或者JwtSecurityStub亦或者实现OpenConnectExtension,然后在实例化AlbaHost时传入即可!

var securityStub = new AuthenticationStub()
    .With("foo", "bar")//演示添加的claim
    .With(JwtRegisteredClaimNames.Email, "[email protected]")//演示添加的claim
    .WithName("vipwan");
myHost = await AlbaHost.For<WebAppSecuredWithJwt.Program>(securityStub);

如上面的代码只要我们使用myHost实例创建的任何场景将自动附加相应的认证信息:

//当请求需要认证的时候也可以通过测试
app.MapGet("/", () => "Hello, World!").RequireAuthorization();

对于请求Alba还支持请求的AOP,比如请求前后我们需要对HttpContext做一些改动:

public void sample_usage(AlbaHost system)
{
    // Synchronously
    system.BeforeEach(context =>
    {
        // Modify the HttpContext immediately before each
        // Scenario()/HTTP request is executed
        context.Request.Headers.Add("trace", "something");
    });
    system.AfterEach(context =>
    {
        // perform an action immediately after the scenario/HTTP request
        // is executed
    });
    // Asynchronously
    system.BeforeEachAsync(context =>
    {
        // do something asynchronous here
        return Task.CompletedTask;
    });
    system.AfterEachAsync(context =>
    {
        // do something asynchronous here
        return Task.CompletedTask;
    });
}

这里介绍了一些Alba的特性和使用方式,当然还不完善,如果你对这个库感兴趣可以点击链接查看官方的文档

总结

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

标签:scenario,Alba,AspnetCore,host,测试,var,public
From: https://www.cnblogs.com/vipwan/p/18340537

相关文章

  • postman接口测试工具
    Postman是一款用于API开发和测试的工具,也是一款常用的接口测试工具。它提供了简便的界面和丰富的功能,可以方便地创建、调试和管理API请求,进行接口测试和自动化测试。使用Postman,你可以:1.创建和发送各种类型的API请求,包括GET、POST、PUT、DELETE等。2.设置请求头、请求参数......
  • Jmeter(五十一)上传类接口测试
    人的一切痛苦,本质上都是对自己无能的愤怒                   ----《认知觉醒:开启自我改变的原动力》一、HTTP请求中勾选UseMultipart/form-data 二、传入其他参数于Parmameters 三、FilesUpload选项卡传入本地excel路径即可注:M......
  • 重庆市软件测试技能大赛——自动化测试(Selenium)篇
    声明如下:个人学习笔记,可以作为复习参考等看一看,在此分享:自动化测试(selenium)篇①点击操作------.click()方法是点击元素的正中心②输入操作------.send_keys()方法使用时先清楚原有内容:.clear()→在进行输入操作③获取元素内信息(属性名,ID内容)操作------.get_attribute()......
  • 渗透测试
    联通国际公司渗透测试服务:深度防御,守护企业数字疆界在数字化转型的浪潮中,企业的网络安全已不再是可选项,而是关乎生存与发展的必答题。为了在这场没有硝烟的战争中占据主动,联通国际公司匠心打造了一项核心服务——渗透测试服务,旨在通过模拟真实黑客的攻击手法,深度挖掘并修复企业......
  • ACM第三次测试部分题解(B,C,D,E,J)
    (B)N^N(简单快速幂模板,直接套用就行)点击查看代码#include<iostream>usingnamespacestd;longlonga,b,n;intmain(){cin>>n;while(n--){scanf("%lld",&a);signedlonglongA=a%10,sum=1;while(a)......
  • 通用测试技术5
    一、缺陷的基本概述缺陷的定义缺陷的属性缺陷类型:缺陷的类型包括功能(Function)、界面(UI)、文档(Documentation)、软件包(Package)、性能(Performance)、接口(Interface)[注意]需求分析、设计阶段,文档类型的缺陷多;集成测试阶段,一般接口类型的缺陷多一些;系统测试阶......
  • 【unity小技巧】unity性能优化以及如何进行性能测试
    文章目录前言GPU性能优化打包素材CPU性能优化代码执行优化性能测试Vector2.Distance和sqrMagnitude哪个好?动画切换优化shader属性优化URP渲染器资产优化对象池优化删除没必要的空函数图片、音乐音效、贴图等素材压缩ScriptableObject优化参数参考完结前言功能的......
  • Burp Suite Professional 2024.7 for macOS x64 & ARM64 - 领先的 Web 渗透测试软件
    BurpSuiteProfessional2024.7formacOSx64&ARM64-领先的Web渗透测试软件世界排名第一的Web渗透测试工具包请访问原文链接:https://sysin.org/blog/burp-suite-pro-mac/,查看最新版。原创作品,转载请保留出处。BurpSuiteProfessionalTheworld’s#1webpenetrati......
  • Burp Suite Professional 2024.7 for Windows x64 - 领先的 Web 渗透测试软件
    BurpSuiteProfessional2024.7forWindowsx64-领先的Web渗透测试软件世界排名第一的Web渗透测试工具包请访问原文链接:https://sysin.org/blog/burp-suite-pro-win/,查看最新版。原创作品,转载请保留出处。BurpSuiteProfessionalTheworld’s#1webpenetrationtes......
  • AI全知道 - 测试人员应该了解的Embedding Model知识结构
    引言在人工智能和机器学习领域,嵌入模型(EmbeddingModel)逐渐成为不可或缺的工具。对于软件测试人员来说,了解嵌入模型的基本概念和应用场景,不仅有助于更好地理解AI系统的工作原理,还能提升在测试AI驱动应用时的有效性。本文将从嵌入模型的定义、主要应用、常见类型及具体案例......