Criar testes com o .NET Aspire

Concluído

Os testes são uma parte essencial do desenvolvimento de software de alta qualidade. Os testes podem ajudá-lo a encontrar e corrigir bugs, melhorar o desempenho e garantir que seu código atenda aos requisitos e expectativas de seus usuários. Os testes também podem ajudá-lo a automatizar o processo de implantação e evitar regressões no futuro. O .NET Aspire fornece ferramentas e bibliotecas para simplificar o desenvolvimento, teste e implantação de aplicativos distribuídos.

Nesta unidade, você aprenderá a testar projetos do .NET Aspire usando o xUnit, uma estrutura de teste popular para o .NET. Você aprende a criar diferentes tipos de testes, como testes de integração e testes funcionais, e como executá-los usando a CLI do .NET Aspire ou o Visual Studio.

Criar um projeto de teste

A maneira mais fácil de criar um projeto de teste do .NET Aspire é usar o modelo de projeto de teste. Você pode usar o dotnet new comando para criar um projeto de biblioteca de classes padrão e, em seguida, adicionar as referências às bibliotecas de teste do .NET Aspire e aos pacotes xUnit.

dotnet new aspire-xunit

Explore o projeto de teste

O projeto de teste de exemplo a seguir foi criado como parte do modelo .NET Aspire Starter Application . Se você não estiver familiarizado com ele, consulte Guia de início rápido: criar seu primeiro projeto .NET Aspire . O projeto de teste .NET Aspire usa uma dependência de referência de projeto no host do aplicativo de destino. Considere o projeto modelo:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <IsPackable>false</IsPackable>
    <IsTestProject>true</IsTestProject>
  </PropertyGroup>


  <ItemGroup>
    <PackageReference Include="Aspire.Hosting.Testing" Version="8.1.0" />
    <PackageReference Include="coverlet.collector" Version="6.0.2" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.0" />
    <PackageReference Include="xunit" Version="2.9.0" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\AspireApp.AppHost\AspireApp.AppHost.csproj" />
  </ItemGroup>

  <ItemGroup>
    <Using Include="System.Net" />
    <Using Include="Microsoft.Extensions.DependencyInjection" />
    <Using Include="Aspire.Hosting.ApplicationModel" />
    <Using Include="Aspire.Hosting.Testing" />
    <Using Include="Xunit" />
  </ItemGroup>

</Project>

O arquivo de projeto anterior é bastante padrão. Há um PackageReference para o pacote NuGet Aspire.Hosting.Testing , que inclui os tipos necessários para escrever testes para projetos .NET Aspire .

O projeto de teste de modelo inclui uma WebTests classe com um único teste. O teste verifica o seguinte cenário:

  • O host do aplicativo é criado e iniciado com êxito.
  • O webfrontend recurso está disponível e em execução.
  • Uma solicitação HTTP pode ser feita para o webfrontend recurso e retorna uma resposta bem-sucedida (HTTP 200 OK).

Considere a seguinte classe de teste:

namespace AspireApp.Tests;

public class WebTests
{
    [Fact]
    public async Task GetWebResourceRootReturnsOkStatusCode()
    {
        // Arrange
        var appHost = await DistributedApplicationTestingBuilder
            .CreateAsync<Projects.AspireApp_AppHost>();

        appHost.Services.ConfigureHttpClientDefaults(clientBuilder =>
        {
            clientBuilder.AddStandardResilienceHandler();
        });

        await using var app = await appHost.BuildAsync();

        var resourceNotificationService = app.Services
            .GetRequiredService<ResourceNotificationService>();
        
        await app.StartAsync();

        // Act
        var httpClient = app.CreateHttpClient("webfrontend");

        await resourceNotificationService.WaitForResourceAsync(
                "webfrontend",
                KnownResourceStates.Running
            )
            .WaitAsync(TimeSpan.FromSeconds(30));
        
        var response = await httpClient.GetAsync("/");

        // Assert
        Assert.Equal(HttpStatusCode.OK, response.StatusCode);
    }
}

O código anterior:

  • Depende do para criar de forma assíncrona DistributedApplicationTestingBuilder o host do aplicativo.
    • O appHost é uma instância de que representa o host do IDistributedApplicationTestingBuilder aplicativo.
    • A appHost instância tem sua coleção de serviços configurada com o manipulador de resiliência HTTP padrão. Para obter mais informações, consulte Criar aplicativos HTTP resilientes: principais padrões de desenvolvimento.
  • O appHost tem seu BuildAsync método invocado, que retorna a DistributedApplication instância como o app.
  • Um HttpClient é criado para o webfrontend recurso chamando app.CreateHttpClient.
  • O resourceNotificationService é usado para aguardar que o webfrontend recurso esteja disponível e em execução.
  • Uma simples solicitação HTTP GET é feita para a raiz do webfrontend recurso.
  • O teste afirma que o código de status da resposta é OK.