Cypress — это современный инструмент для энд-ту-энд
тестирования веб-приложений, который позволяет автоматизировать
взаимодействие с пользовательским интерфейсом в браузере. Основная
структура теста в Cypress строится вокруг команд describe,
context и it.
describe и context используются для
логической группировки тестов.it содержит конкретный тестовый сценарий.before, beforeEach, after,
afterEach позволяют управлять состоянием перед запуском
тестов и после них.Пример базового шаблона:
describe('Управление организацией', () => {
beforeEach(() => {
cy.visit('/login');
cy.get('#username').type('admin');
cy.get('#password').type('password');
cy.get('#login-button').click();
});
it('Создание новой организации', () => {
cy.get('#create-organization').click();
cy.get('#organization-name').type('Новая организация');
cy.get('#save-button').click();
cy.contains('Организация успешно создана').should('be.visible');
});
});
Cypress использует команды типа cy.get(),
cy.contains() и cy.find() для поиска элементов
на странице. Выбор селекторов является ключевым
моментом, чтобы тесты были стабильными:
data-cy="organization-name".Для работы с формами применяются команды:
cy.type() для ввода текста.cy.select() для выбора опций из выпадающего
списка.cy.check() и cy.uncheck() для работы с
чекбоксами.cy.click() для кнопок и ссылок.Пример взаимодействия с формой создания организации:
cy.get('[data-cy="organization-name"]').type('Компания A');
cy.get('[data-cy="organization-type"]').select('IT');
cy.get('[data-cy="organization-active"]').check();
cy.get('[data-cy="save-organization"]').click();
cy.contains('Организация успешно создана').should('exist');
Cypress использует библиотеку Chai для ассертов. Основные методы проверки:
should('be.visible') — элемент видим на странице.should('have.text', 'текст') — проверка текста.should('contain', 'текст') — частичное совпадение
текста.should('have.value', 'значение') — проверка значения
инпута.Ассерты можно комбинировать:
cy.get('[data-cy="organization-name"]')
.should('be.visible')
.and('have.value', 'Компания A');
Создание организации:
Чтение и проверка списка:
cy.get() для поиска таблицы и
cy.contains() для поиска конкретной организации.should('have.length', n).cy.get('[data-cy="organization-row"]').should('have.length', 5);
cy.contains('Компания A').should('exist');
Обновление организации:
cy.contains('Компания A')
.parent()
.find('[data-cy="edit-button"]')
.click();
cy.get('[data-cy="organization-name"]').clear().type('Компания B');
cy.get('[data-cy="save-organization"]').click();
cy.contains('Компания B').should('exist');
Удаление организации:
cy.contains('Компания B')
.parent()
.find('[data-cy="delete-button"]')
.click();
cy.get('[data-cy="confirm-delete"]').click();
cy.contains('Компания B').should('not.exist');
Cypress автоматически ожидает загрузку элементов и завершение асинхронных операций.
cy.wait() и cy.intercept().cy.intercept() позволяет перехватывать запросы
к API и проверять данные до отображения на UI.Пример проверки API при создании организации:
cy.intercept('POST', '/api/organizations').as('createOrg');
cy.get('[data-cy="save-organization"]').click();
cy.wait('@createOrg').its('response.statusCode').should('eq', 201);
Фикстуры позволяют хранить тестовые данные в виде JSON и использовать их для тестов. Это обеспечивает масштабируемость и поддерживаемость.
Пример:
cy.fixture('organization.json').then((org) => {
cy.get('[data-cy="organization-name"]').type(org.name);
cy.get('[data-cy="organization-type"]').select(org.type);
});
Параметризация через массивы позволяет выполнять один и тот же тест для разных организаций:
const organizations = ['Компания A', 'Компания B', 'Компания C'];
organizations.forEach((name) => {
it(`Создание организации ${name}`, () => {
cy.get('[data-cy="organization-name"]').type(name);
cy.get('[data-cy="save-organization"]').click();
cy.contains(name).should('exist');
});
});
Cypress предоставляет встроенные инструменты для логирования и дебага:
cy.log('Сообщение') — вывод сообщения в консоль
тестов.debugger — стандартный JS-отладчик, работает при
запуске Cypress в интерактивном режиме.cy.pause() — приостанавливает выполнение теста для
ручной проверки состояния.Пример:
cy.get('[data-cy="organization-name"]').type('Компания A');
cy.log('Имя организации введено');
cy.pause();
cy.get('[data-cy="save-organization"]').click();
data-cy) для устойчивости тестов.cy.intercept()
вместо cy.wait() с фиксированным временем.Эти практики обеспечивают надежность, масштабируемость и читаемость тестов для управления организацией в веб-приложении.