前言

在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, "vipwan@co.ltd")//演示添加的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,你可以更轻松地编写可靠的集成测试,确保你的应用程序在各种情况下都能正常工作。

使用 Alba 对 AspnetCore项目进行测试的更多相关文章

  1. spring boot项目如何测试,如何部署

    有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发.调试.打包到最后的投产上线. 开发阶段 单元 ...

  2. Maven入门-运行struts项目进行测试(三)

    maven运行struts项目进行测试: 在入门二中已经导入struts的jar包. 此时的pom.xml文件 <project xmlns="http://maven.apache. ...

  3. [原]Jenkins(七)---jenkins项目编译测试发布由maven构建的web项目

    /** * lihaibo * 文章内容都是根据自己工作情况实践得出. * 版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/533 ...

  4. [福大软工] Z班 个人项目自动测试结果

    个人项目第二次测试结果[9.16] 注:下表中的成绩满分为25分,正确性测试 共5个,每个3分.效率测试共 2个,每个5分. 根据数据统计分档如下, // 前为档级,后为分数. 参数为50000 0- ...

  5. Golang项目的测试实践

    Golang项目的测试实践 最近有一个项目,链路涉及了4个服务.最核心的是一个配时服务.要如何对这个项目进行测试,保证输出质量,是最近思考和实践的重点.这篇就说下最近这个实践的过程总结. 测试金字塔 ...

  6. 第五次博客作业——Alpha2项目的测试

    格式描述: 这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 团队名称 你的代码我的发 这个作业的目标 选取非自己所在团队的3个项目进行测试,并写出 ...

  7. 个人第5次作业:Alpha2项目的测试

    这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 名字 易林 学号 201731062134 团队名称 <巧克力王子和六个小矮人> 第一 ...

  8. Go项目的测试代码3(测试替身Test Double)

    上一篇文章介绍了项目中测试代码的写法. Go项目的测试代码2(项目运用) 这里简单的共享一下测试替身. 当我们写测试代码的时候,经常遇到一个问题.跟别的模块或服务有依赖性,可是功能还没开发完.或是因为 ...

  9. Go项目的测试代码2(项目运用)

    上一篇文章介绍了最基本的测试代码的写法.Go项目的测试代码(基础) 这里简单的共享一下我在项目中使用的方式. 项目结构 我们实际项目中, 结构简单地分了控制层controllers和模块层models ...

  10. Go项目的测试代码1(基础)

    最近写了测试代码,整理了一下. 先看看简单的测试代码. // add_test.go ==> 文件名 _test.go 结尾的默认为测试代码文件 package models import ( ...

随机推荐

  1. Spring事务隔离级别和传播机制

    引言 什么是事务? 在理解事务之前,我们要先了解事务的基本作用 比如在生活中有这样一个场景----取钱,每个人应该都干过的事 在ATM机上取钱,1.输入密码----2.输入金额----3.银行扣钱-- ...

  2. 企业快速落地IT服务管理体系的六大关键步骤

    许多企业在实施信息化战略时,一味地追求"技术高消费"而忽视了对信息技术的管理和内部业务流程的变革,侧重点仍然只是事后的技术支持和故障解决方面,随着企业对于信息技术的依赖程度的加重, ...

  3. 基于LoRA的RLHF

    参考Github 开源模型LLM-Tuning 一.简介 (1)RLHF (基于人类反馈的强化学习) 分为三步: SFT (Supervised Fine-Tuning): 有监督的微调,使用正常的 ...

  4. 异构智联Wi-Fi6+蓝牙模组,重新定义多屏互联体验!

    下班回家打开门,电灯.电视.空调.音响.电动窗帘.扫地机器人--一呼百应,有序开工,原本冰冷的房子立刻变成了温暖港湾.可以说,舒适便捷的智能设备已经完全融入了我们的生活中. 从单一场景.单一设备,到现 ...

  5. 记一个,生产遇到的redission锁,释放问题:lock.tryLock(0, 0, TimeUnit.SECONDS)

    package com.aswatson.cdc.test; import org.redisson.Redisson; import org.redisson.api.RLock; import o ...

  6. 在高通Fastmmi模式中增强交互方式

    在高通Fastmmi模式中增强交互方式 背景 由于之前工厂抱怨 FCT模式不好用. 之前的FCT测试是这样子的:PCBA上夹具,连接USB. 同时,使用上位机程序(ATE)发送指令,人工判断结果以后, ...

  7. [ABC184F] Programming Contest题解

    前置知识 meet in middle (折半搜索) 会的大佬请跳过 不会的请自己前往oi wiki或CSDN(百度吧,少年) 解题思路 纯暴力 看完题目考虑将每一种情况计算出来,排序后找不超过T的最 ...

  8. 解决python命令行报错问题

    解决Python报错Failed calling sys.__interactivehook__ 报错截图 可以看到主要的报错信息 File "D:\Python\Anaconda3\lib ...

  9. CF1860C 题解

    显然是一个博弈论题,考虑 dp. 定义状态 \(dp_i\) 表示先手走到 \(i\) 之后是否有必胜策略,不难发现以下几点: 若走到 \(i\) 之后无路可走,那么就必败. 若走到 \(i\) 之后 ...

  10. Nginx负载配置

    目录 Nginx 负载均衡笔记 1. 概述 1.1 Nginx 简介 1.2 负载均衡概述 2. 四层负载均衡(传输层) 2.1 工作原理 2.2 特点 2.3 优缺点 优点 缺点 2.4 示例场景 ...