Creación de pruebas con .NET Aspire
Las pruebas son una parte esencial del desarrollo de software de alta calidad. Las pruebas pueden ayudarle a encontrar y corregir errores, mejorar el rendimiento y asegurarse de que el código cumple los requisitos y expectativas de los usuarios. Las pruebas también pueden ayudarle a automatizar el proceso de implementación y a evitar regresiones en el futuro. .NET Aspire proporciona herramientas y bibliotecas para simplificar el desarrollo, las pruebas y la implementación de aplicaciones distribuidas.
En esta unidad, aprenderá a probar proyectos de .NET Aspire mediante xUnit, un marco de pruebas popular para .NET. Aprenderá a crear diferentes tipos de pruebas, como pruebas de integración y pruebas funcionales, y a ejecutarlas mediante la CLI de .NET Aspire o Visual Studio.
Crear un proyecto de prueba
La manera más fácil de crear un proyecto de prueba de .NET Aspire es usar la plantilla de proyecto de prueba. Puede usar el comando dotnet new
para crear un proyecto de biblioteca de clases estándar y, a continuación, agregar las referencias a las bibliotecas de pruebas de .NET Aspire y los paquetes xUnit.
dotnet new aspire-xunit
Exploración del proyecto de prueba
El siguiente proyecto de prueba de ejemplo se ha creado como parte de la plantilla Aplicación de inicio de .NET Aspire. Si no está familiarizado con él, consulte Inicio rápido: Compile el primer proyecto de .NET Aspire. El proyecto de prueba de .NET Aspire toma una dependencia de referencia del proyecto en el host de la aplicación de destino. Considere el proyecto de plantilla:
<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>
El archivo de proyecto anterior es bastante estándar. Hay un PackageReference
para el paquete NuGet Aspire.Hosting.Testing, que incluye los tipos necesarios para escribir pruebas para proyectos de .NET Aspire.
El proyecto de prueba de plantilla incluye una clase WebTests
con una sola prueba. La prueba comprueba el siguiente escenario:
- El host de la aplicación se ha creado e iniciado correctamente.
- El recurso
webfrontend
está disponible y en ejecución. - Se puede realizar una solicitud HTTP al recurso de
webfrontend
y devuelve una respuesta correcta (HTTP 200 OK).
Tenga en cuenta la siguiente clase de prueba:
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);
}
}
El código anterior:
- Se basa en para
DistributedApplicationTestingBuilder
crear de forma asincrónica el host de la aplicación.- El
appHost
es una instanciaIDistributedApplicationTestingBuilder
que representa el host de la aplicación. - La instancia
appHost
tiene configurada su colección de servicios con el controlador de resistencia HTTP estándar. Para obtener más información, consulte Compilación de aplicaciones HTTP resistentes: Patrones de desarrollo clave.
- El
- El
appHost
tiene su métodoBuildAsync
invocado, que devuelve la instancia deDistributedApplication
comoapp
.- El
app
tiene su proveedor de servicios para obtener la instancia de ResourceNotificationService. - El
app
se inicia de forma asincrónica.
- El
- Se crea un
HttpClient
para el recurso dewebfrontend
llamando aapp.CreateHttpClient
. - El
resourceNotificationService
se usa para esperar a que el recurso dewebfrontend
esté disponible y en ejecución. - Se realiza una solicitud HTTP GET simple a la raíz del recurso
webfrontend
. - La prueba afirma que el código de estado de respuesta es
OK
.