Фон

Я работаю над бэкэнд-проектом микросервисов, который принял технический стек, такой как MongoDB, Express Framework, RabbitMQ и т. Д. И недавно мне поручили разработать довольно большую функцию, которая включает изменения и логический поток между различными микросервисами. Я нарисовал поток на скриншоте ниже.

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

Дизайн решения

Мне пришло в голову решение модульное тестирование кода в каждом микросервисе.

Модульное тестирование важно, когда вы работаете над проектом микросервисов. Это потому, что вы хотите убедиться, что ваш код работает правильно, прежде чем выполнять интеграционный тест. Интеграционный тест может быть трудным и сложным в зависимости от вашего бизнес-варианта использования.

Впервые я чувствую, что писать модульный тест намного проще. Однако мы сосредоточимся на модульном тестировании MongoDB только в этой статье.

Реализация

Без лишних слов, давайте разберем этап реализации.

  1. Базовая настройка приложения Express
  2. Создайте модель пользователя с помощью Mongoose
  3. Настройка сервера памяти Jest и MongoDB
  4. Модульное тестирование

Базовая настройка приложения Express

Приложение работает на фреймворке Экспресс. Ожидаемый результат этой настройки - у нас будет работающее приложение, подключенное к нашей MongoDB.

Следующие зависимости необходимы для завершения настройки.

  • Дотенв. Это популярная библиотека, используемая для управления нашей переменной окружения. Обычно вы храните здесь строку подключения MongoDB, чтобы можно было легко настроить строку подключения для другой среды.
  • "Мангуста". Библиотека моделирования данных для MongoDB.

Почему Мангуст?

Причина, по которой я использую Mongoose вместо драйвера узла MongoDB, связана с схемой и проверкой. Я бы не стал углубляться в Mongoose. В основном то, что предоставляет Mongoose, позволяет мне намеренно определить поле, которое я хочу, и указать, является ли это поле обязательным или необязательным. Намеренное программирование очень важно, и мы обязаны знать каждую строчку кода, предназначенную для какой цели.

Кажется сложным? Не беспокойтесь о настройке. Я помог вам настроить необходимые зависимости. Вы можете загрузить или клонировать код через Github и легко настроить свой собственный проект модульного тестирования.

Создание модели пользователя с помощью Mongoose

После того, как мы успешно настроили проект. Прежде чем создавать модель, мы должны знать, чего хотим.

Это означает, что мы ожидаем от модели User. Предположим, мы хотели бы знать имя, дату рождения, возраст и логин пользователя, в котором он был использован. Этот процесс известен как определениеschema в Mongoose.

Определить схему проще, чем вы думаете. Вот шаги и код:

  1. Определите UserSchema.
  2. Создайте UserModel с определенной UserSchema.

Теперь у нас есть рабочая схема и модель. Приступим к настройке Jest и модульного тестирования.

Настройка сервера памяти Jest и MongoDB

Пошаговое руководство
Сначала нам нужно установить Jest. Я решил установить его как зависимость для разработчиков, чтобы каждый, кто проверяет этот проект, мог использовать его, не устанавливая глобальную зависимость на своей рабочей станции.

npm install jest --save-dev

Я бы сказал, что Jest идеально сочетается с MongoDB при переходе к модульному тестированию, поскольку Jest поставляется с предустановкой с MongoDB, которая обеспечивает всю конфигурацию, и требуется лишь минимальная настройка. Я объясню больше в ближайшее время. А пока давайте установим предустановку.

npm install @shelf/jest-mongodb --save-dev

Затем создайте jest.config.js в каталоге вашего проекта.

После этого создайте jest-mongodb-config.js в каталоге вашего проекта со следующим содержимым.

Вот и все по настройке. Легко, правда?

Почему пресет Jest используется с MongoDB?
Этот пресет помогает настроить все параметры Сервер памяти MongoDB.

Зачем нам нужен сервер памяти MongoDB?
Это связано с тем, что при запуске модульного теста вы не хотите, чтобы фиктивная дата модульного теста сохранялась в вашей реальной базе данных. Таким образом, сервер памяти MongoDB предоставляет вам возможность хранить ваши данные только в памяти.

С помощью этой предустановки мы можем игнорировать большую часть настройки, которая демотивирует нас и тратит большую часть нашего времени на реальные вещи, которые пишут модульный тест.

Модульное тестирование

Теперь мы знаем, что такое Почему и Как. Давайте проведем модульный тест только что созданной пользовательской модели. Давайте настроим наше соединение мангуста с Mongo Memory Server, и я также перечислил несколько очень простых примеров тестов.

Вот список тестовых примеров, которые мы собираемся протестировать.

  • Вставить пользователя в базу данных успешно. (Тестовый нормальный вариант использования)
  • Вставить пользователя с недопустимым полем. (Тест по схеме)
  • Вставить пользователя без обязательного поля. (Тест на валидацию)

Вы также можете обратиться к сути ниже.

Заключение

На мой взгляд, разработчики всегда мотивированы и заинтересованы в модульном тестировании. Однако имитация зависимостей и конфигурация, требующая усилий и времени, всегда является фактором препятствия и демотивации.

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

Теперь, когда все предустановки и конфигурация готовы для вас с простой настройкой, вы можете написать модульный тест с минимальными усилиями. Поверьте, ваш модульный тест впечатлит ваших товарищей по команде.

Скоростная дорога, чтобы завоевать доверие товарищей по команде вашего программиста: написание тестов.

Наконец, я надеюсь, что эта статья действительно вдохновит вас на написание модульного теста, а также предоставит вам информацию. Написание модульного теста может быть проще, чем вы себе представляли.

использованная литература

Спасибо за прочтение.