Параметризация команд в 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`)
Такой подход позволяет создавать уникальные данные для каждого запуска теста, что полезно для тестирования регистрации пользователей или форм с ограничением уникальности.
fixtures или
Cypress.env — повышает гибкость тестов.Параметризация команд в Cypress — это фундаментальный инструмент для чистого, масштабируемого и поддерживаемого тестового кода. Она позволяет создавать тесты, которые легко адаптируются под разные сценарии и наборы данных, снижая дублирование и повышая эффективность автоматизации.