E2E (End-to-End) тестирование предназначено для проверки функциональности приложения в условиях, максимально приближенных к реальным. В контексте использования Radix UI это означает проверку работы интерактивных компонентов, таких как модальные окна, выпадающие списки, селекты и табы, во всей цепочке пользовательских действий — от взаимодействия с элементами до изменения состояния приложения.
Для E2E тестирования JavaScript-приложений с Radix UI чаще всего используют Cypress или Playwright. Основные шаги настройки включают:
npm install --save-dev cypress
# или для Playwright
npm install --save-dev @playwright/test
npx cypress open
# или
npx playwright test --init
Важно помнить, что Radix UI строится на базе Headless UI компонентов, поэтому для тестирования требуется доступ к реальным DOM-элементам и управление состояниями компонентов через реальные события, такие как клики, фокус и изменение значений.
Radix Dialog является полностью контролируемым компонентом. Основные сценарии для E2E:
Пример Cypress-теста:
describe('Dialog component', () => {
it('открывает и закрывает диалог', () => {
cy.visit('/');
cy.get('[data-testid="open-dialog"]').click();
cy.get('[data-radix-dialog-content]').should('be.visible');
cy.get('[data-testid="close-dialog"]').click();
cy.get('[data-radix-dialog-content]').should('not.exist');
});
});
Ключевое внимание уделяется атрибутам
data-radix-*, которые Radix добавляет к элементам,
облегчая их выбор для тестов.
В E2E тестах необходимо проверять следующие аспекты:
Пример Playwright-теста для Radix Select:
import { test, expect } fr om '@playwright/test';
test('Select component работает корректно', async ({ page }) => {
await page.goto('/');
await page.click('[data-testid="select-trigger"]');
await expect(page.locator('[data-radix-select-content]')).toBeVisible();
await page.click('[data-radix-select-item="Option 2"]');
await expect(page.locator('[data-testid="select-trigger"]')).toHaveText('Option 2');
});
Обращение к data-radix-select-item и
проверка текста триггера позволяет убедиться в корректности работы
компонента.
Для Radix Tabs важны следующие сценарии:
aria-selected и
aria-controls для доступности.Пример Cypress-теста:
describe('Tabs component', () => {
it('переключает вкладки и отображает правильный контент', () => {
cy.visit('/');
cy.get('[data-testid="tab-1"]').click().should('have.attr', 'aria-selected', 'true');
cy.get('[data-testid="tab-content-1"]').should('be.visible');
cy.get('[data-testid="tab-2"]').click().should('have.attr', 'aria-selected', 'true');
cy.get('[data-testid="tab-content-2"]').should('be.visible');
});
});
Особое внимание стоит уделять ARIA-атрибутам, так как Radix UI активно использует их для доступности, и неправильное управление ими может привести к неожиданным багам при тестировании.
Radix UI компоненты часто имеют сложные состояния:
Пример тестирования состояния focus для Popover:
cy.get('[data-testid="popover-trigger"]').focus();
cy.get('[data-radix-popover-content]').should('be.visible');
cy.get('[data-testid="popover-trigger"]').blur();
cy.get('[data-radix-popover-content]').should('not.exist');
Для стабильного E2E тестирования компонентов Radix UI рекомендуется:
cypress run --headless или Playwright
npx playwright test --headed=false).data-testid или
data-radix-*) вместо классов.cy.findByRole или Playwright
getByRole там, где это возможно, чтобы тесты были
более доступными и независимыми от структуры DOM.E2E тестирование с Radix UI требует точного управления DOM-событиями, внимательного использования встроенных атрибутов и проверки интерактивных состояний, что позволяет создавать стабильные, надежные тесты для сложных интерфейсов.