Создание тестов с помощью .NET Aspire
Тестирование является важной частью разработки высококачественного программного обеспечения. Тестирование поможет вам найти и исправить ошибки, повысить производительность и убедиться, что код соответствует требованиям и ожиданиям пользователей. Тестирование также может помочь автоматизировать процесс развертывания и предотвратить регрессию в будущем. .NET Aspire предоставляет средства и библиотеки для упрощения разработки, тестирования и развертывания распределенных приложений.
В этом уроке вы узнаете, как протестировать проекты .NET Aspire с помощью xUnit, популярной платформы тестирования для .NET. Вы узнаете, как создавать различные типы тестов, таких как тесты интеграции и функциональные тесты, а также как их запускать с помощью .NET Aspire CLI или Visual Studio.
Создание тестового проекта
Самый простой способ создать тестовый проект .NET Aspire — использовать шаблон тестового проекта тестирования. С помощью dotnet new
команды можно создать проект стандартной библиотеки классов, а затем добавить ссылки на библиотеки тестирования .NET Aspire и пакеты xUnit.
dotnet new aspire-xunit
Изучение тестового проекта
В следующем примере тестового проекта был создан в рамках шаблона приложения .NET Aspire Starter. Если вы не знакомы с ним, см . краткое руководство. Создание первого проекта .NET Aspire. Тестовый проект .NET Aspire принимает зависимость ссылки на проект от целевого узла приложения. Рассмотрим проект шаблона:
<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>
Предыдущий файл проекта довольно стандартный. PackageReference
Существует пакет NuGet Aspire.Hosting.Testing, который включает необходимые типы для записи тестов для проектов .NET Aspire.
Проект теста шаблона включает WebTests
класс с одним тестом. Тест проверяет следующий сценарий:
- Узел приложения успешно создан и запущен.
- Ресурс
webfrontend
доступен и запущен. - HTTP-запрос может быть выполнен в
webfrontend
ресурс и возвращает успешный ответ (HTTP 200 OK).
Рассмотрим следующий тестовый класс:
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);
}
}
Предыдущий код:
- Используется для
DistributedApplicationTestingBuilder
асинхронного создания узла приложения.- Это
appHost
экземплярIDistributedApplicationTestingBuilder
, представляющий узел приложения. - Экземпляр
appHost
имеет свою коллекцию служб, настроенную с помощью стандартного обработчика устойчивости HTTP. Дополнительные сведения см. в статье "Создание устойчивых HTTP-приложений: ключевые шаблоны разработки".
- Это
- Вызывается
appHost
егоBuildAsync
метод, который возвращаетDistributedApplication
экземпляр в качестве объектаapp
.- У
app
поставщика ResourceNotificationService услуг есть экземпляр. - Запускается
app
асинхронно.
- У
- Создается
HttpClient
дляwebfrontend
ресурса путем вызоваapp.CreateHttpClient
. - Используется
resourceNotificationService
для ожидания доступностиwebfrontend
и запуска ресурса. - Простой HTTP-запрос GET выполняется в корневой
webfrontend
каталог ресурса. - Тест утверждает, что код состояния ответа является
OK
.