Обложка канала

.NET Разработчик

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

.NET Разработчик

4 года назад
Открыть в
День 1444. #МоиИнструменты Тестовые Контейнеры в C#/.NET Многие приложения сильно зависят от реляционной базы данных. Ваше приложение использует сложные запросы, ограничения на данные и другие возможности реляционной базы данных. Это означает, что многое в поведении ваших приложений зависит от того, как действует база данных. Поэтому важно проводить тесты на реальной базе. Сегодня это легко сделать с помощью TestContainers. TestContainers — это библиотека, которая запускает контейнеры Docker для ваших тестов и предоставляет множество настроек для баз данных. Попробуем настроить тестовый контейнер с Microsoft SqlServer:
// настройка БД
var dbConfig = new MsSqlTestcontainerConfiguration
{
  Password = "Test1234",
  Database = "TestDB"
};

// создание контейнера
var сontainer = 
 new TestcontainersBuilder<MsSqlTestcontainer>()
  .WithDatabase(dbConfig)
  .WithImage("mcr.microsoft.com/mssql/server:2022-latest")
  .Build();

// и запуск
container.StartAsync().Wait();

Этот код загрузит образ докера MS Server и запустит контейнер. Затем запросит строку подключения для этого контейнера и запустит тесты для него. Если не указать путь к образу, будет использован образ по умолчанию. Если предварительно настроенные контейнеры вам не подходят, вы можете запустить произвольный образ с базовым тестовым контейнером. Посмотрим пример теста:
record Dog (string Name, DateTime BirthDate);

using (var db = new SqlConnection(
  container.ConnectionString))
{ 
  db.Execute(@"CREATE TABLE Dogs(
    BirthDate DATETIME NOT NULL,
    Name VARCHAR(MAX) NOT NULL
  )");

  var born = new DateTime(2022, 12, 22);
  db.Execute(@"
   INSERT Dogs(BirthDate,Name)
   VALUES(@BirthDate, @Name)",
   new {
    BirthDate = born,
    Name = "Joe"
   });

  var dog = db.Query<Dog>(
    @"SELECT * FROM Dogs")
   .First();
  Assert.AreEqual(born, dog.BirthDate);
}

// очищаем контейнер
container.DisposeAsync();

Что если убить процесс, который запускает тесты? Что произойдёт с контейнерами, которые он создал? На самом деле при запуске тестового контейнера создаётся два контейнера. Помимо запущенного вами, создаётся контейнер testcontainers/ryuk, который управляет всеми тестовыми контейнерами и выполняет очистку при сбоях. В TestContainers встроена поддержка многих баз данных в наследниках класса TestcontainerDatabase. То же самое касается систем сообщений, которые являются наследниками TestcontainerMessageBroker. Всё это можно найти в документации. Источник: https://www.gamlor.info/posts-output/2022-12-22-test-containers/en/