Перевод статьи «Skip test conditionally with Cypress».
В этой статье я хотел бы показать вам различные стратегии и инструменты, позволяющие пропускать тесты или запускать их по условию.
Содержание
- .skip и .only
- Конфигурационный файл
- Тестовая конфигурация
- Плагин
- Использование CLI
- Собственная логика
Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ
.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'
Ваша собственная логика
Есть множество вариантов, которые вы можете использовать. Я описал лишь некоторые из них. Есть также опция для выполнения поиска всех ваших тестов через плагин. Выбирайте то, что вам больше нравится!