Перевод статьи «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'
Ваша собственная логика
Есть множество вариантов, которые вы можете использовать. Я описал лишь некоторые из них. Есть также опция для выполнения поиска всех ваших тестов через плагин. Выбирайте то, что вам больше нравится!
