Легко запускайте локальные базы данных с помощью тестовых контейнеров C# для MongoDB

Легко запускайте локальные базы данных с помощью тестовых контейнеров C# для MongoDB

3 апреля 2024 г.

В этой статье я расскажу вам о тестовых контейнерах C# для MongoDB! Мне нравится использовать Testcontainers для работы с локальной базой данных, когда я не хочу думать об управлении накладными расходами на развертывание и удаление базы данных или об управлении чем-то в облаке. MongoDB здесь не является исключением: работать с пакетом NuGet C# Testcontainers, который у нас есть для MongoDB, просто мечта.

В этой статье я познакомлю вас с основами тестконтейнеров. Далее я продемонстрирую, насколько просто взаимодействовать с вашей вновь созданной базой данных через пакет NuGet C# MongoDB.Driver — почти так, как будто вы даже не подозреваете, что был запущен контейнер! Давайте углубимся в это.


Обзор тестовых контейнеров C#

Testcontainers — это потрясающий пакет NuGet, который может значительно улучшить рабочий процесс тестирования и локальной разработки при создании приложений .NET. Он предоставляет простой и эффективный способ управления контейнерами Docker, позволяя вам разворачивать легкие и изолированные экземпляры и разбирать их, как будто ничего не произошло!

Это означает, что с Testcontainers вам больше не придется беспокоиться о настройке и удалении тестовых баз данных или работе со сложными файлами конфигурации. Он обрабатывает все детали управления контейнерами, поэтому этот процесс кажется тривиальным — я бы точно не хотел делать это вручную.

Вот некоторые из ключевых преимуществ тестконтейнеров:

  • Его способность обеспечивать согласованную и воспроизводимую тестовую среду. Вы можете определить точную версию и конфигурацию службы, которая вам нужна, гарантируя, что результаты вашего тестирования будут надежными и согласованными в различных средах.

* Скорость и гибкость, которые он привносит в рабочий процесс тестирования и разработки. Используя легкие контейнеры Docker, вы можете быстро разворачивать и отключать тестовые среды по требованию. Никакой предварительной настройки облака или общих ресурсов… Просто потрясающая работа на лету.

* Бесшовная интеграция с существующими платформами и инструментами тестирования в экосистеме DotNet, такими как Xunit, NUnit и BenchmarkDotNet. Это позволяет вам легко включать экземпляры контейнерных служб в существующие наборы тестов без каких-либо серьезных изменений.

В этой статье мы сосредоточимся на том, как мы можем использовать тестовые контейнеры C#, в частности, для MongoDB. Большая часть приведенных здесь советов применима и к другим сервисам, особенно к базам данных, но мы остановимся на MongoDB.


Настройка тестовых контейнеров в C

Чтобы начать работу с Testcontainers на C#, вам необходимо установить и настроить необходимые зависимости в вашем проекте. Выполните следующие действия, чтобы настроить тестовые контейнеры для MongoDB на C#.

1. Установка тестовых контейнеров

Как правило, первым шагом будет установка пакета NuGet Testcontainers в ваш проект C#. Вы должны открыть консоль диспетчера пакетов NuGet и выполнить следующую команду:

Install-Package Testcontainers

Однако нам нужна версия этого пакета MongoDB (на момент написания я использую версию 3.8.0), которая включает базовый пакет Testcontainers. Вы можете установить его через пользовательский интерфейс менеджера пакетов или с помощью этой команды:

Install-Package Testcontainers.MonogoDB

2. Настройка тестовых контейнеров для MongoDB

После установки Testcontainers вам необходимо настроить его для MongoDB. Это включает в себя настройку контейнера MongoDB с необходимыми настройками. Вот пример того, как можно настроить тестовые контейнеры для MongoDB на C#:

using Testcontainers.MongoDb;

MongoDbContainer container = new MongoDbBuilder()
    .WithImage("mongo:latest")
    .Build();

В приведенном выше примере мы создаем новый экземпляр MongoDbBuilder и указываем образ MongoDB и привязку порта. Метод WithImage устанавливает изображение для контейнера MongoDB, поэтому использование «mongo:latest» всегда будет извлекать самое последнее изображение.

При желании мы могли бы использовать привязку портов, чтобы явно указать, какие порты мы хотим использовать:

using Testcontainers.MongoDb;

MongoDbContainer container = new MongoDbBuilder()
    .WithImage("mongo:latest")
    .WithPortBinding(1337, 27017)
    .Build();

В приведенном выше коде используется метод WithPortBinding, который привязывает порт 27017 контейнера к порту 1337 хост-машины. В следующих разделах мы увидим, что, если у вас нет особой необходимости привязывать порты, вы можете просто оставить это быть. Мы можем получить динамическую строку подключения, что очень удобно!

3. Запуск и остановка контейнера MongoDB

После настройки тестовых контейнеров для MongoDB вы можете запускать и останавливать контейнер по мере необходимости. Вот примеры кода для запуска и остановки контейнера:

Чтобы запустить контейнер MongoDB:

await container.StartAsync();

Чтобы остановить контейнер MongoDB:

await _container.StopAsync();

Помните, что тип MongoDbContainer можно удалить, поэтому вызовите DisposeAsync, чтобы очистить его, когда будете готовы.


Практическое использование тестовых контейнеров C# для MongoDB

Теперь, когда мы узнали, как раскручивать и разбирать контейнеры, что нам с ними делать? У нас есть множество вариантов, и действительно, пределом является ваше собственное воображение (а также время, деньги и другие ресурсы…)!

Большинство людей используют тест-контейнеры C# для написания интеграционных или функциональных тестов. Например, вы можете сопоставить Testcontainers с xUnit или NUnit и написать тесты, которые взаимодействуют с реальной базой данных.

Мне нужно было подключить тестовые контейнеры C# для MongoDB к BenchmarkDotNet, чтобы я мог тестирование вставки записей в MongoDB! Аналогичный вариант использования, когда мне нужны были временные локальные базы данных, но не обязательно для тестовой среды.

В любом случае нам нужна возможность подключаться к этим контейнерам базы данных MongoDB из C#, и это будет рассмотрено в следующих подразделах.

Подключение к тестовым контейнерам C# для MongoDB с помощью MongoDB.Driver

Предположим, что вы прочитали предыдущие разделы и у вас установлен правильный пакет MongoDB для тест-контейнеров. Если вы пробежали этот раздел, вернитесь, прочтите его и получите нужный пакет. В противном случае вы будете ломать голову над тем, почему вы не можете найти нужные зависимости!

Вам также потребуется установить пакет NuGet MongoDB.Driver. Это то, что мы собираемся использовать для установления соединения с контейнером базы данных, который мы создали. У меня есть другие статьи, которые вы можете прочитать, если хотите получить дополнительные объяснения о том, как работает MongoDB.Driver в целом:

Имея подходящие пакеты, готовые к работе, мы можем объединить код, который мы видели ранее, с кодом драйвера MongoDB, чтобы объединить все воедино:

using MongoDB.Bson;
using MongoDB.Driver;

using Testcontainers.MongoDb;

MongoDbContainer container = new MongoDbBuilder()
    .WithImage("mongo:latest")
    .Build();
await container.StartAsync();
string connectionString = container.GetConnectionString();

MongoClient mongoClient = new MongoClient(connectionString);
IMongoDatabase database = mongoClient.GetDatabase("test");
IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("test");

В приведенном выше примере мы можем вызвать GetConnectionString() для только что созданного контейнера MongoDB из Testcontainers. Самое замечательное в этом то, что независимо от того, как вы настраиваете свой Testcontainer для MongoDB, используя шаблон компоновщика, который мы видим в этом коде и ранее в статье, GetConnectionString() предоставит вам то, что вам нужно для подключения.

Поскольку MongoClient принимает строку подключения в качестве единственного аргумента, получить доступ к базе данных MongoDB и сразу же начать с ней работать!

Выполнение операций CRUD в тестовом контейнере MongoDB

Теперь, когда у нас настроен тестовый контейнер MongoDB и подключен к нему MongoClient, мы можем начать выполнять над ним операции CRUD. Детали соединения, предоставленные экземпляром контейнера, позволили легко объединить эти две вещи, и действительно, мы можем сосредоточиться только на вызовах метода MongoDB.Driver для CRUD.

Вот пример выполнения простой операции CRUD:

// using code from earlier examples...

// Create
await collection.InsertOneAsync(new BsonDocument()
{
    ["Name"] = "Nick Cosentino",
});

// Read
var filterBuilder = Builders<BsonDocument>.Filter;
var filter = filterBuilder.Eq("Name", "Nick Cosentino");
var results = collection.Find(filter);

// Update
var updateBuilder = Builders<BsonDocument>.Update;
var update = updateBuilder.Set("Name", "Dev Leader");
collection.UpdateOne(filter, update);

// Delete
filter = filterBuilder.Eq("Name", "Dev Leader");
collection.DeleteOne(filter);

Используя предыдущие фрагменты кода, мы уже работали с нашим экземпляром контейнера MongoDB и MongoClient. В результате в приведенном выше фрагменте кода вы можете видеть, что мы можем напрямую работать с нашей IMongoCollection<BsonDocument>, которую мы получили в результате предыдущей настройки.

Это помогает проиллюстрировать, что, как только у вас есть Docker-контейнер MongoDB, запущенный через Testcontainers, вам не нужно обращаться с чем-то особым образом после подключения к нему!


Завершение создания тестовых контейнеров C# для MongoDB

В заключение отметим, что C# Testcontainers для MongoDB — это невероятно простой способ запустить временное хранилище данных MongoDB для тестирования и разработки. Хотя эта статья не фокусировалась на конкретных случаях использования, мы надеемся, что вы лучше понимаете, насколько прозрачным является наложение драйвера MongoDB поверх тестовых контейнеров для взаимодействия с MongoDB.

Учитывая, что C# Testcontainers избавляет вас от головной боли, связанной с настройкой, демонтажем и даже управлением строкой подключения, я легко рекомендую вам, если вы хотите начать работу с MongoDB для локального использования.

Если эта статья оказалась для вас полезной и вы ищете дополнительные возможности для обучения, рассмотрите возможность подписаться на мой бесплатный еженедельный информационный бюллетень по разработке программного обеспечения и просмотреть мой < a href="https://www.youtube.com/@devleader?sub_confirmation=1">бесплатные видео на YouTube!


Также опубликовано здесь


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE