Creación de pruebas con .NET Aspire

Completado

Las pruebas son una parte esencial del desarrollo de software de alta calidad. Las pruebas pueden ayudarle a encontrar y corregir errores, mejorar el rendimiento y asegurarse de que el código cumple los requisitos y expectativas de los usuarios. Las pruebas también pueden ayudarle a automatizar el proceso de implementación y a evitar regresiones en el futuro. .NET Aspire proporciona herramientas y bibliotecas para simplificar el desarrollo, las pruebas y la implementación de aplicaciones distribuidas.

En esta unidad, aprenderá a probar proyectos de .NET Aspire mediante xUnit, un marco de pruebas popular para .NET. Aprenderá a crear diferentes tipos de pruebas, como pruebas de integración y pruebas funcionales, y a ejecutarlas mediante la CLI de .NET Aspire o Visual Studio.

Crear un proyecto de prueba

La manera más fácil de crear un proyecto de prueba de .NET Aspire es usar la plantilla de proyecto de prueba. Puede usar el comando dotnet new para crear un proyecto de biblioteca de clases estándar y, a continuación, agregar las referencias a las bibliotecas de pruebas de .NET Aspire y los paquetes xUnit.

dotnet new aspire-xunit

Exploración del proyecto de prueba

El siguiente proyecto de prueba de ejemplo se ha creado como parte de la plantilla Aplicación de inicio de .NET Aspire. Si no está familiarizado con él, consulte Inicio rápido: Compile el primer proyecto de .NET Aspire. El proyecto de prueba de .NET Aspire toma una dependencia de referencia del proyecto en el host de la aplicación de destino. Considere el proyecto de plantilla:

<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>

El archivo de proyecto anterior es bastante estándar. Hay un PackageReference para el paquete NuGet Aspire.Hosting.Testing, que incluye los tipos necesarios para escribir pruebas para proyectos de .NET Aspire.

El proyecto de prueba de plantilla incluye una clase WebTests con una sola prueba. La prueba comprueba el siguiente escenario:

  • El host de la aplicación se ha creado e iniciado correctamente.
  • El recurso webfrontend está disponible y en ejecución.
  • Se puede realizar una solicitud HTTP al recurso de webfrontend y devuelve una respuesta correcta (HTTP 200 OK).

Tenga en cuenta la siguiente clase de prueba:

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);
    }
}

El código anterior:

  • Se basa en para DistributedApplicationTestingBuilder crear de forma asincrónica el host de la aplicación.
  • El appHost tiene su método BuildAsync invocado, que devuelve la instancia de DistributedApplication como app.
    • El app tiene su proveedor de servicios para obtener la instancia de ResourceNotificationService.
    • El app se inicia de forma asincrónica.
  • Se crea un HttpClient para el recurso de webfrontend llamando a app.CreateHttpClient.
  • El resourceNotificationService se usa para esperar a que el recurso de webfrontend esté disponible y en ejecución.
  • Se realiza una solicitud HTTP GET simple a la raíz del recurso webfrontend.
  • La prueba afirma que el código de estado de respuesta es OK.