В процессе тестирования приложений часто возникает необходимость передавать данные между отдельными тестами. В отличие от классических юнит-тестов, где каждый тест изолирован и независим, в end-to-end тестах может потребоваться использовать результат одного теста в другом. Cypress предоставляет несколько механизмов для безопасного и удобного обмена данными между тестами, однако важно понимать ограничения и лучшие практики.
Cypress.env для глобальных переменныхCypress поддерживает глобальные переменные через объект
Cypress.env(). Это удобный способ хранить данные, которые
нужны во многих тестах, например, идентификаторы пользователей, токены
или конфигурационные параметры.
// Установка значения
Cypress.env('userId', 12345);
// Получение значения в другом тесте
const userId = Cypress.env('userId');
Особенности использования:
Cypress.env, сохраняются
только на время выполнения теста, после перезапуска они
не сохраняются.cy.wrap и
aliasCypress позволяет привязывать данные к конкретной цепочке команд с
помощью alias. Это эффективный способ передавать результаты
асинхронных операций между тестами.
describe('Пользовательские сценарии', () => {
before(() => {
cy.request('POST', '/api/users', { name: 'Alice' })
.its('body')
.as('newUser'); // сохраняем тело ответа под alias
});
it('Использует данные нового пользователя', function() {
cy.log(this.newUser.id);
});
});
Ключевые моменты:
alias создаются с помощью .as('имя').alias возможен только через
function() {} вместо стрелочных функций, потому что
стрелочные функции не имеют собственного контекста
this.before или beforeEach.fixtures для статических и динамических данныхФайлы фикстур (fixtures) позволяют хранить заранее
подготовленные данные в формате JSON и загружать их в тесты через
cy.fixture().
// Пример fixtures/user.json
{
"name": "Alice",
"email": "alice@example.com"
}
// Использование в тесте
cy.fixture('user').then(user => {
cy.request('POST', '/api/users', user).as('createdUser');
});
Преимущества:
localStorage или sessionStorageДля сценариев, связанных с авторизацией или хранением пользовательских настроек в браузере, можно использовать веб-хранилища.
// Сохранение токена авторизации
cy.setLocalStorage('authToken', '123456789');
// Получение токена в другом тесте
const token = cy.getLocalStorage('authToken');
Особенности:
Для комплексных сценариев иногда удобнее хранить промежуточные данные
во внешних JSON-файлах или тестовых базах данных. Cypress позволяет
взаимодействовать с файловой системой через cy.writeFile и
cy.readFile.
// Сохранение данных
cy.writeFile('cypress/fixtures/tempUser.json', { id: 1, name: 'Alice' });
// Чтение данных в другом тесте
cy.readFile('cypress/fixtures/tempUser.json').then(user => {
cy.log(user.name);
});
Плюсы и минусы:
before или beforeEach
для подготовки данных. Это повышает стабильность и читаемость
тестов.fixtures или
внешние файлы.cy.request или cy.fixture, должны
использовать цепочки команд Cypress или then.| Метод | Сценарий применения | Плюсы | Минусы |
|---|---|---|---|
Cypress.env |
Глобальные простые данные | Простота использования | Временные данные, не для сложных структур |
alias / this |
Передача данных между тестами внутри describe | Безопасное использование в цепочке команд | Требуется function() |
fixtures |
Статические или повторяющиеся данные | Отделение данных от тестов | Мало гибкости для динамических данных |
localStorage / sessionStorage |
Авторизация, пользовательские настройки | Сохраняет данные в сессии | Не для больших структур данных |
| Внешние файлы / базы данных | Сложные или долговременные данные | Возможность сохранять между запусками | Требует управления файлами/БД |
Использование правильного подхода к обмену данными между тестами повышает устойчивость тестов, улучшает поддерживаемость кода и делает сценарии более предсказуемыми.