В автоматизированном тестировании приложений на JavaScript одной из ключевых задач является конфигурирование тестов под различные среды. Cypress предоставляет гибкие механизмы для работы с environment-specific параметрами, позволяя адаптировать тесты под локальную разработку, staging, production или другие окружения без изменения кода тестов.
cypress.config.jsФайл cypress.config.js является центральным местом
управления настройками Cypress. В нём можно определить
глобальные параметры, а также параметры для конкретных
окружений.
Пример базовой конфигурации:
const { defineConfig } = require('cypress');
module.exports = defineConfig({
e2e: {
baseUrl: 'http://localhost:3000',
env: {
apiUrl: 'http://localhost:5000/api',
username: 'testuser',
password: 'password123'
},
setupNodeEvents(on, config) {
// node события
}
}
});
Cypress позволяет создавать отдельные конфигурации для разных
сред. Это достигается через комбинацию
cypress.config.js и специальных файлов переменных
окружения, либо через командную строку.
Пример запуска тестов с определённой средой:
npx cypress run --env ENV=staging
В конфигурации можно использовать условные блоки:
const { defineConfig } = require('cypress');
const environment = process.env.ENV || 'development';
const envConfig = {
development: {
baseUrl: 'http://localhost:3000',
apiUrl: 'http://localhost:5000/api'
},
staging: {
baseUrl: 'https://staging.example.com',
apiUrl: 'https://staging-api.example.com'
},
production: {
baseUrl: 'https://example.com',
apiUrl: 'https://api.example.com'
}
};
module.exports = defineConfig({
e2e: {
baseUrl: envConfig[environment].baseUrl,
env: {
apiUrl: envConfig[environment].apiUrl
}
}
});
Такой подход позволяет одним тестовым кодом покрывать
несколько окружений, просто изменяя параметр
ENV.
Переменные, определённые через env или командную строку,
доступны внутри тестов с помощью метода Cypress.env():
describe('API тесты', () => {
it('Проверка получения данных', () => {
const apiUrl = Cypress.env('apiUrl');
cy.request(`${apiUrl}/users`)
.its('status')
.should('eq', 200);
});
});
Особенности:
Cypress.env('имя') возвращает значение переменной..env..env файламиДля упрощения управления конфиденциальными данными и различными
окружениями часто применяются .env файлы совместно с
библиотекой dotenv.
Пример структуры:
.env.development
.env.staging
.env.production
Содержание файла .env.staging:
API_URL=https://staging-api.example.com
USERNAME=staging_user
PASSWORD=staging_pass
И подключение в cypress.config.js:
require('dotenv').config({ path: `.env.${process.env.ENV}` });
module.exports = defineConfig({
e2e: {
baseUrl: process.env.BASE_URL,
env: {
apiUrl: process.env.API_URL,
username: process.env.USERNAME,
password: process.env.PASSWORD
}
}
});
Этот способ гарантирует разделение секретов и конфигурации окружений и исключает их хардкод в тестах.
Cypress предоставляет возможность модифицировать настройки во
время выполнения через Cypress.config() и
Cypress.env().
Пример:
Cypress.config('baseUrl', 'https://new-environment.example.com');
Cypress.env('apiUrl', 'https://new-api.example.com');
Это полезно для подмены URL, токенов или таймаутов без изменения глобальной конфигурации.
Разные среды могут иметь разные скорости отклика, поэтому важно настраивать таймауты и стратегию повторов через конфигурацию:
const envTimeouts = {
development: { defaultCommandTimeout: 4000 },
staging: { defaultCommandTimeout: 8000 },
production: { defaultCommandTimeout: 10000 }
};
module.exports = defineConfig({
e2e: {
baseUrl: envConfig[environment].baseUrl,
defaultCommandTimeout: envTimeouts[environment].defaultCommandTimeout
}
});
Таким образом, тесты станут более устойчивыми к задержкам и нестабильности среды, что критично для интеграционных и end-to-end сценариев.
Для разных окружений часто требуется разный набор данных:
const testData = {
development: { userId: 1 },
staging: { userId: 101 },
production: { userId: 1001 }
};
describe('Проверка данных пользователя', () => {
it('Должен получить информацию о пользователе', () => {
const userId = testData[environment].userId;
cy.request(`${Cypress.env('apiUrl')}/users/${userId}`)
.its('status')
.should('eq', 200);
});
});
Такой подход минимизирует вероятность конфликтов с реальными данными и делает тесты более безопасными для production-среды.
.env файлы для разных сред.Cypress.config()
и Cypress.env() при необходимости.Эти методы обеспечивают масштабируемость и гибкость тестового покрытия, позволяя использовать единый набор тестов для локальной разработки, staging и production без дублирования кода.