Создание тестов с помощью .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 его BuildAsync метод, который возвращает DistributedApplication экземпляр в качестве объекта app.
    • У app поставщика ResourceNotificationService услуг есть экземпляр.
    • Запускается app асинхронно.
  • Создается HttpClient для webfrontend ресурса путем вызова app.CreateHttpClient.
  • Используется resourceNotificationService для ожидания доступности webfrontend и запуска ресурса.
  • Простой HTTP-запрос GET выполняется в корневой webfrontend каталог ресурса.
  • Тест утверждает, что код состояния ответа является OK.