<style>.lazy{display:none}</style>Хуки before(), beforeEach(), after() и afterEach() в Cypress

Хуки before(), beforeEach(), after() и afterEach() в Cypress

В этой статье мы рассмотрим, как работают основные хуки в Cypress: before(), beforeEach(), after() и afterEach().

Содержание

БЕСПЛАТНО СКАЧАТЬ КНИГИ в телеграм канале "Библиотека тестировщика"

Хуки 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
  })

})

Знаете ли вы, в каком порядке будут выполняться эти блоки кода? Правильный ответ следующий:

Порядок выполнения блоков кода в Cypress

Сравните, в каком порядке мы написали их в нашем тесте и в каком порядке они выполняются.

Использование блока 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()».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *