Skip to content

Проверка доступности через axe в test-runner - #130

Merged
ichiesov merged 4 commits into
storybook-style-snapshotsfrom
storybook-a11y-checks
Aug 27, 2026
Merged

Проверка доступности через axe в test-runner#130
ichiesov merged 4 commits into
storybook-style-snapshotsfrom
storybook-a11y-checks

Conversation

@khaliulin

@khaliulin khaliulin commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Стекнут на #129 (которая стекнута на #127). Порядок мержа: #127#128#129#130.

Что

preVisit инжектит axe, postVisit прогоняет его по #storybook-root. Гейтятся только нарушения уровня critical и seriousmoderate/minor axe тоже находит, но там много спорного.

Добавлен axe-playwright@2.2.2 в devDependencies.

Почему с baseline, а не «в лоб»

Первый прогон без baseline: 129 из 264 stories падают. Это накопленный долг PrimeNG и обёрток, его не закрыть одним PR, а красный на старте гейт никто чинить не будет — его просто отключат.

Поэтому известные нарушения ложатся в .storybook/a11y-baseline/<storyId>.json (список id правил), и прогон падает только на новом. Регрессии ловятся с первого дня.

Baseline ведётся по id правила, без числа затронутых элементов — иначе он дёргался бы от каждой правки разметки.

В репозиторий baseline не кладётся — как и пиксельные снимки из #131: каталог под игнором, первый прогон на чистой копии снимает его сам, дальше сверяется с ним. В Files changed четыре файла: .gitignore, .storybook/test-runner.ts, package.json, package-lock.json.

Что накопилось

stories правило
51 color-contrast
29 label
23 button-name
14 aria-input-field-name
11 aria-valid-attr-value
10 aria-allowed-attr
10 scrollable-region-focusable
8 aria-required-parent
6 aria-meter-name
6 aria-required-children
4 aria-dialog-name
3 link-name, image-alt, aria-progressbar-name
1 aria-required-attr, nested-interactive, aria-command-name

color-contrast в половине списка — это, скорее всего, один системный промах в токенах, а не 51 отдельная проблема. Отдельная тема, сюда не тащу.

Как чинить долг

UPDATE_A11Y_BASELINE=1 npm run test-storybook

Из диффа baseline видно ровно то, что закрыто: файл ужался или исчез. Правило, пропавшее из нарушений, само из baseline не уходит — нужен явный пересбор.

Точечное отключение работает через штатный параметр аддона a11y:

export const Story = { parameters: { a11y: { disable: true } } };

Проверка

  • baseline сгенерирован, два прогона подряд зелёные (кроме Password из Исправить открывающий тег в шаблоне story Password #128): 1 failed, 51 passed, 38–49 с;
  • негативная проверка: подменил правило в .storybook/a11y-baseline/components-button--icons.json — story честно упала с [a11y/critical] button-name: Buttons must have discernible text (18 элем.), после возврата снова зелено;
  • прогон из чистой копии без baseline: 21 passed, снимок создан сам и совпал с прежним содержимым файлов.

@khaliulin
khaliulin force-pushed the storybook-style-snapshots branch from 269a68e to d27a905 Compare August 26, 2026 12:41
@khaliulin
khaliulin force-pushed the storybook-a11y-checks branch from fb4c9c2 to d16f281 Compare August 26, 2026 12:41
@khaliulin

Copy link
Copy Markdown
Contributor Author

Переписал коммит: конфиг тест-раннера больше не протекает в stories. Опт-ины переехали в .storybook/test-runner.tsSTYLE_SNAPSHOT_SKIP (по id story) и PIXEL_SNAPSHOT_TITLES (по title компонента) вместо parameters.styleSnapshot.skip и parameters.pixelSnapshot в файлах stories.

Во всём стеке теперь ноль изменённых stories — только .storybook/, зависимости и .gitignore. Ветки перезалиты force-push, базы PR не менялись.

Проверка после переписывания: полный прогон 1 failed, 263 passed (падает только Password из #128), 39 пиксельных снимков на месте — поведение не изменилось.

@ichiesov
ichiesov merged commit 6910562 into storybook-style-snapshots Aug 27, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants