Рубрики
Без рубрики

Как добавить конец для окончания тестов к вашему проекту с Cypress

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

Автор оригинала: Austin Tackaberry.

В этом посте я прогул к процессу добавления конечных тестов Cypress к существующему проекту.

Зачем конец тестированию?

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

Если вы хотите, чтобы пользователь проверить Tweeting в Twitter, вы можете сказать им что-то вроде:

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

Вместо этого вы могли бы иметь его искать элементы по именам или идентификаторам классов, но что, если имена класс или идентификаторы специально изменится? Или что, если текст меняется случайно? Если вы сказали Test Runner, чтобы нажать кнопку по имени класса, тест может неправильно пройти. Вы можете поспорить:

Это, возможно, является действительным аргументом, но вы также можете утверждать, что вы действительно хотите, чтобы тест не удался, если текстовые изменения. В конечном итоге, вы должны спросить себя: «Если этот текст изменился, я хочу, чтобы мои тесты сломались?» В случае «отправки» против «Tweet», возможно, вы не хотите, чтобы тест сломался, но, возможно, если текст был случайно удален или с ошибками, то вы хотите, чтобы они сломались. Вы не можете быть на самом деле, так что вам нужно сделать лучшее решение для вас и вашего приложения.

Некоторые недостатки, чтобы закончить конец тестированию:

  • Они «дорого», Это займет много времени, чтобы бежать. Каждый тест требует, чтобы полный браузер был создан экземпляром фактическими событиями браузера, что требует больше времени, чем тесты на единицу или интеграции.
  • Он делает хорошую работу по поиску проблем, но это не делает хорошую работу, помогая вам решить эти проблемы. Ваш конец к концу испытания может обнаружить, что платежная система сломана, но она не скажет вам, что из ваших 10 микросервисов вызвало проблему.

Которые заканчиваются конечной структурой тестирования для выбора

Там есть куча конца для окончания тестирования каркасов, и его можно сложно выбрать «правый» один. Я очень кратко поделюсь своими мыслями, хотя я по общему признанию, использовал только кипарис:

Тестовое кафе -Это – последний конец для окончания структуры тестирования, и, похоже, очень хорошо. Он интегрирует с стеком браузера, имеет хорошую поддержку браузера, поддерживает все фрагменты в интерфейсах, поддерживает синтаксис ES2015 + и Systems. Похоже, вы должны иметь платная версия для записанных тестов.

Кукла – Это решение Google с открытым исходным кодом. Кажется легким и легко добраться. Это открытый источник и работает на хроме (без головы или нет). Кукольщик выделяется как тестовая каркас, которая имеет богатую функциональность, лучше, чем не иметь окончания конечных испытаний, но не полное решение. Они также совсем недавно поделились, что они Экспериментируя с Firefox Отказ

Кипарис – Это разработчик, дружественная структура тестирования источника. Cypress Records Snaphots и видео ваших тестов, имеет тестовую проходную консоль и бесплатна. Для разработчиков и QA легко начать разработчики и инженерам QA. Он только в настоящее время поддерживает варианты Chrome, но это Поддержка перекрестных браузеров на дорожной карте Отказ У него нет родных Поддержка IFrame Хотя есть обходные пути. Cypress имеет собственную систему на основе обещания, которую вы должны использовать (не может использовать обещания ES6).

Вот хороший ресурс для глубокого сравнения кипариса и тестирования кафе: https://medium.com/yld-engineering-blog/evaluating-cypress-and-testcafe-for-end-to-end-testing-fcd0303d2103

Начиная

Проект, который я собираюсь использовать, это https://ydkjs-exercies.com. . Это одностраничное веб-приложение, которое предоставляет упражнения, созданные, чтобы помочь пользователям тестировать свои знания, когда они читают Вы не знаете JavaScript . Он использует React, React Router и API API-контекста RACT. Существуют тесты подразделения/интеграции с использованием Jest и React-Testing-библиотеки. И теперь я добавлю конец, чтобы закончить тестирование с кипарисом!

Я буду следить за прогрессом через теги, начиная с Cypress-0 и увеличивая целое число на каждом шаге. Вот начальная точка Отказ

Первый шаг – установить кипарис как DevDependency :

npm install cypress --save-dev

Текущая версия кипариса V3.1.1. Документы упомянут, что пакет NPM Cypress – это обертка вокруг кипариса двоичной. А что на версии 3.0 двоичный файл загружается в глобальный каталог кэша, который будет использоваться между проектами.

Теперь давайте откроем кипарис. Если вы используете версию NPM> 5.2, вы можете открыть его, используя:

npx cypress open

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

После нажатия, чтобы закрыть модаль, мы видим, что есть куча примеров тестов, и мы видим, что мы можем запустить их в Chrome 70. Если вы нажмете на «Runs», вы видите, что вы можете настроить приборную панель кипариса, чтобы посмотреть на предыдущие прогоны. Мы не собираемся беспокоиться об этом, но вы, безусловно, можете проверить эту функцию.

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

Вот текущий прогресс до этого момента.

Написание сценария кипариса

Мы почти готовы написать наш первый тест. Нам нужно создать каталог для хранения наших тестов Cypress: кипарис/интеграция/YDKJS

Теперь нам нужно написать скрипт, который начнет наш SEV Server, запустите наши кипарисы, затем остановите наш сервер Dev. Этот проект был загрузкой с созданием приложения RACT, что означает, что у него есть Screpts/start.js Файл, который используется для запуска сервера. Я собираюсь скопировать код оттуда, вставьте его в новый Сценарии/Cypress.js Файл и сделайте некоторые модификации.

Фрагмент кода ниже – мясо нашего нового Сценарии/Cypress.js файл.

return devServer.listen(port, HOST, err => {
    if (err) {
        return console.log(err);
    }
    if (isInteractive) {
        clearConsole();
    }
    console.log(chalk.cyan('Starting the development server...\n'));
    return cypress
        .run({
            spec: './cypress/integration/ydkjs/*.js',
        })
        .then(results => {
            devServer.close();
        });
});

Это делает только то, что мы сказали, это сделает. Он запускает SEV Server, запускает все тестовые файлы в кипарис/интеграция/YDKJS , а затем останавливает сервер Dev.

Сейчас в Cypress.json Мы можем добавить наши BaseUrl :

{
    "baseUrl": "http://localhost:3000"
}

Теперь мы можем написать наш первый тест! Давайте назовем это Cypress/Integration/YDKJS/Sidebar.js С И мы будем использовать его для проверки функциональности боковой панели. На данный момент давайте просто напишем манекетный тест:

/* globals context cy */
/// 
context('Sidebar', () => {
    beforeEach(() => {
        cy.visit('/');
    });
    
    it('does something', () => {
        cy.contains('YDKJS Exercises');
    });
});

Все, что мы делаем здесь, посещает базовый URL и поиск элемента, содержащего «упражнения YDKJS». Обратите внимание, что я добавил только комментарий на первую строку, чтобы Eslint Не жалуется на неопределенные переменные кипариса.

Я также добавил новый сценарий в моем Package.json :

"scripts": {
    ...
    "cypress": "node scripts/cypress.js",
    ...
},

Так что теперь я могу позвонить NPM запускает кипарис Когда я хочу запустить свой конец, чтобы закончить кипарисы. Теперь, когда я выполняю эту команду в терминале, я вижу, что мой сервер запускается, тестовые прогоны и пропускают, а затем сервер останавливается. Woohoo!

Вот код до этого момента.

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

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

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

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

beforeEach(() => {
    cy.visit('/');
    cy.contains('Progress').should('exist');
});

Теперь давайте начнем написать тест. Поскольку X на самом деле SVG, мы не можем легко сказать кипарис, чтобы найти его. Итак, мы найдем его, используя data-testid атрибут или cy.get ("[data-testid = cablesidebar]"). Нажмите () Отказ Я знаю, что вы думаете…

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

Что касается в том, что основной проблемой есть то, что вы можете иметь только одну на страницу, которая может быть раздражена. Что, если вы хотите получить все кнопки x на странице и утверждать, что их должно быть 2? Вы не можете сделать это легко, используя идентификаторы.

Наш тест завершен может выглядеть следующим образом:

it('closes when X is clicked and reopens when hamburger is clicked', () => {
    cy.get('[data-testid=closeSidebar]').click();
    cy.contains('Progress').should('not.exist');
    cy.get('[data-testid=openSidebar]').click();
    cy.contains('Progress').should('exist');
});

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

И вы можете увидеть видео теста в Cypress/ydkjs/sidebar.js.mp4 Действительно Довольно аккуратно Это очень полезно, когда ваши тесты не могут, и вы не знаете, почему.

Одна вещь, о которой вы должны быть осторожны, это то, что кипарис – это система, основанная на обещании. Когда вы выполняете CY.Подсмысленные («прогресс»). Должен («Not.exist») , Cypress не перейдем к следующей строке кода до этой строки. Если он видит элемент DOM, который содержит «прогресс», он будет подождать, пока он не исчезнет или до тех пор, пока он не проходит время, а тест не удается.

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

Давайте напишем еще один тест.

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

it('navigates to /up-going when Up & Going is picked', () => {
    cy.contains(/Up & Going \(/).click({ force: true });
    cy.url().should('include', '/up-going');
    cy.contains('Chapter 1: Into Programming').should('exist'); 
    cy.contains('Chapter 2: Into JavaScript').should('exist');
});

Есть пара вещей, которые следует отметить, что касается этого теста. На домашней странице YDKJS-упражнения текст «Up & Going» находится в двух местах. Один раз в боковой панели и один раз в середине страницы. На боковой панели полный текст – «Up & Going (0/41)», что означает, что пользователь ответил 0 вопросов из 41 возможен. На главной странице текст – это просто «вверх и проходит». Итак, чтобы убедиться, что мы нажимаем на up & Going с боковой панели, я использую Regex, чтобы щелкнуть элемент, который содержит «Up & Going (». Я не хочу, чтобы это включает 0 или 41, потому что эти цифры могут измениться. Это может быть одним из тех случаев, когда использование атрибута данных может быть лучше, чем использование текста, такого как я делал в фрагменте кода выше.

Мне нужно заставить событие Click, потому что привязка тега имеет текст, но он обернут элементом элемента списка. После этого я проверю, чтобы убедиться, что URL-адрес правильный, и содержимое на странице правильно.

Это последнее состояние кода.

Заключение

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

После того, как вам комфортно, вы даже можете сделать ваш тестовый код, сделав свои собственные команды Cypress!

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

В целом, Cypress – это идеально прочный выбор, если вы хотите принять темирование на следующий уровень с некоторыми концами для окончания тестов!

Счастливое кодирование!

Оригинал: “https://www.freecodecamp.org/news/how-to-add-end-to-end-tests-to-your-project-with-cypress-a74437f6df6e/”