Skapa tester med .NET Aspire

Slutförd

Testning är en viktig del av utvecklingen av programvara av hög kvalitet. Testning kan hjälpa dig att hitta och åtgärda buggar, förbättra prestanda och se till att koden uppfyller användarnas krav och förväntningar. Testning kan också hjälpa dig att automatisera distributionsprocessen och förhindra regressioner i framtiden. .NET Aspire tillhandahåller verktyg och bibliotek för att förenkla utveckling, testning och distribution av distribuerade program.

I den här lektionen får du lära dig hur du testar .NET Aspire-projekt med hjälp av xUnit, ett populärt testramverk för .NET. Du lär dig hur du skapar olika typer av tester, till exempel integreringstester och funktionella tester, och hur du kör dem med hjälp av .NET Aspire CLI eller Visual Studio.

Skapa ett testprojekt

Det enklaste sättet att skapa ett .NET Aspire-testprojekt är att använda testprojektmallen. Du kan använda dotnet new kommandot för att skapa ett standardklassbiblioteksprojekt och sedan lägga till referenserna till .NET Aspire-testbiblioteken och xUnit-paketen.

dotnet new aspire-xunit

Utforska testprojektet

Följande exempeltestprojekt skapades som en del av .NET Aspire Starter-programmallen . Om du inte känner till det kan du läsa Snabbstart: Skapa ditt första .NET Aspire-projekt. .NET Aspire-testprojektet har ett projektreferensberoende på målappens värd. Överväg mallprojektet:

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

Den föregående projektfilen är ganska standard. NuGet-paketet PackageReference Aspire.Hosting.Testing innehåller de typer som krävs för att skriva tester för .NET Aspire-projekt.

Malltestprojektet innehåller en WebTests klass med ett enda test. Testet verifierar följande scenario:

  • Appvärden har skapats och startats.
  • Resursen webfrontend är tillgänglig och körs.
  • En HTTP-begäran kan göras till resursen webfrontend och returnerar ett lyckat svar (HTTP 200 OK).

Överväg följande testklass:

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

Koden ovan:

  • Förlitar sig på DistributedApplicationTestingBuilder att asynkront skapa appvärden.
  • Har appHost sin BuildAsync -metod anropad, som returnerar instansen appDistributedApplication som .
  • En HttpClient skapas för resursen webfrontend genom att anropa app.CreateHttpClient.
  • resourceNotificationService Används för att vänta tills resursen webfrontend är tillgänglig och körs.
  • En enkel HTTP GET-begäran görs till resursens webfrontend rot.
  • Testet hävdar att svarsstatuskoden är OK.