Tests maken met .NET Aspire

Voltooid

Testen is een essentieel onderdeel van het ontwikkelen van hoogwaardige software. Testen kan u helpen fouten te vinden en op te lossen, prestaties te verbeteren en ervoor te zorgen dat uw code voldoet aan de vereisten en verwachtingen van uw gebruikers. Testen kan u ook helpen het implementatieproces te automatiseren en regressies in de toekomst te voorkomen. .NET Aspire biedt hulpprogramma's en bibliotheken om het ontwikkelen, testen en implementeren van gedistribueerde toepassingen te vereenvoudigen.

In deze les leert u hoe u .NET Aspire-projecten test met behulp van xUnit, een populair testframework voor .NET. U leert hoe u verschillende soorten tests maakt, zoals integratietests en functionele tests, en hoe u deze kunt uitvoeren met behulp van de .NET Aspire CLI of Visual Studio.

Een testproject maken

De eenvoudigste manier om een .NET Aspire-testproject te maken, is door de testprojectsjabloon te gebruiken. U kunt de dotnet new opdracht gebruiken om een standaardklassebibliotheekproject te maken en vervolgens de verwijzingen toe te voegen aan de .NET Aspire-testbibliotheken en de xUnit-pakketten.

dotnet new aspire-xunit

Het testproject verkennen

Het volgende voorbeeldtestproject is gemaakt als onderdeel van de .NET Aspire Starter Application-sjabloon . Als u er niet bekend mee bent, raadpleegt u Quickstart: Uw eerste .NET Aspire-project bouwen. Het .NET Aspire-testproject maakt gebruik van een projectreferentieafhankelijkheid van de doel-app-host. Houd rekening met het sjabloonproject:

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

Het voorgaande projectbestand is redelijk standaard. PackageReference Het NuGet-pakket Aspire.Hosting.Testing bevat de vereiste typen voor het schrijven van tests voor .NET Aspire-projecten.

Het sjabloontestproject bevat een WebTests klasse met één test. De test controleert het volgende scenario:

  • De app-host is gemaakt en gestart.
  • De webfrontend resource is beschikbaar en wordt uitgevoerd.
  • Een HTTP-aanvraag kan worden ingediend bij de webfrontend resource en retourneert een geslaagd antwoord (HTTP 200 OK).

Houd rekening met de volgende testklasse:

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

Met de voorgaande code wordt:

  • Is afhankelijk van het DistributedApplicationTestingBuilder asynchroon maken van de app-host.
  • De appHost methode is BuildAsync aangeroepen, waardoor het DistributedApplication exemplaar wordt geretourneerd als de app.
  • Er HttpClient wordt een gemaakt voor de webfrontend resource door aan te roepen app.CreateHttpClient.
  • De resourceNotificationService resource wordt gebruikt om te wachten totdat de webfrontend resource beschikbaar is en wordt uitgevoerd.
  • Er wordt een eenvoudige HTTP GET-aanvraag gedaan in de hoofdmap van de webfrontend resource.
  • De test bevestigt dat de antwoordstatuscode is OK.