Привет. Сегодня я расскажу о Prisma с интеграционным тестированием. Этот технологический стек становится популярным в наши дни, так почему бы не углубиться в него?

Что, черт возьми, такое интеграционное тестирование?

Интеграционное тестирование — это своего рода рабочий код, который будет тестировать несколько частей одновременно. В отличие от модульных тестов, они более полезны при тестировании больших фрагментов кода, таких как подключение к БД или обращение к ней.

Введение

Есть довольно много вещей, которые мы будем исследовать сегодня. Вот список всех предметов, которые мы будем рассматривать:

  • Машинопись
  • Prisma (Вы можете выбрать любой ORM по вашему выбору)
  • PostgreSQL
  • Шутка
  • Действия на GitHub

Большинство из них вы уже знаете, но для новых людей, которые не знают Prisma. Это поставщик ORM следующего поколения для языка JavaScript и TypeScript. Я настоятельно рекомендую вам посетить официальную веб-страницу здесь, чтобы узнать больше.

Начать

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

Чтобы запустить вышеупомянутый репозиторий, вам нужно сделать несколько шагов

  • Создайте файл .env и поместите переменную DATABASE_URL в базу данных Postgres.
  • do yarn
  • Обновите свои миграции с помощью команды миграции npm prisma migrate dev, она запустит все миграции, в настоящее время существует только одна миграция.
  • Вы можете запустить файл командой yarn run dev

Обзор

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

Установить Jest

Давайте установим jest и его зависимости. Поскольку мы используем ts, нам также нужно убедиться в этом. выполните следующую команду

yarn add --dev jest jest-mock-extended ts-jest cross-env @types/jest

Это добавит все зависимости в проект для этого, а также добавит новый скрипт в файл package.json как

"test:integration": "cross-env NODE_ENV=test jest --testPathPattern=integration"

Я не буду использовать папку tests по умолчанию, но помещу все интеграционные тестовые случаи в папку /integration, я бы предпочел, чтобы модульные тестовые случаи находились в папке по умолчанию.

Теперь давайте создадим тестовую папку с именем integration и создадим файл с именем script.test.ts.

Давайте сначала напишем несколько тестовых примеров,

Выход:

Тестовый пример интеграции

Давайте напишем реальную вещь и проведем интеграционное тестирование. Наш сценарий будет

  • Фактический метод заключается в создании 2 пользователей и 4 сообщений. Итак, после запуска методов мы увидим, действительны ли эти числа или нет, запросив базу данных.

Для этого нам сначала нужно создать файл jest.config.jsand setup.js в вашем корневом проекте.

jest.config.js

const path = require('path')
 module.exports = {
 preset: 'ts-jest',
 testEnvironment: 'node',
 setupFiles: [path.resolve(__dirname) + '/setup.js'],
}

setup.js

process.env.DATABASE_URL = "postgresql://<your-user>:<your-password>@localhost:5432/test";

script.ts

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

Давайте сначала разберемся с процессом,

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

Перенесите изменения

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

yarn prisma db push

Мы будем использовать ту же команду в нашем файле рабочего процесса.

Экспорт клиента

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

// before
const prisma = new PrismaClient()
// after
export const prisma = new PrismaClient()
// at last line
export default main

Теперь мы можем получить доступ к тому же клиенту для тестирования файлов.

Обновите тестовый пример, чтобы включить beforeEach и afterAll

Теперь нам нужно обновить beforeEach и afterAll, чтобы использовать и очистить таблицы, например

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

Обновленный тестовый пример будет выглядеть так:

Здесь мы проверяем, совпадает ли количество сообщений и пользователей с тем, что мы только что создали в базе данных.

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

Автоматизируйте интеграционное тестирование

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

.github/workflows/ci.yml

Будет несколько шагов

  • Создайте триггеры
  • Подключиться к контейнеру PostgreSQL
  • экспортировать переменные
  • Запустите тестовые случаи

Для шага I мы обновим .yml до следующего

name: run integration testing
on:
 push:
  branches: [main]
 pull_request:
  branches: [main, dev]

Вы можете иметь свои триггеры для рабочего процесса.

Теперь давайте создадим задания и контейнеры, вот вывод и как он будет выглядеть,

Здесь мы подключаемся к контейнеру PostgreSQL с образом alpine docker, подробнее читайте здесь

Убедитесь, что все переменные Postgres такие же, как setup.js, иначе дела пойдут плохо. Несколько ключевых моментов

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

Теперь напишите команды для запуска

Обратите внимание, как мы передаем DATABASE_URL команде, он должен совпадать с файлом setup.js, чтобы элементы работали без проблем.

Теперь, если вы видите вкладку действий из репо, вы должны увидеть вывод следующим образом.

Заключение

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

Надеюсь, вам понравилась статья и вы узнали что-то новое. Весь исходный код доступен на GitHub с ответвлением, и я не рассматриваю возможность подписаться на мой подстек, чтобы получать больше контента здесь.

Дополнительные материалы на plainenglish.io