Разделы портала

Онлайн-тренинги

.
Переключение между окружениями в Cypress
16.05.2022 00:00

Автор: Филип Рик (Filip Hric)
Оригинал статьи
Перевод: Ольга Алифанова

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

cy.visit(Cypress.env('localUrl'))

Я большой поклонник использования Cypress.env() для хранения переменных, но есть способы куда лучше.


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

Для начала посмотрим на команду .visit(). Эта команда откроет браузер в определенном вами месте. Но она также берет атрибут baseUrl из вашего cypress.json. Это значит, что если ваш baseUrl настроен на http://localhost:3000, ссылки можно прописывать так:

cy.visit('/dashboard')

и в результате ссылка будет http://localhost:3000/dashboard. Атрибут baseUrl используется также в командах .request() и .intercept(). Это куда лучше, нежели использовать переменную env. К примеру, вам не нужно разбираться с переименованием всего на свете, если вы как-нибудь решите изменить имя вашей env-переменной localUrl.

Переписывание cypress.json

Самый простой способ переключать окружения – это просто переписать ваш файл cypress.json и установить baseUrl на новое значение каждый раз, когда вам нужно переключить окружение. Это, конечно, трудоемко и занимает много времени, если переключаться надо часто. К тому же это не лучший способ, если вы используете контроль версий и хотите запускать тесты в CI. Вам нужно каждый раз осуществлять коммит при тесте в новом окружении, и история git превращается в помойку.

Указание на другой файл конфигурации

Вместо использования cypress.json вы можете нацелить Cypress на совершенно другой файл. Допустим, у вас есть файл production.json, где атрибут baseUrl задан как ваш прод-сервер. Для запуска Cypress с использованием этого файла можно сделать вот что:

npx cypress open --config-file production.json

Это, конечно, работает и для команды cypress run.

Передача флага CLI

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

npx cypress open --baseUrl http://localhost:3000

Создание плагина

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

cypress/plugins/index.js
module.exports = (on, config) => {
 
     config.baseUrl = 'http://localhost:3000'
 
     return config
 
}

Это означает, что даже если ваш baseUrl задан как https://cypress.io, то при открытии Cypress он будет переписан на http://localhost:3000. Если вы хотите бесшовно переключаться между окружениями, то можете передать env-переменную через CLI и затем считать ее плагином. Например, можно написать плагин так:

cypress/plugins/index.js
module.exports = (on, config) => {
 
     if (config.env === 'local') {
         config.baseUrl = 'http://localhost:3000'
     }
 
     return config
 
}

А затем передать в CLI:

npx cypress open --env local

В результате каждый раз, когда вы передаете локальный флаг, Cypress перепишет ваш Url на http://localhost:3000. Если вы передаете другую переменную или не передаете ничего, то Cypress возьмет baseUrl из cypress.json.

Использование модульного API

Модульный API позволяет очень гибко запускать тесты. При его использовании вместо команды npx cypress run вы будете запускать свой собственный скрипт. В этом случае вы напечатаете что-то вроде node cypress-run.js в терминале и создадите примерно такой файл:

cypress/cypress-run.js
const cypress = require('cypress')
cypress.run()

Функция .run() возьмет объект как аргумент. В этом объекте можно задавать определенные свойства. Свойство baseUrl будет находиться внутри объекта config вот так:

cypress/cypress-run.js
const cypress = require('cypress')
cypress.run({
     config: {
         baseUrl: 'http://localhost:3000'
     }
})

Это позволяет нам написать функцию, задающую наш baseUrl на основании определенной логики. К примеру, мы можем приказать Cypress установить url стейджа, запуская CI. Большинство CI-провайдеров имеют переменную CI-окружения, которая установлена на истину. Доступ к ней можно получить в файле cypress-run.js. Для этого также можно использовать пакет npm, но в целом он делает то же самое. Файл модульного api будет выглядеть так:

cypress/cypress-run.js
const cypress = require('cypress')
let baseUrl = process.env.CI ? 'http://staging.example.com' : 'http://localhost:3000'
cypress.run({
     config: { baseUrl } // baseUrl будет задан в строке 2
})

После этого все может стать еще сложнее. Можно кастомизировать логику, которая будет задавать ваш baseUrl на основании нескольких условий.

Надеюсь, вам понравилось!

Обсудить в форуме