Настройка переменных окружения

Переменные окружения в Cypress позволяют управлять конфигурацией тестов без изменения исходного кода, обеспечивая гибкость и безопасность при работе с разными средами (development, staging, production). Они позволяют хранить чувствительные данные, такие как URL, токены доступа и пароли, а также параметры, влияющие на поведение тестов.


Способы задания переменных окружения

Cypress поддерживает несколько методов задания переменных окружения. Выбор метода зависит от контекста использования: локальная разработка, CI/CD или динамическая передача параметров.

1. Через файл cypress.env.json

Файл cypress.env.json размещается в корне проекта Cypress и содержит ключи и значения в формате JSON:

{
  "baseUrl": "https://staging.example.com",
  "apiToken": "12345-abcdef",
  "userEmail": "test@example.com"
}

Все ключи из этого файла становятся доступны в тестах через объект Cypress.env(). Пример использования:

describe('Авторизация', () => {
  it('Должна использовать токен из окружения', () => {
    const token = Cypress.env('apiToken');
    cy.request({
      method: 'GET',
      url: '/api/user',
      headers: {
        Authorization: `Bearer ${token}`
      }
    }).then((response) => {
      expect(response.status).to.eq(200);
    });
  });
});

Особенности:

  • Файл cypress.env.json можно добавить в .gitignore, чтобы не хранить чувствительные данные в репозитории.
  • Поддерживается вложенная структура JSON, что позволяет группировать переменные по категориям.

2. Через cypress.config.js или cypress.config.ts

В новой версии Cypress (>=10) переменные окружения можно задавать непосредственно в конфигурационном файле:

import { defineConfig } from 'cypress'

export default defineConfig({
  e2e: {
    baseUrl: 'https://staging.example.com',
    env: {
      apiToken: '12345-abcdef',
      userRole: 'admin'
    }
  }
})

Доступ к переменным осуществляется так же через Cypress.env('имя_переменной').

Преимущества:

  • Конфигурация и переменные объединены в одном месте.
  • Легко различать переменные для разных сред, используя объекты конфигурации для development, staging, production.

3. Через командную строку

Переменные окружения можно передавать при запуске Cypress в CLI:

npx cypress run --env apiToken=12345-abcdef,userEmail=test@example.com

В тестах они будут доступны через Cypress.env('apiToken') и Cypress.env('userEmail').

Особенности:

  • Позволяет быстро изменять значения без правки конфигурационных файлов.
  • Часто используется в CI/CD пайплайнах для передачи секретных данных.

4. Через системные переменные окружения

Cypress автоматически считывает переменные окружения из системных переменных, если они начинаются с префикса CYPRESS_. Например:

export CYPRESS_API_TOKEN=12345-abcdef
npx cypress run

В тестах доступ:

const token = Cypress.env('API_TOKEN')

Преимущества:

  • Полностью безопасно для секретов в CI/CD, так как не сохраняется в проекте.
  • Можно динамически менять окружение без изменения файлов проекта.

Практика использования переменных окружения

  1. Поддержка разных сред Создание нескольких файлов конфигурации и переменных окружения для development, staging и production позволяет запускать тесты на разных окружениях без изменения кода:
npx cypress run --config-file cypress.staging.config.js

В cypress.staging.config.js можно задать уникальные переменные окружения для staging.

  1. Хранение секретов Чувствительные данные (токены, пароли) никогда не хранятся в репозитории. Использование системных переменных или .env файлов с добавлением в .gitignore обеспечивает безопасность.

  2. Динамическая подмена данных Переменные окружения позволяют подставлять данные, например, email пользователей или токены, которые создаются динамически перед запуском тестов.

beforeEach(() => {
  cy.login(Cypress.env('userEmail'), Cypress.env('apiToken'))
})

Рекомендации по организации переменных

  • Использовать единый стиль именования: snake_case или camelCase.
  • Не смешивать конфиденциальные и неконфиденциальные данные в одном файле.
  • Группировать переменные по функциональности: auth, api, ui.
  • Для разных сред создавать отдельные конфигурационные файлы или использовать условные конструкции в cypress.config.js.

Получение всех переменных окружения

Cypress позволяет получить весь объект окружения:

const envVars = Cypress.env()
console.log(envVars)

Это удобно для отладки и проверки корректности подстановки значений.


Переменные окружения и кастомные команды

Переменные окружения часто используются в кастомных командах (cypress/support/commands.js) для универсальности:

Cypress.Commands.add('login', () => {
  cy.request({
    method: 'POST',
    url: `${Cypress.env('baseUrl')}/login`,
    body: {
      email: Cypress.env('userEmail'),
      password: Cypress.env('userPassword')
    }
  })
})

Так можно централизованно менять данные для входа без изменения каждого теста.


Важные нюансы

  • Значения переменных окружения всегда имеют тип string. Для чисел или булевых значений необходимо преобразование:
const retries = Number(Cypress.env('RETRIES')) || 1
const isEnabled = Cypress.env('FEATURE_FLAG') === 'true'
  • Переменные, заданные через CLI, имеют приоритет над конфигурацией в cypress.config.js и cypress.env.json.
  • При использовании CYPRESS_ префикса из системных переменных имена автоматически приводятся к верхнему регистру, но при доступе через Cypress.env() используется имя без префикса.

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