Vytváření testů pomocí .NET Aspire

Dokončeno

Testování je důležitou součástí vývoje vysoce kvalitního softwaru. Testování vám pomůže najít a opravit chyby, zlepšit výkon a zajistit, aby váš kód splňoval požadavky a očekávání uživatelů. Testování vám také pomůže automatizovat proces nasazení a zabránit regresím v budoucnu. .NET Aspire poskytuje nástroje a knihovny pro zjednodušení vývoje, testování a nasazení distribuovaných aplikací.

V této lekci se naučíte testovat projekty .NET Aspire pomocí xUnit, což je oblíbená testovací architektura pro .NET. Naučíte se vytvářet různé typy testů, jako jsou integrační testy a funkční testy a jak je spustit pomocí rozhraní příkazového řádku .NET nebo sady Visual Studio.

Vytvoření testovacího projektu

Nejjednodušší způsob, jak vytvořit projekt testu .NET Aspire, je použít šablonu testovacího projektu. Pomocí příkazu můžete dotnet new vytvořit standardní projekt knihovny tříd a pak přidat odkazy na knihovny testování .NET Aspire a balíčky xUnit.

dotnet new aspire-xunit

Prozkoumání testovacího projektu

Následující ukázkový testovací projekt byl vytvořen jako součást šablony aplikace .NET Aspire Starter. Pokud ho neznáte, přečtěte si článek Rychlý start: Sestavení prvního projektu .NET Aspire. Projekt testu .NET Aspire přebírá závislost odkazu na projekt na hostitele cílové aplikace. Zvažte projekt šablony:

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

Předchozí soubor projektu je poměrně standardní. PackageReference Existuje balíček NuGet Aspire.Hosting.Testing, který obsahuje požadované typy pro zápis testů pro projekty .NET Aspire.

Projekt testu šablony obsahuje WebTests třídu s jedním testem. Test ověří následující scénář:

  • Hostitel aplikace se úspěšně vytvořil a spustil.
  • Prostředek webfrontend je dostupný a spuštěný.
  • Požadavek HTTP je možné provést pro webfrontend prostředek a vrátit úspěšnou odpověď (HTTP 200 OK).

Vezměte v úvahu následující testovací třídu:

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

Předchozí kód:

  • Spoléhá na DistributedApplicationTestingBuilder asynchronní vytvoření hostitele aplikace.
  • appHost svou BuildAsync metodu vyvolá, která vrátí DistributedApplication instanci jako app.
  • Vytvoří se HttpClient pro webfrontend prostředek voláním app.CreateHttpClient.
  • Slouží resourceNotificationService k čekání na webfrontend dostupnost a spuštění prostředku.
  • V kořenovém webfrontend adresáři prostředku se vytvoří jednoduchý požadavek HTTP GET.
  • Test tvrdí, že stavový kód odpovědi je OK.