Выборка тестов в Cypress

Перевод статьи «Test grepping in Cypress using Module API».

Если вы выполняете сотни тестов в Cypress, есть вероятность, что иногда вам необходимо выполнить только часть из них. Такая выборка тестов может реализовываться по-разому, и в этой статье я хочу показать вам свой подход. Если вы пришли сюда только ради решения, прокрутите страницу вниз до конца этой статьи, где вы найдете код.

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

Как вы, вероятно, знаете, чтобы запустить все ваши тесты Cypress, вы можете ввести следующую команду в командную строку:

npx cypress run

При этом будут запущены все тесты, находящиеся в текущем проекте Cypress. Обычно они хранятся в папке integration.

Я предпочитаю создавать дополнительные папки для отдельных категорий тестов. Допустим, у меня есть папки api и ui. Для запуска каждой из них я могу создать отдельный npm-скрипт, поэтому в моем файле  package.json  будет следующее содержимое:

{
  "scripts": {
    "cy:run": "npx cypress run",
    "cy:run:api": "npx cypress run --spec ./cypress/integration/api/*.ts",
    "cy:run:ui": "npx cypress run --spec ./cypress/integration/ui/*.ts"
  }
}

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

Именно здесь вам пригодится модуль API. Сначала давайте напишем наш скрипт запуска с помощью модуля API. Создадим новый файл cypress.js в корне нашего проекта и добавим в него следующий код:

const cypress = require('cypress');

cypress.run();

Это практически то же самое, что и выполнение команды npx cypress run. Но вместо этого мы запустим нашу команду, набрав в терминале node cypress.js.

Чтобы облегчить себе задачу, добавим это в скрипты package.json:

{
  "scripts": {
    "cy:run": "node cypress.js"
  }
}

Наша функция cypress.run() также может принимать параметр options. С его помощью мы можем указать, какие тесты должны быть запущены. Это аналогично тому, что было сделано с флагом --spec в предыдущем примере.

Итак, добавим options внутрь нашей функции и укажем папку spec для запуска:

const cypress = require('cypress');

cypress.run({
  spec: './cypress/integration/api/*.ts',
});

Это свойство также может быть массивом:

const cypress = require('cypress');

cypress.run({
  spec: ['./cypress/integration/api/*.ts', './cypress/integration/ui/*.ts'],
});

Теперь, когда мы все это знаем, мы можем экспериментировать внутри нашего файла cypress.js и применять любую логику, которая нам нравится.

Выборка тестов при помощи опции –grep

Допустим, вместо папок api и ui у меня есть папки с именами: listdetailsettingslogin и signup. Я хочу иметь возможность выбирать любое их количество или комбинацию из них. Но мне также может понадобиться запустить весь набор тестов.

Для реализации такого поведения мы добавим модуль под названием yargs. Он позволяет нам создавать собственные параметры командной строки и работать с ними.

Мы добавим опцию --grep, чтобы при необходимости запуска тестов внутри папок settings и login мы вызывали скрипт следующего вида:

npm run cy:run -- --grep settings login

Чтобы определить опцию --grep, мы добавим в наш файл cypress.js следующее:

const yargs = require('yargs');

const { grep } = yargs
  .option('grep', {
    type: 'array'
  }).argv;

Чтобы передать --grep несколько аргументов, необходимо указать тип входных данных, как показано в строке 5. Если вы не знакомы с синтаксисом { grep }, посмотрите мою статью о деструктуризации, где я рассказываю об этом более подробно.

Давайте доработаем наш сценарий и передадим эти параметры нашей команде cypress.run():

const cypress = require('cypress');
const yargs = require('yargs');

const { grep } = yargs
  .option('grep', {
    type: 'array',
    default: ['*']
  }).argv;

cypress.run({
  spec: grep.map(folder => `./cypress/integration/${folder}/*.ts`),
});

В строке 11 мы прописываем все имена папок, чтобы при вызове npm run cy:run -- --grep settings login нашей переменной grep было присвоено значение ["settings", "login"].

И наш атрибут spec будет иметь значение:

["./cypress/integration/settings/*.ts", "./cypress/integration/login/*.ts"]

Таким образом, мы можем либо передать имена папок в аргумент --grep, либо опустить аргумент и запустить все наши тесты.

Это всего лишь JavaScript, поэтому мы можем применять любую логику. Вместо --grep в качестве имени параметра можно использовать --folder. Можно пойти еще дальше и создать оба флага – --folder и --testFile – чтобы сделать наш выбор еще более конкретным.

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

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

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