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

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

Как мы решаем эту проблему? Cypress.io — фреймворк сквозного тестирования — это новый стандарт в интерфейсном тестировании, который нужен каждому разработчику и QA-инженеру. Возможно, вы слышали о других решениях для сквозного тестирования, особенно о Selenium, который является одним из самых популярных фреймворков в последние годы. Тем не менее, разработчики часто уклонялись от написания тестов с использованием Selenium из-за сложности его настройки, не говоря уже о написании тестов. Одна из основных целей Cypress — обеспечить простоту настройки, написания, запуска и отладки тестов.

Итак, давайте начнем и напишем наш первый тест с использованием Cypress!

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

Приложение, которое мы будем тестировать, представляет собой простое приложение прогноза погоды, которое получает информацию о погоде для определенного города. Для простоты я создал mock API с использованием json-сервера с фиксированной базой данных из трех городов. Данные о погоде получены из OpenWeatherAPI. Все приложение написано на React.

Настройка приложения

Примечание. Чтобы следовать этому руководству, вам необходимо установить Node.js. Скачать последнюю стабильную версию можно здесь.

# Clone the github repo to your local machine 
git clone https://github.com/DennisDurairaj/react-weather-cypress.git 
# Switch to the app directory 
cd react-weather-cypress 
# Install npm dependencies 
npm install

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

Краткое объяснение файлов, которые имеют отношение к нам -

  • index.js — это точка входа нашего приложения React.
  • App.js — компонент-контейнер для нашего приложения. Это компонент, отображаемый файлом index.js.
  • db.json — используется json-server для имитации внутреннего сервера API, который содержит информацию о погоде для трех городов.
  • api.js — файл, в котором находятся вызовы нашего API.
  • package.json — содержит список зависимостей нашего приложения и различные сценарии, которые можно запустить для нашего приложения.

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

Если вы посмотрите на конфигурацию скриптов в файле package.json, то увидите, что эта команда запускает две другие команды — npm run mockAPI и react-scripts start. npm run mockAPI, как следует из названия, запускает наш фиктивный внутренний сервер API на порту 3050. react-scripts start запускает наше приложение прогноза погоды на порту 3000.

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

Очень минималистичный. Для простоты приложение поддерживает получение информации только для трех предопределенных городов внутри нашего файла db.json. Лондон, Париж и Амстердам.

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

Итак, мы настроили и запустили наше приложение, теперь как его протестировать? Давайте начнем с настройки Cypress, чтобы мы могли начать писать наши тесты автоматизации.

Системные Требования

Cypress — это настольное приложение, которое устанавливается на ваш компьютер. Настольное приложение поддерживает следующие операционные системы:

  • macOS 10.9 и выше (только 64-разрядная версия)
  • Linux Ubuntu 12.04 и выше, Fedora 21 и Debian 8 (только 64-разрядная версия)
  • Windows 7 и выше

Давайте установим cypress для нашего приложения в качестве dev-зависимости -

npm install cypress --save-dev

Вот и все, Cypress теперь установлен и готов к использованию! Легкий.

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

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

Как правило, большинство интерфейсных тестов можно разбить на следующие этапы:

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

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

  • Пользователь вводит название города во входные данные, и если город присутствует в базе данных, он возвращает погоду для этого города.
  • Пользователь вводит название города, которого нет в базе данных, в результате чего на экране отображается сообщение «Город не найден в базе данных».

Теперь, когда у нас есть сценарии, давайте напишем наш первый тест!

Создайте папку, в которой будут находиться все наши тесты Cypress -

mkdir cypress && cd cypress mkdir integration && cd integration

Наши тесты Cypress будут жить в папке /integration.

Для запуска Cypress требуется файл конфигурации cypress.json в корне каталога приложения, так что давайте добавим его. На данный момент наш файл cypress.json возвращает пустой объект с настройками по умолчанию.

Тестовый сценарий 1

Когда пользователь заходит в приложение и вводит в поле поиска допустимое название города, он должен увидеть информацию о погоде для этого города.

Внутри папки /integration давайте создадим новый файл с именем weather_search.spec.js.

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

  • Строка 3: посетите URL-адрес приложения.
  • Строка 4: Запросить элемент на странице, взаимодействовать с ним (вводить)
  • Строка 5: Запросите элемент на странице, взаимодействуйте с ним (щелкайте)
  • Строка 6: проверьте, соответствует ли новое состояние приложения ожидаемому.

Вы могли заметить, что мы говорим Cypress получить элемент с атрибутом [data-cy='attributeName']. Если вы посмотрите на наш файл App.js, вы увидите, что наши элементы селектора имеют атрибуты data-cy. Считается лучшей практикой использовать атрибуты data-*, чтобы предоставить контекст нашим селекторам и изолировать их от изменений CSS или JS. Вы можете прочитать больше об этом здесь".

В наш файл package.json добавим два скрипта для запуска наших тестов.

  • e2e-test - запускает наши тесты в безголовом режиме
  • cypress:open - запускает наши тесты внутри браузера

Запустим тест. В терминале запустите npm run e2e-test. Cypress просматривает папку /integration и запускает все тесты внутри папки. Пока у нас есть один файл weather_search.spec.js

Как видите, Cypress провел наш тест, и он прошел успешно.

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

Если вы запустите скрипт npm run cypress:open, откроется пользовательский интерфейс Cypress —

Нажмите «Выполнить все спецификации» или название конкретной спецификации, чтобы открыть тестовый браузер, в нашем случае у нас есть один тест с именем weather_search.spec.js.

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

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

Тестовый сценарий 2

Когда пользователь заходит в приложение и вводит в поле поиска недопустимое название города, пользователь должен увидеть сообщение "Город отсутствует в базе данных"

Давайте создадим еще один тестовый файл внутри нашей папки cypress/integration, назовем его weather_search_invalid.spec.js

Как только мы его сохраним, новый тест автоматически появится в нашем наборе тестов пользовательского интерфейса Cypress.

И когда вы запустите тест, вы должны увидеть, что он проходит -

И вот как легко начать писать тесты для ваших интерфейсных приложений!

Вывод

Вы видели, как Cypress упрощает процесс написания тестов для наших приложений, упрощая их реализацию как для разработчиков, так и для QA-инженеров. Мы едва изучили мощь Cypress и некоторые из предоставляемых им функций.

Например, Cypress делает снимки и видео процесса тестирования, создает заглушки для имитации ответов API, хуки для запуска до и после наших тестов для очистки состояния нашего приложения и т. д.

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

Первоначально опубликовано на https://programmerden.com 13 февраля 2020 г.