使用 Alba 对 AspnetCore项目进行测试
前言
在AspnetCore生态系统中,我们测试项目一般使用Microsoft.AspNetCore.TestHost的TestServer 到.NET6后提供的Microsoft.AspNetCore.Mvc.Testing的WebApplicationFactory,后者是前者的封装,专门用于测试 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");
});
}
}
对于Xml和FormData的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项目进行测试的更多相关文章
- spring boot项目如何测试,如何部署
有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发.调试.打包到最后的投产上线. 开发阶段 单元 ...
- Maven入门-运行struts项目进行测试(三)
maven运行struts项目进行测试: 在入门二中已经导入struts的jar包. 此时的pom.xml文件 <project xmlns="http://maven.apache. ...
- [原]Jenkins(七)---jenkins项目编译测试发布由maven构建的web项目
/** * lihaibo * 文章内容都是根据自己工作情况实践得出. * 版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/533 ...
- [福大软工] Z班 个人项目自动测试结果
个人项目第二次测试结果[9.16] 注:下表中的成绩满分为25分,正确性测试 共5个,每个3分.效率测试共 2个,每个5分. 根据数据统计分档如下, // 前为档级,后为分数. 参数为50000 0- ...
- Golang项目的测试实践
Golang项目的测试实践 最近有一个项目,链路涉及了4个服务.最核心的是一个配时服务.要如何对这个项目进行测试,保证输出质量,是最近思考和实践的重点.这篇就说下最近这个实践的过程总结. 测试金字塔 ...
- 第五次博客作业——Alpha2项目的测试
格式描述: 这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 团队名称 你的代码我的发 这个作业的目标 选取非自己所在团队的3个项目进行测试,并写出 ...
- 个人第5次作业:Alpha2项目的测试
这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 名字 易林 学号 201731062134 团队名称 <巧克力王子和六个小矮人> 第一 ...
- Go项目的测试代码3(测试替身Test Double)
上一篇文章介绍了项目中测试代码的写法. Go项目的测试代码2(项目运用) 这里简单的共享一下测试替身. 当我们写测试代码的时候,经常遇到一个问题.跟别的模块或服务有依赖性,可是功能还没开发完.或是因为 ...
- Go项目的测试代码2(项目运用)
上一篇文章介绍了最基本的测试代码的写法.Go项目的测试代码(基础) 这里简单的共享一下我在项目中使用的方式. 项目结构 我们实际项目中, 结构简单地分了控制层controllers和模块层models ...
- Go项目的测试代码1(基础)
最近写了测试代码,整理了一下. 先看看简单的测试代码. // add_test.go ==> 文件名 _test.go 结尾的默认为测试代码文件 package models import ( ...
随机推荐
- Spring事务隔离级别和传播机制
引言 什么是事务? 在理解事务之前,我们要先了解事务的基本作用 比如在生活中有这样一个场景----取钱,每个人应该都干过的事 在ATM机上取钱,1.输入密码----2.输入金额----3.银行扣钱-- ...
- 企业快速落地IT服务管理体系的六大关键步骤
许多企业在实施信息化战略时,一味地追求"技术高消费"而忽视了对信息技术的管理和内部业务流程的变革,侧重点仍然只是事后的技术支持和故障解决方面,随着企业对于信息技术的依赖程度的加重, ...
- 基于LoRA的RLHF
参考Github 开源模型LLM-Tuning 一.简介 (1)RLHF (基于人类反馈的强化学习) 分为三步: SFT (Supervised Fine-Tuning): 有监督的微调,使用正常的 ...
- 异构智联Wi-Fi6+蓝牙模组,重新定义多屏互联体验!
下班回家打开门,电灯.电视.空调.音响.电动窗帘.扫地机器人--一呼百应,有序开工,原本冰冷的房子立刻变成了温暖港湾.可以说,舒适便捷的智能设备已经完全融入了我们的生活中. 从单一场景.单一设备,到现 ...
- 记一个,生产遇到的redission锁,释放问题:lock.tryLock(0, 0, TimeUnit.SECONDS)
package com.aswatson.cdc.test; import org.redisson.Redisson; import org.redisson.api.RLock; import o ...
- 在高通Fastmmi模式中增强交互方式
在高通Fastmmi模式中增强交互方式 背景 由于之前工厂抱怨 FCT模式不好用. 之前的FCT测试是这样子的:PCBA上夹具,连接USB. 同时,使用上位机程序(ATE)发送指令,人工判断结果以后, ...
- [ABC184F] Programming Contest题解
前置知识 meet in middle (折半搜索) 会的大佬请跳过 不会的请自己前往oi wiki或CSDN(百度吧,少年) 解题思路 纯暴力 看完题目考虑将每一种情况计算出来,排序后找不超过T的最 ...
- 解决python命令行报错问题
解决Python报错Failed calling sys.__interactivehook__ 报错截图 可以看到主要的报错信息 File "D:\Python\Anaconda3\lib ...
- CF1860C 题解
显然是一个博弈论题,考虑 dp. 定义状态 \(dp_i\) 表示先手走到 \(i\) 之后是否有必胜策略,不难发现以下几点: 若走到 \(i\) 之后无路可走,那么就必败. 若走到 \(i\) 之后 ...
- Nginx负载配置
目录 Nginx 负载均衡笔记 1. 概述 1.1 Nginx 简介 1.2 负载均衡概述 2. 四层负载均衡(传输层) 2.1 工作原理 2.2 特点 2.3 优缺点 优点 缺点 2.4 示例场景 ...