Найти в Дзене
Mad Devs

Как настроить автоматизированные интеграционные тесты во Vue приложении

Оглавление
Качество продукта всегда зависит от того, насколько разработчик внимателен. Чем лучше прокачен этот скилл, тем меньше багов и недовольных клиентов.

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

И сегодня я расскажу, как настроить автоматизированные тесты во Vue проекте. Появится возможность тестировать как целые страницы, так и отдельные компоненты, подменять запросы сервера, ну и конечно запускать все это в докере.

Давайте представим, что у нас есть Vue проект, который разрабатывается уже тысячу лет и единственные тесты, которыми там еле пахнет – это юниты. То есть функциональные, которые были настроены из коробки и несознательно.

Первое, что мы сделаем, – откроем документацию фреймворка Cypress . Собственно с помощью него мы и будет писать интеграционные тесты. Он довольно хорошо развит и имеет куче фичей, плагинов и прочих вспомогательных штук.

Обязательно почитайте документацию, чтобы понимать, что это и как работает.

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

Откроем консоль в корне проекта и вставим команду ниже

-2

После того, как пакеты успешно установились, добавим основной файл настроек cypress.json . Его нужно создать также в корне проекта и вставить код ниже

-3

Несколько слов о том, что значат эти параметры

  • baseUrl URL, на котором будет запущен cypress браузер
  • chromeWebSecurity — позволит открывать небезопасные страницы, даст доступ к iframe’ам и т.д.
  • pluginsFile — путь, где хранятся файлы с плагинами для cypress
  • supportFile — путь, где хранятся вспомогательные файлы
  • fixturesFolder — путь, где хранятся мок-файлы, которыми можно подменять данные api
  • integrationFolder — путь, где хранятся файлы c интеграционными тестами
  • testFiles — путь, где хранятся все файлы с тестами
  • componentFolder — путь, где хранятся файлы с тестами для компонентов
  • experimentalComponentTesting — этот флаг обязателен, если хотите тестировать компоненты
  • nodeVersion — указать версию node.js
  • video — вкл\выкл запись видео о том, как проходят тесты
  • viewportWidth — ширина окна браузера
  • viewportHeight — высота окна браузера

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

Во Vue папка для тестов располагается в корне проекта и обычно называется tests. Там сейчас уже должна быть создана папка unit , около которой мы создадим еще одну для наших тестов.
Новую папку назовём
e2e. В неё добавим еще несколько файлов и папок. В итоге должно получиться вот так

-4

Чтобы оградить вас от лишних заморочек, я подготовил репу с уже настроенным проектом. Вы можете скопировать оттуда всё и не париться https://github.com/denisoed/setup-cypress-vue .

Далее в файл package.json, в блок scripts добавим команду для запуска тестов

-5

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

-6

Если всё было выполнено правильно, будет открыт браузер со списком наших тестов. Ура!

Cypress Integration & component tests
Cypress Integration & component tests

И в консоли будет вот такая картина

-8

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

Настройка сервера для подмены API запросов

Суть – подменить реальный api сервер, дать возможность манипулировать данными.

В качестве mock сервера мы будем использовать библиотеку JSON server . Она работает на базе Express.js , поэтому с настройкой или расширением не должно возникнуть проблем.

Установим пакет

-9

И сразу можно добавить команду для запуска в package.json, заодно и обновим команду для запуска тестов. Теперь первым будет стартовать сервер, потом запустится cypress.

-10

Далее добавим в папке tests новую папку для нашего сервера. Назовем её server .
Повторим процесс, который проделывали с файлами и папками для тестов – просто скопируем их из уже готового
проекта.

-11
  • Файл server.js — это основной файл для запуска сервера.
  • Файл config.js — опции для сервера.
  • Папка data — хранит файлы с тестовыми данными, которые будут возвращены json-сервером.

Сейчас вкратце расскажу, как мокать api запросы.
Допустим, ваше приложение запрашивает список пользователей у бэкенда.
К примеру, урл такой
https://backend.com/users

В первую очередь идем в файл server.js и обращаем внимание на блок ниже

-12

В нём видно, что если запросить что-то по урлу /users, он вернет данные из переменной users. Здесь, думаю, понятно. Если ваше приложение делает запросы еще на какие-то урлы, то просто копируем блок выше и меняем как нам нужно.
Данные я тоже заранее подготовил, их можно найти в папке data. Выглядят они вот так

-13

Урл мы поменяли, данные подготовили. Этого достаточно, чтобы мокать api. Таким образом мы можем подменять все запросы, описывая в тестах разные кейсы.

Подведем итог.
Когда ваше приложение будет делать запрос на бэкенд, наш mock сервер перехватит его и вернет нужные нам данные. Вот так просто!

“Но как он будет перехватывать запросы?” – спросите вы. Тут тоже ничего сложного.
Обычно в проектах создают
.env файл, который нужен для хранения переменных. В нем и хранят ссылку на бэкенд api сервер. Если поменять эту ссылку, соответственно ваше приложение будет ориентироваться на неё. Так мы и сделаем.

В корне проекта нужно создать файл .env или заменить в нем переменную, если файл уже существует. С https://backend.com на http://localhost:8888

-14

http://localhost:8888 — это адрес нашего mock сервера. В файле config.js можно поменять порт, если этот уже занят.

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

-15

Если ошибок нет, то увидим такой результат

-16

Mock сервер для тестов успешно подготовлен.

Чтобы закончить эту часть статьи, я хотел бы повторить основную идею:
Когда мы будем тестировать наше приложение, все запросы, которые раньше были направлены на реальный api сервер, будут перехвачены нашим mock сервером. И нам не придется задумываться о том, что бэкенд не работает, или нет интернета, или что-то ещё.
Ваши тесты будут независимы – а это очень важно.

Запуск тестов в Докере

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

Для этого вам потребуется установить всего лишь Docker и Docker compose .

Начнем копировать необходимые файлы. По той же схеме перетащим их из уже готово проекта https://github.com/denisoed/setup-cypress-vue .
Нам нужны три файла
cy-open.yml , docker-compose.e2e.yml , Dockerfile.e2e
Их нужно разместить в корне проекта.

  • Dockerfile.e2e — соберёт всё необходимое для контейнера, в котором будут запускаться тесты.
  • docker-compose.e2e.yml — настройки для контейнера.
  • cy-open.yml — этот файл нужен для запуска браузера из докера.

Обновим файл package.json

-17

При запуске может появиться вот такая ошибка

-18

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

-19

Результат должен быть таким

-20

Дальше всё должно запуститься нормально

-21

Докер начнет устанавливать и распаковывать пакеты, это обычно 2–5 мин. После поднимет контейнер с тестами и контейнер для запуска браузера. Запустит браузер.
Вот и всё, остаётся только писать тесты и радоваться тому, что проект становится немного стабильнее, а сон ваш крепче.

Заключение

Всё, что я написал выше – это всего лишь настройка, подготовка проекта. Дальше вас ожидают многочасовые поиски информации о том, как правильно писать тесты, мокать данные, мокать плагины и т.д. Там столько всего, что чёрт ногу сломит.
Но что остается главным для достижения любой цели? Конечно же это движение. Теперь у вас под рукой есть мануал, который даст вам старт не только для стабилизации проекта, но и для повышения ваших профессиональных скиллов.

Будьте внимательны!

Ранее опубликовано тут.