Criar testes com o .NET Aspire
Os testes são uma parte essencial do desenvolvimento de software de alta qualidade. Os testes podem ajudá-lo a encontrar e corrigir bugs, melhorar o desempenho e garantir que seu código atenda aos requisitos e expectativas de seus usuários. Os testes também podem ajudá-lo a automatizar o processo de implantação e evitar regressões no futuro. O .NET Aspire fornece ferramentas e bibliotecas para simplificar o desenvolvimento, teste e implantação de aplicativos distribuídos.
Nesta unidade, você aprenderá a testar projetos do .NET Aspire usando o xUnit, uma estrutura de teste popular para o .NET. Você aprende a criar diferentes tipos de testes, como testes de integração e testes funcionais, e como executá-los usando a CLI do .NET Aspire ou o Visual Studio.
Criar um projeto de teste
A maneira mais fácil de criar um projeto de teste do .NET Aspire é usar o modelo de projeto de teste. Você pode usar o dotnet new
comando para criar um projeto de biblioteca de classes padrão e, em seguida, adicionar as referências às bibliotecas de teste do .NET Aspire e aos pacotes xUnit.
dotnet new aspire-xunit
Explore o projeto de teste
O projeto de teste de exemplo a seguir foi criado como parte do modelo .NET Aspire Starter Application . Se você não estiver familiarizado com ele, consulte Guia de início rápido: criar seu primeiro projeto .NET Aspire . O projeto de teste .NET Aspire usa uma dependência de referência de projeto no host do aplicativo de destino. Considere o projeto modelo:
<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>
O arquivo de projeto anterior é bastante padrão. Há um PackageReference
para o pacote NuGet Aspire.Hosting.Testing , que inclui os tipos necessários para escrever testes para projetos .NET Aspire .
O projeto de teste de modelo inclui uma WebTests
classe com um único teste. O teste verifica o seguinte cenário:
- O host do aplicativo é criado e iniciado com êxito.
- O
webfrontend
recurso está disponível e em execução. - Uma solicitação HTTP pode ser feita para o
webfrontend
recurso e retorna uma resposta bem-sucedida (HTTP 200 OK).
Considere a seguinte classe de teste:
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);
}
}
O código anterior:
- Depende do para criar de forma assíncrona
DistributedApplicationTestingBuilder
o host do aplicativo.- O
appHost
é uma instância de que representa o host doIDistributedApplicationTestingBuilder
aplicativo. - A
appHost
instância tem sua coleção de serviços configurada com o manipulador de resiliência HTTP padrão. Para obter mais informações, consulte Criar aplicativos HTTP resilientes: principais padrões de desenvolvimento.
- O
- O
appHost
tem seuBuildAsync
método invocado, que retorna aDistributedApplication
instância como oapp
.- O
app
seu prestador de serviços obtém a ResourceNotificationService instância. - O
app
é iniciado de forma assíncrona.
- O
- Um
HttpClient
é criado para owebfrontend
recurso chamandoapp.CreateHttpClient
. - O
resourceNotificationService
é usado para aguardar que owebfrontend
recurso esteja disponível e em execução. - Uma simples solicitação HTTP GET é feita para a raiz do
webfrontend
recurso. - O teste afirma que o código de status da resposta é
OK
.