Тестирование доступности

Библиотека Haunted, базирующаяся на Web Components и Hooks-ориентированном подходе, позволяет создавать реактивные интерфейсы без привязки к конкретному фреймворку. В производственной базе особое значение приобретает доступность: корректное озвучивание экранными дикторами, фокусируемость, читабельность для assistive-технологий и предсказуемое управление с клавиатуры. Тестирование доступности обеспечивает устойчивость этих аспектов при изменении логики или стилей.

Основные критерии доступности в контексте Haunted

Фокус и клавиатурная навигация. Компоненты обязаны корректно реагировать на Tab/Shift+Tab, Enter, Space и Escape. Проверяется соблюдение tabindex, предсказуемость порядка обхода и отсутствие ловушек фокуса.

ARIA-атрибуты. Состояние компонентов (expanded, selected, pressed и подобные) отражается с помощью aria-expanded, aria-selected и других атрибутов. Тесты отслеживают соответствие состояния компонента и значения атрибутов.

Роль и структура. Семантическая роль (role) должна соответствовать типу элемента интерфейса. Например, выпадающие списки оформляются как combobox с корректными дочерними элементами.

Контент и альтернативный текст. Текстовые подписи, aria-label и aria-labelledby обеспечивают информативность для пользователей экранных дикторов.

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

Для Web Components на Haunted применяются инструменты уровня DOM, способные анализировать дерево компонентов и вычислять нарушения правил доступности.

axe-core для Web Components. Модуль axe-core интегрируется с тестовыми раннерами (Jest, Playwright, Vitest) и анализирует DOM после рендера компонента. Используется для выявления некорректных ролей, отсутствия aria-меток, низкой контрастности текста и других нарушений.

Testing Library с пользовательскими хелперами. @testing-library/dom позволяет взаимодействовать с элементами так, как это происходит у пользователя. Вместе с @testing-library/user-event обеспечивается проверка клавиатурных сценариев.

Playwright и Cypress для end-to-end. Сценарии E2E фиксируют поведение в реальном браузере, проверяя работу фокуса, навигации и экранных дикторов через API браузера или axe-core.

Пример стратегии тестирования

  1. Рендер компонента Haunted в тестовом окружении.
  2. Запуск статического анализа доступности (axe-core).
  3. Симуляция клавиатурных действий: перемещение фокуса, раскрытие и закрытие элементов, выбор опций.
  4. Проверка значения aria-атрибутов после взаимодействия.
  5. Сравнение ролей и структуры DOM с ожидаемыми.
  6. Валидация текстовых меток и альтернативных описаний.

Этот подход минимизирует регрессии при обновлениях логики, стилей и состояния.

Проверка состояния и ARIA-связок

Компоненты Haunted обычно используют хуки (useState, useEffect) для изменения состояния. Важно отражать состояние в ARIA:

  • переключатели используют aria-pressed;
  • сворачиваемые панели — aria-expanded и aria-controls;
  • элементы списков — role=“option” с aria-selected.

Тесты проверяют, что изменение состояния вызывает корректное обновление атрибутов и роли компонента.

Тестирование клавиатурной доступности

Ключевые проверки включают:

  • переход фокуса через интерактивные элементы в предсказуемом порядке;
  • отсутствие невозможных для выхода зон;
  • управление активным состоянием с клавиатуры;
  • сохранение доступности при изменении видимости контента.

Для Haunted важно отслеживать момент перерендера и обновления DOM, поскольку фокус может сбрасываться при замене узлов.

Экранные дикторы и текстовые метки

Семантические подписи обеспечивают понятное восприятие компонентов. В тестах валидируется наличие aria-label, label и aria-labelledby в тех случаях, когда визуальный текст отсутствует или недостаточен. Допустимо использовать Jest DOM matchers (toHaveAccessibleName, toHaveAccessibleDescription), если они присутствуют в окружении.

Контрастность и визуальные ограничения

Визуальные тесты дополнительно проверяют читабельность, достаточный контраст текста и границ элементов. Axe-core автоматически обнаруживает нарушения по WCAG-критериям, что удобно для компонентов, активно использующих стилизацию.

Интеграция в CI/CD

Автоматическое тестирование доступности включается в конвейер сборки. При обновлении компонентов или темизации тесты гарантируют отсутствие критичных регрессий. Рекомендовано запускать их на каждом merge request и nightly-сборках.

Расширение тестового сценария

При сложных компонентах (комбобоксы, меню, вкладки) добавляются сценарии:

  • проверка состояния списка при вводе текста;
  • корректная работа arrow-keys при выборе опций;
  • переключение вкладок по Ctrl+Tab;
  • обновление aria-activedescendant при перемещении курсора клавишами.

Рекомендуемые инструменты и практики

Инструменты: axe-core, Testing Library, Playwright, Cypress, Jest DOM matchers, Storybook Accessibility Addon для визуального анализа.

Практики:

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

Связь accessibility-тестов с архитектурой компонентов

Компоненты Haunted сохраняют состояние в хуках, что облегчает привязку поведения к ARIA. Тесное соответствие состояния и атрибутов предоставляет детерминированную базу для тестов: в аналогичных условиях DOM всегда отражает одно и то же состояние, что уменьшает флаки-тесты и облегчает анализ ошибок.