Aspire 测试概述

Aspire 支持通过 📦Aspire.Hosting.Testing NuGet 包自动测试应用程序。 此包提供 DistributedApplicationTestingBuilder 类,用于为应用程序创建测试主机。 测试生成器在后台线程中启动 AppHost 项目并管理其生命周期,允许你通过 DistributedApplicationTestingBuilderDistributedApplication 实例控制和作应用程序及其资源。

默认情况下,测试生成器禁用仪表板并随机化代理资源的端口,使应用程序的多个实例能够并发运行。 测试完成后,销毁应用程序或测试构建器会清理应用资源。

若要开始编写第一个集成测试 Aspire,请参阅 编写第一篇 Aspire 测试 文章。

测试 Aspire 解决方案

Aspire测试功能专为整个分布式应用程序的封闭式集成测试而设计。 与单元测试或开放式集成测试(通常以隔离方式运行单个组件)不同, Aspire 测试会启动完整的解决方案(AppHost 及其所有资源),作为单独的进程,密切模拟实际方案。

请考虑下图,其中显示了测试项目如何 Aspire 启动 AppHost,然后启动应用程序及其资源:

Aspire 测试图表

  1. 测试项目启动 AppHost。
  2. AppHost 进程启动。
  3. AppHost 运行DatabaseAPIFrontend应用程序。
  4. 测试项目Frontend 应用程序发送 HTTP 请求。

该图演示 了测试项目 启动 AppHost,然后协调所有依赖的应用资源,而不管其类型如何。 测试项目能够将 HTTP 请求发送到 Frontend 应用,具体取决于 API 应用,API 应用依赖于 Database。 成功的请求确认 Frontend 应用可以与 API 应用通信,并且 API 应用可以成功从 Database获取数据。 有关查看此方法的实际应用的详细信息,请参阅 编写你的第一个 Aspire 测试

重要

Aspire 测试不会启用模拟、替代或替换依赖注入中的服务的场景,因为测试在单独的进程中运行。

当您想要的时候使用 Aspire 进行测试:

  • 验证分布式应用程序的端到端功能。
  • 确保多个服务和资源(如数据库)之间的交互在现实情况下的行为正确。
  • 确认数据持久性并与实际外部依赖项(如 PostgreSQL 数据库)集成。

如果您的目标是隔离测试单个项目、运行内存中的组件或模拟外部依赖项,请考虑改用 WebApplicationFactory<TEntryPoint>

备注

Aspire 测试将应用程序作为单独的进程运行,这意味着你无权从测试代码直接访问内部服务或组件。 可以通过环境变量或配置设置影响应用程序行为,但内部状态和服务仍封装在各自的进程中。

禁用端口随机化

默认情况下, Aspire 使用随机端口允许应用程序的多个实例并发运行,而不会造成干扰。 它使用 Aspire服务发现 来确保应用程序可以找到彼此的终结点。 若要禁用端口随机化,请在构造测试生成器时传递 "DcpPublisher:RandomizePorts=false",如以下代码片段所示:

var builder = await DistributedApplicationTestingBuilder
    .CreateAsync<Projects.MyAppHost>(
        [
            "DcpPublisher:RandomizePorts=false"
        ]);

启用仪表板

测试生成器默认禁用 Aspire 仪表板 。 若要启用此功能,可以在创建测试生成器时将 DisableDashboard 属性设置为 false,如以下代码片段所示:

var builder = await DistributedApplicationTestingBuilder
    .CreateAsync<Projects.MyAppHost>(
        args: [],
        configureBuilder: (appOptions, hostSettings) =>
        {
            appOptions.DisableDashboard = false;
        });

另请参阅