Условный пропуск тестов в Cypress

Перевод статьи «Skip test conditionally with Cypress».

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

Содержание

Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ

.skip и .only

Самый простой способ пропустить или отфильтровать тест – применить функции .only и .skip. Их можно использовать с несколькими тестами в одной спецификации, чтобы запускать только те тесты, которые вам нужны.

Этот код запустит только первый и третий тесты:

it.only('test #1', () => {
  // ...
})
it('test #2', () => {
  // ...
})
it.only('test #3', () => {
  // ...
})

А тут будет выполняться только первый тест:

it('test #1', () => {
  // ...
})
it.skip('test #2', () => {
  // ...
})
it.skip('test #2', () => {
  // ...
})

Эти функции работают независимо от того, где используются – в GUI или в CI. Кстати, чтобы случайно не оставить .only в тесте, обязательно установите precommit hook, который предотвратит это, или просто установите этот хороший плагин. 

Вы также можете использовать эти ключевые слова для блоков describe. В этом случае тесты будут выглядеть следующим образом:

describe.only('suite #1', () => {

  it('test #1', () => {
    // this test will run
  });

})

describe('suite #2', () => {

  it('test #2', () => {
    // this test will not run
  })

})

Конфигурационный файл

Вы можете указать, какие тесты следует запускать или пропускать, в файле cypress.json. При этом можно использовать имена тестов или применить minimatch для выбора тестов.

Допустим, у вас есть три теста: test1.ts, test2.ts и test.smoke.ts.

Чтобы просто запустить test1, нужно указать его в файле cypress.json:

{
  "testFiles": "test1.ts"
}

Если в папке integration используются вложенные папки, то можно выбрать все тесты с одинаковыми именами внутри всех этих папок, указав  **/test.ts в качестве значения.

Более того, если вы используете соглашение об именовании для ваших smoke-тестов, например test.smoke.ts, вы можете отфильтровать их, передав *.smoke.ts в testFiles. Так, например, эта конфигурация будет запускать только наш файл test.smoke.ts:

{
  "testFiles": "*.smoke.ts"
}

Все эти принципы применимы и к пропуску тестов. Для игнорирования тестовых файлов используйте ignoreTestFiles. В качестве атрибутов можно передавать массивы. Они могут содержать как имя теста, так и minimatch, поэтому можно делать такие вещи:

{
  "ignoreTestFiles": ["test1.ts", "*.smoke.ts"]
}

При такой конфигурации будет выполняться только наш файл test2.ts. Чтобы лучше понять, как работает minimatch, можно поэкспериментировать на globster.xyz или на этом небольшом сайте.

Тестовая конфигурация

Если вы хотите добавить в тесты более сложные условия, можно использовать конфигурацию spec. Например, можно настроить тест на выполнение только в определенном браузере.

it('will run only on chrome', { browser: 'chrome' }, () => {
    // ...
  });

it('will run only on firefox', { browser: 'firefox' }, () => {
  // ...
});

Эта конфигурация тестов позволяет сделать гораздо больше, но что касается пропуска и фильтрации тестов, то это все. Впрочем, все тесты Cypress написаны на JavaScript. Ничто не мешает вам написать условие прямо в файле спецификации:

if (Cypress.config('viewportWidth') > 350) {

  it('does not run on mobile viewports', () => {
    // ...
  });

}

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

Плагин

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

it('runs only on mac', () => {
  cy.onlyOn('mac')
  // ...
})

На странице с описанием (readme) есть ещё несколько крутых примеров – непременно посмотрите их. Что ещё круче, с помощью этого плагина вы можете устанавливать любое условие, которое вам нравится, так что наш пример, ориентированный только на мобильные устройства, будет выглядеть так:

it('does not run on mobile viewports', () => {
  cy.skipOn(Cypress.config('viewportWidth') < 350);
  // ...
})

Использование CLI

Аналогично нашей конфигурации cypress.json, мы можем передавать CLI-аргументы для запуска только тех тестов, которые нам нужны. Для запуска только smoke-тестов мы выполним:

npx cypress run --spec 'cypress/integration/*.smoke.ts'

Чтобы запустить все тесты, кроме smoke, выполним такую команду:

npx cypress run --spec 'cypress/integration/*[!.smoke].ts'

Ваша собственная логика

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

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

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