«Никогда Не Писал Автотесты? Попробуйте Кипарис»



Автотесты на Cypress Первое впечатление и возникшие проблемы Дмитрий Кочергин, ведущий разработчик программного обеспечения Luxoft Прежде всего хочу отметить, что я не профессиональный автотестер, а Java-программист. Но однажды я получил задание сделать дым-тесты для базовой проверки основных функций приложения, которое недавно было без предупреждения сломано изменением API зависимого сервиса.

Статья будет интересна всем, кто интересовался автотестированием с нуля на JS, но боялся спросить.

Начну с того, что я никогда ничего не читал об автотестировании.

Основное предубеждение было, что автотесты — это сложно, потому что по отзывам всё равно придётся этот Selenium настраивать.

Плюс нужно учить XPath и PageObject, чего совсем не хотелось делать.

Быстрый поиск в Интернете дал более молодые и перспективные инструменты: ВебДрайвер.

IO , Кукловод (а теперь Драматург лучше) и Кипарис.

Я выбрал последнее, купившись на красивые обещания и несколько комментариев с холиваров о лучших инструментах для автотестов.

Вот как выглядит окно браузера запущенного теста.

Слева — выполненные тестовые команды и статус, справа — вид приложения во время выполнения теста:

«Никогда не писал автотесты? Попробуйте Кипарис»

Вот как выглядит тестовый код (в Cypress весь код на JS, а селекторы — обычные CSS-селекторы):

«Никогда не писал автотесты? Попробуйте Кипарис»

Во время выполнения это выглядит так:

«Никогда не писал автотесты? Попробуйте Кипарис»

Пока я искал инструмент для автотестов — в голове у меня была картинка, что тесты можно создавать прямо в браузере, чтобы я мог просто «нажимать на запись скрипта» — система записывала мои действия (CSS-селекторы элементов, которые Я нажал).

Затем я смотрю на сгенерированный тест, при необходимости корректирую селекторы и сохраняю его в Test Suite. ЭИКС… Сказка тогда оказалась недосягаемой и таких инструментов я не нашел (может кто в комментариях подскажет правильный путь).

Но что подкупило в Cypress, так это то, что тесты выполняются в реальном браузере, и вы даже можете исследовать DOM параллельно с выполнением теста, используя ваши любимые инструменты разработчика Chrome (если, например, селектор не сработал, вы можете откройте консоль и сразу увидите причину при выполнении теста).



«Никогда не писал автотесты? Попробуйте Кипарис»

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

Для моих целей этого было вполне достаточно.

Для информации o Cypress: с момента первого открытия сайта Cypress до первого теста, зашедшего в приложение - прошел 1 час.

Итак, Cypress, первая страница фреймворка сообщает нам, что это фреймворк сквозного тестирования JavaScript ( кипарис.

io ).

Далее быстро читаем документацию, она действительно полная, и практически на все вопросы можно найти ответы (все остальное я быстро нашел на StackOverflow):

«Никогда не писал автотесты? Попробуйте Кипарис»

Далее по списку возможностей с сайта:

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

    И это не просто записанное изображение, а настоящий DOM, вы можете откатиться и изучить страницу через инструменты разработчика Chrome.

  • Перезагрузки в реальном времени — как и во всей современной JS-теме, были изменены исходники — в тот же момент тест перезапускался в браузере (горячая перезагрузка).

  • Автоматическое ожидание — многие тестовые инструкции асинхронны, например переход на страницу, а сам Cypress автоматически ждет завершения загрузки.

    За исключением, конечно, случаев, когда приложение обращается к серверу.

  • Управление сетевым трафиком.

    Cypress может перехватывать/просматривать вызовы сервера и может быть проинструктирован ждать ответа от сервера.

  • Снимки экрана и видео.

    Во время выполнения теста Cypress записывает видео экрана браузера (MP4) вместе с инструкциями в окне.

Все это добро, конечно, можно запустить и без открытого браузера на CI; используется безголовый Chrome или Electron. Но были и некоторые проблемы.

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

Исправленный.



«Никогда не писал автотесты? Попробуйте Кипарис»

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

Оказалось, что в моей IDE (IntelliJ IDEA) есть такие нехорошие галочки, которые к тому же включены по умолчанию, из-за чего получается, что сохранение файла - это не сохранение, а эвентуальное сохранение.



«Никогда не писал автотесты? Попробуйте Кипарис»

Следующая проблема заключалась в том, что мое приложение использовало выборку окна для запросов к серверу, а Cypress видит только запросы XHR. Помог грязный хак из StackOverflow (я так понимаю, метод fetch удален из окна, чтобы браузер вместо fetch делал возврат к XHR):

«Никогда не писал автотесты? Попробуйте Кипарис»

Далее возникла проблема эмуляции мобильного браузера; переписать пользовательский агент в тестовом коде было просто невозможно, но в отдельном специальном файле всё работало.



«Никогда не писал автотесты? Попробуйте Кипарис»

Далее идет решение проблемы CORS:

«Никогда не писал автотесты? Попробуйте Кипарис»

Потом закачка файлов, сходу не получилось, стандартные решения не сработали, но помогла библиотека cypress-file-upload:

«Никогда не писал автотесты? Попробуйте Кипарис»

Единственная проблема, которую я не смог решить, — это воспроизводимость теста.

А именно стабильные и идентичные исходные данные для запуска теста (фикстуры), это уже более конфигурационная задача, не Cypress, но пока нерешенная.

В результате Cypress выглядит отличным инструментом для внедрения в проект автоматизированного тестирования, если:

  1. Иметь знание JS
  2. Нет необходимости тестировать во всех браузерах, начиная с IE6 (сейчас Cypress поддерживает Chrome, Chromium, Edge, Electron, Firefox).

    Здесь обсуждение темы .

    Но могу сказать, что год назад, когда я начал работать с Cypress, он поддерживал только последние версии Chrome и Electron для запусков без UI.

  3. Хотите быстро сделать тесты и забыть о них, пока кто-нибудь не сломает приложение :)
Кипарис: возьми и используй! Теги: #JavaScript #автотест #кипарис
Вместе с данным постом часто просматривают: