diff --git a/blogs/abc.md b/blogs/abc.md index a24f7cf..3535451 100644 --- a/blogs/abc.md +++ b/blogs/abc.md @@ -1 +1,47 @@ -测试几行代码,我们基本上做很多工作。 \ No newline at end of file +# 零度框架升级 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 实现监控和报警,分布式日志链路跟踪,性能追踪。 \ No newline at end of file diff --git a/notes/helloshop/dot-net-core-testing.md b/notes/helloshop/dot-net-core-testing.md index 30346d4..768b992 100644 --- a/notes/helloshop/dot-net-core-testing.md +++ b/notes/helloshop/dot-net-core-testing.md @@ -4,9 +4,9 @@ ## 单元测试 -单元测试是一种试验单个软件组件或方法(也称为“工作单元”)的测试。 单元测试仅应测试开发人员控件内的代码。 它们不测试基础结构问题。 基础结构问题包括与数据库、文件系统和网络资源的交互。 +单元测试是一种试验单个软件组件或方法(也称为“工作单元”)的测试。 单元测试仅应测试开发人员控件内的代码。 它们不测试基础结构问题。 基础结构问题包括与数据库、文件系统和网络资源的交互,零度框架中的单元测试使用 `xUnit` 框架, -项目命名规范: `.UnitTests`。 +项目命名规范: `.UnitTests`。 ```csharp public class Calculator @@ -40,39 +40,62 @@ https://learn.microsoft.com/zh-cn/dotnet/core/testing/unit-testing-best-practice ## 集成测试 -集成测试与单元测试的不同之处在于,它试验两个或更多软件组件一同工作(也称为其“集成”)的能力。这些测试在更广泛范围的受测系统上运行,而单元测试则侧重于单个组件。 通常,集成测试会包括对基础结构问题的测试。 +集成测试也称为功能测试,与单元测试的不同之处在于,它试验两个或更多软件组件一同工作集成能力。这些测试在更广泛范围的受测系统上运行,而单元测试则侧重于单个组件函数,通常,集成测试会包括对基础结构问题的测试,例如数据库、文件系统和网络资源的交互。 -项目命名规范: `.FunctionalTests`。 +项目命名规范: `.FunctionalTests`。 ```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 Get(int id) + { + var result = await _service.Get(id); + return Ok(result); } } -public class CalculatorTests +public class Service: IService { + public async Task Get(int id) + { + return await _repository.Get(id); + } +} + +public class ServiceTest: IClassFixture> +{ + private readonly WebApplicationFactory _factory; + + public ServiceTest(WebApplicationFactory factory) + { + _factory = factory; + } + [Fact] - public void Add_WhenCalled_ReturnsTheSumOfArguments() + public async Task Get_WhenCalled_ReturnsModel() { // Arrange - var calculator = new Calculator(); - - // Act - var result = calculator.Add(1, 2); + var client = _factory.CreateClient(); + var response = await client.GetAsync("/api/controller/1"); + response.EnsureSuccessStatusCode(); + var model = await response.Content.ReadAsAsync(); // Assert - Assert.Equal(3, result); + Assert.NotNull(model); } } ``` ## 负载测试和压力测试 - 负载测试:测试应用是否可以在特定情况下处理指定的用户负载,同时仍满足响应目标,应用在正常状态下运行。 压力测试:在极端条件下(通常为长时间)运行时测试应用的稳定性,测试会对应用施加高用户负载(峰值或逐渐增加的负载)或限制应用的计算资源。 @@ -81,4 +104,8 @@ public class CalculatorTests ## 在 Blazor 中测试 Razor 组件 - Playwright for .NET 就是一个可用于 Blazor 应用的 E2E 测试框架。没有面向 Blazor 的官方 Microsoft 测试框架,但社区驱动的项目 bUnit 提供一种方便的方法来对 Razor 组件进行单元测试。bUnit 适用于常规用途的测试框架,例如 MSTest、NUnit 和 xUnit。 \ No newline at end of file + Playwright for .NET 就是一个可用于 Blazor 应用的 E2E 测试框架。没有面向 Blazor 的官方 Microsoft 测试框架,但社区驱动的项目 bUnit 提供一种方便的方法来对 Razor 组件进行单元测试。bUnit 适用于常规用途的测试框架,例如 MSTest、NUnit 和 xUnit。 + +## 基准测试 + +基准测试是一种测试方法,用于确定应用程序的性能基准。基准测试通常用于确定应用程序的性能基准,以便在应用程序的生命周期中进行性能优化。使用 `BenchmarkDotNet` 进行基准测试。 \ No newline at end of file