В этой статье я расскажу вам о тестовых контейнерах C# для MongoDB! Мне нравится использовать Testcontainers для работы с локальной базой данных, когда я не хочу думать об управлении накладными расходами на развертывание и удаление базы данных или об управлении чем-то в облаке. MongoDB здесь не является исключением, поскольку пакет C# Testcontainers NuGet, который у нас есть для MongoDB, — это просто мечта работать.
В этой статье я познакомлю вас с основами тестконтейнеров. Далее я продемонстрирую, насколько просто можно взаимодействовать с вашей вновь созданной базой данных через пакет NuGet C# MongoDB.Driver — почти так, как будто вы даже не подозреваете, что был развернут контейнер! Давайте углубимся в это.
Testcontainers — это потрясающий пакет NuGet, который может значительно улучшить рабочий процесс тестирования и локальной разработки при создании приложений .NET. Он предоставляет простой и эффективный способ управления контейнерами Docker, позволяя вам разворачивать легкие и изолированные экземпляры и разбирать их, как будто ничего не произошло!
Это означает, что с Testcontainers вам больше не придется беспокоиться о настройке и удалении тестовых баз данных или работе со сложными файлами конфигурации. Он обрабатывает все детали управления контейнерами, что делает этот процесс тривиальным — я бы точно не хотел делать это вручную.
Некоторые из ключевых преимуществ Testcontainers включают в себя:
В этой статье мы сосредоточимся на том, как мы можем использовать тестовые контейнеры C#, в частности, для MongoDB. Большая часть советов, изложенных здесь, будет применима и к другим сервисам, особенно к базам данных, но мы остановимся на MongoDB.
Чтобы начать работу с Testcontainers на C#, вам необходимо установить и настроить необходимые зависимости в вашем проекте. Выполните следующие действия, чтобы настроить тестовые контейнеры для MongoDB на C#.
Как правило, первым шагом будет установка пакета NuGet Testcontainers в ваш проект C#. Вы должны открыть консоль диспетчера пакетов NuGet и выполнить следующую команду:
Install-Package Testcontainers
Однако нам нужна версия этого пакета MongoDB (на момент написания я использую версию 3.8.0), которая включает базовый пакет Testcontainers. Вы можете установить его через пользовательский интерфейс менеджера пакетов или с помощью этой команды:
Install-Package Testcontainers.MonogoDB
После установки Testcontainers вам необходимо настроить его для MongoDB. Это включает в себя настройку контейнера MongoDB с необходимыми настройками. Вот пример того, как вы можете настроить Testcontainers для 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. В следующих разделах мы увидим, что, если у вас нет особой необходимости привязывать порты, вы можете просто оставить это как есть. Мы можем получить динамическую строку подключения, что очень удобно!
После настройки тестовых контейнеров для MongoDB вы можете запускать и останавливать контейнер по мере необходимости. Вот примеры кода для запуска и остановки контейнера:
Чтобы запустить контейнер MongoDB:
await container.StartAsync();
Чтобы остановить контейнер MongoDB:
await _container.StopAsync();
Помните, что тип MongoDbContainer можно удалить, поэтому вызовите DisposeAsync
для очистки, когда будете готовы.
Теперь, когда мы узнали, как раскручивать и сносить контейнеры, что нам с ними делать? У нас есть много вариантов, и действительно, пределом является ваше собственное воображение (а также время, деньги и другие ресурсы…)!
Большинство людей используют тест-контейнеры C# для написания интеграционных или функциональных тестов . Например, вы можете сопоставить Testcontainers с xUnit или NUnit и написать тесты, которые взаимодействуют с реальной базой данных.
Мне нужно было подключить тестовые контейнеры C# для MongoDB к BenchmarkDotNet, чтобы я мог протестировать вставку записей в MongoDB ! Аналогичный вариант использования, когда мне нужны были временные локальные базы данных, но не обязательно для тестовой среды.
В любом случае нам нужна возможность подключаться к этим контейнерам базы данных MongoDB из C#, и это будет рассмотрено в следующих подразделах.
Предположим, вы прочитали предыдущие разделы и у вас установлен правильный пакет 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 и сразу начать с ней работать очень просто!
Теперь, когда у нас настроен тестовый контейнер 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# Testcontainers для MongoDB — это невероятно простой способ запустить временное хранилище данных MongoDB для тестирования и разработки. Хотя эта статья не фокусировалась на конкретных вариантах использования, мы надеемся, что вы лучше понимаете, насколько прозрачным является наложение драйвера MongoDB поверх тестовых контейнеров для взаимодействия с MongoDB.
Учитывая, что C# Testcontainers избавляет вас от головной боли, связанной с настройкой, демонтажем и даже управлением строками подключения, я легко рекомендую вам, если вы хотите начать работу с MongoDB для локального использования.
Если вы нашли это полезным и ищете дополнительные возможности для обучения, рассмотрите возможность подписки на мой бесплатный еженедельный информационный бюллетень по разработке программного обеспечения и посмотрите мои бесплатные видео на YouTube !
Также опубликовано здесь