В этой статье мы рассмотрим, как работают основные хуки в Cypress: before(), beforeEach(), after() и afterEach().
Содержание
- Хуки before() и beforeEach()
- Хуки after() и afterEach()
- Вложенные хуки before() и beforeEach()
- Использование блока beforeEach в support/index.js
- Что следует поместить в эти блоки?
БЕСПЛАТНО СКАЧАТЬ КНИГИ в телеграм канале "Библиотека тестировщика"
Хуки before() and beforeEach()
Допустим, у вас есть спецификация, в которой есть несколько тестов. В этих тестах вы открываете страницу и тестируете некоторую функциональность. Каждый раз, чтобы открыть страницу, вы используете команду .visit()
:
it('test #1', () => { cy.visit('/') // rest of your test }) it('test #2', () => { cy.visit('/') // rest of your test })
При наличии нескольких тестов ваш код станет слишком громоздким. Чтобы сэкономить время и упростить задачу, можно использовать хук before()
, который будет открывать нужную страницу перед всеми тестами:
before(() => { cy.visit('/') }) it('test #1', () => { // rest of your test }) it('test #2', () => { // rest of your test })
Следует помнить, что Cypress очищает состояние браузера в перерывах между тестами. Начиная с версии 12, он даже посещает пустую страницу, чтобы обеспечить надежную изоляцию тестов. Однако существует возможность адаптировать эту функцию под ваши нужды.
Также важно отметить, что тест №2
должен быть независим от результата теста №1
. Без этого вы создадите эффект домино для всех тестов в этой спецификации. Хорошей практикой является изоляция тестов таким образом, чтобы они не влияли друг на друга. Для этого может оказаться более полезным хук beforeEach()
. Это может потребовать от вас создания определенной структуры тестов, но поможет добиться общей стабильности.
Хуки after() и afterEach()
Аналогично предыдущим хукам, где вы задаете, что будет сделано перед выполнением всех или каждого теста в отдельности, существует возможность закодировать действие, которое будет выполняться по завершению тестов. Обычно хуки after()
и afterEach()
используются для выполнения очистки данных, сгенерированных в процессе тестирования. Использование этих хуков может выглядеть следующим образом:
after(() => { resetDb() }) it('test #1', () => { // your test }) it('test #2', () => { // your test })
Однако есть несколько причин, по которым вы можете пересмотреть использование after()
и afterEach()
и использовать before()
и beforeEach()
вместо них.
Прежде всего, при написании теста в режиме GUI после завершения теста можно продолжать взаимодействовать со страницей. При удалении данных вы можете лишиться этой возможности.
Во-вторых, действие, происходящее в after()
или afterEach()
, может быть ошибочным. В этом случае может возникнуть эффект домино, аналогичный описанному несколькими абзацами ранее.
Конечно, есть ситуации, когда эти хуки очень полезны, например, для сбора данных, полученных в ходе прохождения тестов, и т.д.
Вложенные хуки before() и beforeEach()
Допустим, у вас есть несколько хуков и различные блоки describe()
и it()
. Здесь все может быть немного запутанным, но становится очень понятным, когда вы узнаете, как это работает. Рассмотрим следующий код:
before(() => { cy.log('orange') }) beforeEach(() => { cy.log('banana') }) describe('group #1', () => { before(() => { cy.log('apple') }) beforeEach(() => { cy.log('cherry') }) it('test #1', () => { // your test }) })
Знаете ли вы, в каком порядке будут выполняться эти блоки кода? Правильный ответ следующий:
Сравните, в каком порядке мы написали их в нашем тесте и в каком порядке они выполняются.
Использование блока beforeEach в support/index.js
Более подробно о создании хранилища написано в статье о работе с данными API-ответов в Cypress. Вы можете использовать свой файл support/index.js следующим образом:
beforeEach(() => { Cypress.env('boards', []); Cypress.env('lists', []); });
В своих тестах вы также можете добавлять данные в эти пустые массивы по мере необходимости.
Что следует поместить в эти блоки?
Вышеперечисленные хуки позволяют задать пред- и постусловия для тестов. Они часто используются для выполнения API-запросов, загрузки данных, установки cookie авторизации или выполнения других подобных действий, не требующих открытия приложения в браузере. Команду .visit()
необходимо прописывать отдельно для каждого теста, в то время как хуки before() и beforeEach() значительно упрощают работу с кодом, так как позволяют задавать определенные предусловия для целого набора тестов.
Надеемся, эта статья о базовых хуках в Cypress была вам полезна, и вы сможете более уверенно использовать их в своей работе.
Перевод статьи «Cypress basics: before(), beforeEach(), after() and afterEach()».