End-to-End (E2E) тестирование предназначено для проверки работы приложения от начала до конца, включая взаимодействие пользовательского интерфейса с бизнес-логикой и серверной частью. В контексте Vuetify, E2E тесты позволяют убедиться, что все компоненты интерфейса корректно рендерятся, реагируют на события и сохраняют согласованное поведение при изменениях данных.
Наиболее популярные инструменты для E2E тестирования Vue-приложений с Vuetify:
npm install cypress --save-dev
npx cypress open
После этого создается структура папок cypress/,
включающая integration/, fixtures/,
support/.
import Vue from 'vue';
import Vuetify from 'vuetify';
Vue.use(Vuetify);
export const vuetify = new Vuetify({
theme: { disable: true },
});
Компоненты Vuetify содержат сложные стили и состояния (hover, active, disabled). Для их тестирования используют Cypress команды:
cy.get('button.v-btn')
.should('be.visible')
.and('contain.text', 'Отправить')
.click();
Особое внимание уделяется динамическим классам
Vuetify, например v-menu__content или
v-dialog__content, которые появляются после взаимодействия
пользователя.
Vuetify формы (v-form, v-text-field,
v-select) требуют проверки:
disabled)Пример проверки обязательного поля:
cy.get('input[name="email"]')
.type('invalid-email')
.blur();
cy.get('.v-messages__message')
.should('contain.text', 'Введите корректный email');
Vuetify модальные окна (v-dialog, v-menu)
динамически создаются в DOM. E2E тесты должны учитывать это:
cy.get('button.open-dialog').click();
cy.get('.v-dialog__content').should('be.visible');
cy.get('.v-dialog__content button.confirm').click();
cy.get('.v-dialog__content').should('not.exist');
Vuetify активно использует асинхронные анимации и переходы. Для стабильности тестов рекомендуется:
cy.wait() для ожидания завершения анимации
(по возможности избегать фиктивных таймаутов)cy.get().should('exist') для проверки
появления элементовcy.findByRole() или
cy.findByText() для более надежного поиска элементовПример с ожиданием появления списка:
cy.get('button.open-menu').click();
cy.get('.v-menu__content').should('be.visible');
cy.get('.v-list-item').should('have.length', 5);
Для больших проектов важно структурировать тесты:
Каждый тестовый файл желательно разделять по компонентам или страницам. Например:
cypress/integration/
├─ login.spec.js
├─ dashboard.spec.js
└─ forms.spec.js
transition
или глобальные опции VuetifyДля автоматического запуска тестов:
"scripts": {
"test:e2e": "cypress run"
}
"cypress.json": {
"video": true,
"screenshotsFolder": "cypress/screenshots"
}
Компоненты типа v-data-table, v-treeview,
v-calendar требуют:
Пример проверки таблицы:
cy.get('.v-data-table .v-data-table__wrapper tbody tr')
.should('have.length.greaterThan', 0);
cy.get('.v-data-table th')
.contains('Имя')
.click();
cy.get('.v-data-table tbody tr:first-child td')
.should('contain.text', 'Алексей');
E2E тестирование в Vuetify требует внимательности к динамическим DOM структурам, асинхронным переходам и анимациям, а также тщательной организации тестов для поддержания их стабильности и удобочитаемости.