Erstellen von Tests mit .NET Aspire

Abgeschlossen

Das Testen ist ein wesentlicher Bestandteil bei der Entwicklung hochwertiger Software. Tests können dazu beitragen, Fehler zu finden und zu beheben, die Leistung zu verbessern und sicherzustellen, dass Ihr Code die Anforderungen und Erwartungen Ihrer Benutzer erfüllt. Tests können Ihnen auch helfen, den Bereitstellungsprozess zu automatisieren und Regressionen in Zukunft zu verhindern. .NET Aspire bietet Tools und Bibliotheken, um die Entwicklung, das Testen und die Bereitstellung verteilter Anwendungen zu vereinfachen.

In dieser Lerneinheit erfahren Sie, wie Sie .NET Aspire-Projekte mit xUnit testen, einem beliebten Testframework für .NET. Sie erfahren, wie Sie verschiedene Arten von Tests erstellen, z. B. Integrationstests und Funktionstests, und wie Sie sie mit der .NET Aspire CLI oder Visual Studio ausführen.

Erstellen eines Testprojekts

Die einfachste Möglichkeit zum Erstellen eines .NET Aspire-Testprojekts besteht darin, die Testprojektvorlage zu verwenden. Sie können den Befehl dotnet new verwenden, um ein Standardklassenbibliotheksprojekt zu erstellen, und dann die Verweise auf die .NET Aspire-Testbibliotheken und die xUnit-Pakete hinzufügen.

dotnet new aspire-xunit

Grundlegendes zum Testprojekt

Das folgende Beispieltestprojekt wurde als Teil der Vorlage .NET Aspire-Startanwendung erstellt. Wenn Sie damit nicht vertraut sind, lesen Sie Schnellstart: Erstellen Ihres ersten .NET Aspire-Projekts. Das .NET Aspire-Testprojekt verwendet eine Projektreferenzabhängigkeit vom Ziel-App-Host. Betrachten Sie das Vorlagenprojekt:

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

Die vorherige Projektdatei ist ziemlich gewöhnlich. Es gibt einen PackageReference zum NuGet-Paket Aspire.Hosting.Testing, das die erforderlichen Typen zum Schreiben von Tests für .NET Aspire-Projekte enthält.

Das Vorlagentestprojekt enthält eine WebTests-Klasse mit einem einzelnen Test. Der Test verifiziert das folgende Szenario:

  • Der App-Host wurde erfolgreich erstellt und gestartet.
  • Die webfrontend-Ressource ist verfügbar und wird ausgeführt.
  • Eine HTTP-Anforderung kann an die webfrontend-Ressource gesendet und eine erfolgreiche Antwort (HTTP 200 OK) zurückgegeben werden.

Berücksichtigen Sie die folgende 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);
    }
}

Der vorangehende Code:

  • Basiert auf DistributedApplicationTestingBuilder, um den App-Host asynchron zu erstellen.
    • appHost ist eine Instanz von IDistributedApplicationTestingBuilder, die den App-Host darstellt.
    • Die Dienstsammlung der appHost-Instanz ist mit dem standardmäßigen HTTP-Resilienzhandler konfiguriert. Weitere Informationen finden Sie unter Erstellen resilienter HTTP-Apps: gängige Entwicklungsmuster.
  • appHost hat die BuildAsync-Methode aufgerufen, die die DistributedApplication-Instanz als app zurückgibt.
  • Für die webfrontend-Ressource wird HttpClient erstellt, indem app.CreateHttpClient aufgerufen wird.
  • resourceNotificationService wird verwendet, um zu warten, bis die webfrontend-Ressource verfügbar ist und ausgeführt wird.
  • Eine einfache HTTP GET-Anforderung wird an den Stamm der webfrontend-Ressource gesendet.
  • Der Test bestätigt, dass der Antwortstatuscode OK lautet.