Параметризация команд

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


Пользовательские команды (Cypress.Commands.add)

В Cypress можно создавать собственные команды через метод Cypress.Commands.add. Стандартная команда принимает имя команды и функцию, которая выполняет действия:

Cypress.Commands.add('login', (username, password) => {
    cy.get('#username').type(username)
    cy.get('#password').type(password)
    cy.get('button[type="submit"]').click()
})

В этом примере команда login параметризована данными: username и password. Это позволяет использовать её для разных пользователей:

cy.login('admin', 'admin123')
cy.login('guest', 'guest123')

Параметризация через аргументы делает тесты гибкими и масштабируемыми.


Параметры по умолчанию

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

Cypress.Commands.add('login', (username = 'defaultUser', password = 'defaultPass') => {
    cy.get('#username').type(username)
    cy.get('#password').type(password)
    cy.get('button[type="submit"]').click()
})

cy.login() // Использует параметры по умолчанию
cy.login('admin', 'admin123') // Переопределяет параметры

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


Передача объектов и конфигурационных данных

Для сложных сценариев удобно использовать объекты как аргументы, что улучшает читаемость и поддерживаемость кода:

Cypress.Commands.add('fillForm', ({ name, email, age }) => {
    cy.get('#name').type(name)
    cy.get('#email').type(email)
    cy.get('#age').type(age)
})

cy.fillForm({ name: 'Иван', email: 'ivan@example.com', age: 30 })
cy.fillForm({ name: 'Мария', email: 'maria@example.com', age: 25 })

Использование объектов позволяет добавлять новые поля без изменения всех вызовов команды.


Параметризация через массивы и данные из внешних источников

Cypress поддерживает загрузку данных из файлов JSON или CSV, что позволяет генерировать тесты автоматически для разных наборов данных:

cy.fixture('users.json').then(users => {
    users.forEach(user => {
        cy.login(user.username, user.password)
        cy.get('.welcome-message').should('contain', `Welcome, ${user.username}`)
    })
})

fixture обеспечивает централизованное хранение тестовых данных, а forEach позволяет перебрать все варианты входа без дублирования тестов.


Цепочки команд и параметризация

Cypress использует цепочки команд, что позволяет передавать параметры по мере выполнения шагов:

Cypress.Commands.add('searchAndSelect', (query, index = 0) => {
    cy.get('#search').type(query)
    cy.get('.result-item').eq(index).click()
})

cy.searchAndSelect('Cypress', 2)

Здесь команда принимает динамический индекс, что позволяет выбирать разные элементы из результатов поиска. Цепочки команд сохраняют асинхронность теста и упрощают структуру.


Параметризация с использованием Cypress.env

Для конфиденциальных данных или переменных окружения удобно использовать Cypress.env:

Cypress.Commands.add('loginWithEnv', (userKey) => {
    const username = Cypress.env(`${userKey}_USERNAME`)
    const password = Cypress.env(`${userKey}_PASSWORD`)
    cy.get('#username').type(username)
    cy.get('#password').type(password)
    cy.get('button[type="submit"]').click()
})

cy.loginWithEnv('ADMIN')
cy.loginWithEnv('GUEST')

Использование Cypress.env позволяет отделить тестовые данные от кода, обеспечивая безопасность и гибкость при смене окружений.


Параметризация с коллбэками и функциями

Команды можно параметризовать функциями для динамической генерации значений:

Cypress.Commands.add('fillRandomEmail', (generateEmailFn) => {
    cy.get('#email').type(generateEmailFn())
})

cy.fillRandomEmail(() => `user${Date.now()}@example.com`)

Такой подход позволяет создавать уникальные данные для каждого запуска теста, что полезно для тестирования регистрации пользователей или форм с ограничением уникальности.


Рекомендации по параметризации команд

  1. Использовать объекты для группы параметров — упрощает добавление новых полей.
  2. Выносить общие данные в fixtures или Cypress.env — повышает гибкость тестов.
  3. Давать понятные имена параметрам — облегчает понимание вызовов команды.
  4. Стараться делать команды атомарными — каждая команда выполняет одно логическое действие.
  5. Избегать глубоких цепочек вложенных команд — лучше параметризовать отдельные шаги.

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