Erstellen von Tests mit .NET Aspire
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 vonIDistributedApplicationTestingBuilder
, 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 dieBuildAsync
-Methode aufgerufen, die dieDistributedApplication
-Instanz alsapp
zurückgibt.app
verwendet den Dienstanbieter, um die ResourceNotificationService-Instanz abzurufen.app
wird asynchron gestartet.
- Für die
webfrontend
-Ressource wirdHttpClient
erstellt, indemapp.CreateHttpClient
aufgerufen wird. resourceNotificationService
wird verwendet, um zu warten, bis diewebfrontend
-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.