测试方法论
This commit is contained in:
parent
4075405bfe
commit
f0b59294a9
48
blogs/abc.md
48
blogs/abc.md
@ -1 +1,47 @@
|
|||||||
测试几行代码,我们基本上做很多工作。
|
# 零度框架升级 8.0 稳定版
|
||||||
|
|
||||||
|
随着微软 Aspire 正式版的发布,零度框架 HelloShop 8.0 版本也正式发布了,本次改进高达 180 多项,代码已推送到 Github,主要包括以下几个方面。
|
||||||
|
|
||||||
|
## 升级到最新稳定版
|
||||||
|
|
||||||
|
之前,零度框架使用的是 Aspire 的多个预览版,导致了一些不稳定的问题,现在,零度框架和所有依赖包都升级到了最新稳定版,不再引用任何预览包,卸载掉 Visual Studio 2022 预览版,并升级到 17.10.0 稳定版,卸载掉所有 .NET 9.0 预览版,安装 .NET 8.0 SDK 稳定版,卸载掉所有 Aspire 预览版,将 Aspire 工作负载升级到 8.0.0 稳定版。项目所依赖的所有 NuGet 包都升级到了最新稳定版。
|
||||||
|
|
||||||
|
现在,零度框架和所有依赖包都升级到了最新稳定版,不再引用任何预览包。
|
||||||
|
|
||||||
|
|
||||||
|
## 远程权限检查改进
|
||||||
|
|
||||||
|
`PermissionsController` 和 `RemotePermissionChecker` 引入 RoleId 角色权限检查,
|
||||||
|
|
||||||
|
## 创建虚拟授权类用于测试
|
||||||
|
|
||||||
|
使用 `FakePermissionChecker` 类来模拟权限检查,方便后续单元和集成测试。
|
||||||
|
|
||||||
|
## 创建 Aspire 集成测试项目
|
||||||
|
|
||||||
|
|
||||||
|
创建 `HelloShop.FunctionalTests` 项目,该项目使用 Aspire 模板创建,用于集成测试,包括了一个 `FirstWebApiIntegrationTest` 测试类,用于测试所有微服务 Web API 的集成。
|
||||||
|
|
||||||
|
## 创建产品单元测试项目
|
||||||
|
|
||||||
|
创建 `HelloShop.ProductService.UnitTests` 项目,该项目使用 xUnit 模板创建,用于单元测试产品微服务中的代码,包括了一个 `ProductsControllerTest` 测试类,用于演示使用内存数据库模拟数据进行单元测试。包括一个 `MockProductsControllerTest` 测试类,用于演示使用 Moq 框架模拟数据进行单元测试。
|
||||||
|
|
||||||
|
## 创建产品集成测试项目
|
||||||
|
|
||||||
|
创建 `HelloShop.ProductService.FunctionalTests` 项目,该项目使用 xUnit 模板创建,用于集成测试产品微服务中的代码,包括了一个 `BrandApiIntegrationTest` 测试类,用于演示产品品牌 API 接口的集成测试,为了提高集成测试效率,使用 SQLite 内存数据库模拟数据,同时使用 `WebApplicationFactory` 类来模拟 Web 主机,以便在集成测试中使用真实的 HTTP 请求。通过使用 `WebApplicationFactory` 类,实现自动登录和令牌传递,以便在集成测试中使用真实的用户身份。
|
||||||
|
|
||||||
|
## 项目启动端口配置
|
||||||
|
|
||||||
|
为了项目更好的同时兼容 HTTP 和 HTTPS,每个微服务 `launchSettings` 文件中添加了 HTTP 和 HTTPS 端口配置,并约定 80xx 为 HTTP 端口,81xx 为 HTTPS 端口, 任何微服务都可通过两种协议访问以便于测试。
|
||||||
|
|
||||||
|
## 修复由于包升级导致的编译错误
|
||||||
|
|
||||||
|
这些升级包括 OpenApi 界面、删除过期的代码,修复由于包升级导致的编译错误。
|
||||||
|
|
||||||
|
## MAUI 项目升级
|
||||||
|
|
||||||
|
将 MAUI 项目升级到最新稳定版,修复由于包升级导致的编译错误。
|
||||||
|
|
||||||
|
## 后期版本计划
|
||||||
|
|
||||||
|
后期内容包括:Blazor 中控界面搭建、前端认证授权, MAUI 跨平台开发、安卓、IOS、MacOS、Windows 跨平台界面制作,后台自动任务管理、gRPC 微服务最佳实践、基于 Dapr 的事件服务总线和密钥管理、基于 Orleans 的分布式计算、基于 Aspire 项目的单机部署, K8S 集群容器化部署和 CI/CD 最佳实践,使用 OpenTelemetry 实现监控和追踪,使用 Prometheus 和 Grafana 实现监控和报警,分布式日志链路跟踪,性能追踪。
|
@ -4,9 +4,9 @@
|
|||||||
|
|
||||||
## 单元测试
|
## 单元测试
|
||||||
|
|
||||||
单元测试是一种试验单个软件组件或方法(也称为“工作单元”)的测试。 单元测试仅应测试开发人员控件内的代码。 它们不测试基础结构问题。 基础结构问题包括与数据库、文件系统和网络资源的交互。
|
单元测试是一种试验单个软件组件或方法(也称为“工作单元”)的测试。 单元测试仅应测试开发人员控件内的代码。 它们不测试基础结构问题。 基础结构问题包括与数据库、文件系统和网络资源的交互,零度框架中的单元测试使用 `xUnit` 框架,
|
||||||
|
|
||||||
项目命名规范: `<ProjectNamej>.UnitTests`。
|
项目命名规范: `<ProjectName>.UnitTests`。
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
public class Calculator
|
public class Calculator
|
||||||
@ -40,39 +40,62 @@ https://learn.microsoft.com/zh-cn/dotnet/core/testing/unit-testing-best-practice
|
|||||||
|
|
||||||
## 集成测试
|
## 集成测试
|
||||||
|
|
||||||
集成测试与单元测试的不同之处在于,它试验两个或更多软件组件一同工作(也称为其“集成”)的能力。这些测试在更广泛范围的受测系统上运行,而单元测试则侧重于单个组件。 通常,集成测试会包括对基础结构问题的测试。
|
集成测试也称为功能测试,与单元测试的不同之处在于,它试验两个或更多软件组件一同工作集成能力。这些测试在更广泛范围的受测系统上运行,而单元测试则侧重于单个组件函数,通常,集成测试会包括对基础结构问题的测试,例如数据库、文件系统和网络资源的交互。
|
||||||
|
|
||||||
项目命名规范: `<ProjectNamej>.FunctionalTests`。
|
项目命名规范: `<ProjectName>.FunctionalTests`。
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
public class Calculator
|
public class Controller: ControllerBase
|
||||||
{
|
{
|
||||||
public int Add(int a, int b)
|
private readonly IService _service;
|
||||||
|
|
||||||
|
public Controller(IService service)
|
||||||
{
|
{
|
||||||
return a + b;
|
_service = service;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<IActionResult> Get(int id)
|
||||||
|
{
|
||||||
|
var result = await _service.Get(id);
|
||||||
|
return Ok(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CalculatorTests
|
public class Service: IService
|
||||||
{
|
{
|
||||||
|
public async Task<Model> Get(int id)
|
||||||
|
{
|
||||||
|
return await _repository.Get(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ServiceTest: IClassFixture<WebApplicationFactory<Startup>>
|
||||||
|
{
|
||||||
|
private readonly WebApplicationFactory<Startup> _factory;
|
||||||
|
|
||||||
|
public ServiceTest(WebApplicationFactory<Startup> factory)
|
||||||
|
{
|
||||||
|
_factory = factory;
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Add_WhenCalled_ReturnsTheSumOfArguments()
|
public async Task Get_WhenCalled_ReturnsModel()
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var calculator = new Calculator();
|
var client = _factory.CreateClient();
|
||||||
|
var response = await client.GetAsync("/api/controller/1");
|
||||||
// Act
|
response.EnsureSuccessStatusCode();
|
||||||
var result = calculator.Add(1, 2);
|
var model = await response.Content.ReadAsAsync<Model>();
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal(3, result);
|
Assert.NotNull(model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## 负载测试和压力测试
|
## 负载测试和压力测试
|
||||||
|
|
||||||
|
|
||||||
负载测试:测试应用是否可以在特定情况下处理指定的用户负载,同时仍满足响应目标,应用在正常状态下运行。
|
负载测试:测试应用是否可以在特定情况下处理指定的用户负载,同时仍满足响应目标,应用在正常状态下运行。
|
||||||
|
|
||||||
压力测试:在极端条件下(通常为长时间)运行时测试应用的稳定性,测试会对应用施加高用户负载(峰值或逐渐增加的负载)或限制应用的计算资源。
|
压力测试:在极端条件下(通常为长时间)运行时测试应用的稳定性,测试会对应用施加高用户负载(峰值或逐渐增加的负载)或限制应用的计算资源。
|
||||||
@ -82,3 +105,7 @@ public class CalculatorTests
|
|||||||
## 在 Blazor 中测试 Razor 组件
|
## 在 Blazor 中测试 Razor 组件
|
||||||
|
|
||||||
Playwright for .NET 就是一个可用于 Blazor 应用的 E2E 测试框架。没有面向 Blazor 的官方 Microsoft 测试框架,但社区驱动的项目 bUnit 提供一种方便的方法来对 Razor 组件进行单元测试。bUnit 适用于常规用途的测试框架,例如 MSTest、NUnit 和 xUnit。
|
Playwright for .NET 就是一个可用于 Blazor 应用的 E2E 测试框架。没有面向 Blazor 的官方 Microsoft 测试框架,但社区驱动的项目 bUnit 提供一种方便的方法来对 Razor 组件进行单元测试。bUnit 适用于常规用途的测试框架,例如 MSTest、NUnit 和 xUnit。
|
||||||
|
|
||||||
|
## 基准测试
|
||||||
|
|
||||||
|
基准测试是一种测试方法,用于确定应用程序的性能基准。基准测试通常用于确定应用程序的性能基准,以便在应用程序的生命周期中进行性能优化。使用 `BenchmarkDotNet` 进行基准测试。
|
Loading…
Reference in New Issue
Block a user