Skip to content

Conversation

@cdransf
Copy link
Member

@cdransf cdransf commented Oct 28, 2025

Description

SWC-1263

Proof of concept implementing automated accessibility testing using Playwright with two complementary approaches:

1. ARIA Snapshot Testing

  • Captures and validates accessibility tree structure
  • Detects unintended changes to component semantics
  • Human-readable YAML format serves as living documentation

2. aXe-core WCAG Validation

  • Automated WCAG 2.0/2.1 Level A/AA compliance checking
  • Validates color contrast, ARIA attributes, keyboard accessibility
  • Focused on standards compliance (excludes best-practice rules)

Test Coverage

25 tests passing across both generations (~30s runtime):

1st Generation (13 tests):

  • Badge: 6 tests (3 ARIA snapshots, 3 aXe validations)
  • Status Light: 7 tests (3 ARIA snapshots, 4 aXe validations)

2nd Generation (12 tests):

  • Badge: 4 tests (2 ARIA snapshots, 2 aXe validations)
  • Status Light: 8 tests (3 ARIA snapshots, 5 aXe validations)

Key Features

  • Dual Storybook Support: Playwright projects handle both generations (1st gen: port 8080, 2nd gen: port 6006)
  • Deterministic Testing: No arbitrary timeouts (waits for custom element definition, visibility, upgrade)
  • Collocated Tests: Tests live with components in test/*.a11y.spec.ts
  • Shared Helpers: Generation-agnostic utilities in first-gen/test/a11y-helpers.ts work for both gens
  • Auto-start Storybooks: Both instances launch automatically when running tests
  • Consolidated Documentation: Single source of truth at ACCESSIBILITY_TESTING.md

Usage

yarn test:a11y          # Run all tests (both generations)
yarn test:a11y:1st      # Only 1st gen tests
yarn test:a11y:2nd      # Only 2nd gen tests
yarn test:a11y:ui       # Interactive Playwright UI

Files Added/Modified

Test Files:

  • first-gen/packages/badge/test/badge.a11y.spec.ts
  • first-gen/packages/status-light/test/status-light.a11y.spec.ts
  • second-gen/packages/swc/components/badge/test/badge.a11y.spec.ts
  • second-gen/packages/swc/components/status-light/test/status-light.a11y.spec.ts

Shared Utilities:

  • first-gen/test/a11y-helpers.ts - Deterministic helpers for both generations

Configuration:

  • first-gen/playwright.config.ts - Dual-Storybook Playwright setup with projects
  • first-gen/package.json - Test scripts (test:a11y, test:a11y:1st, test:a11y:2nd, test:a11y:ui)
  • package.json - Root-level convenience commands

Documentation:

  • ACCESSIBILITY_TESTING.md - Comprehensive guide covering quick start, how-to, and best practices

ARIA Snapshots (auto-generated baselines):

  • first-gen/packages/badge/test/badge.a11y.spec.ts-snapshots/*.aria.yml
  • first-gen/packages/status-light/test/status-light.a11y.spec.ts-snapshots/*.aria.yml
  • second-gen/packages/swc/components/badge/test/badge.a11y.spec.ts-snapshots/*.aria.yml
  • second-gen/packages/swc/components/status-light/test/status-light.a11y.spec.ts-snapshots/*.aria.yml

Motivation and Context

Problem: Manual accessibility testing is time-consuming and inconsistent. Regressions can slip through unnoticed.

Solution: Automated testing catches accessibility issues early in development and serves as executable documentation of expected behavior.

Approach: This POC demonstrates the pattern on Badge and Status Light components across both 1st and 2nd generation. If approved, the pattern can be applied to all components.

Technical Decisions

1. WCAG-only scanning

  • Excludes best-practice rules (e.g., "page must have h1")
  • Focuses on WCAG 2.0/2.1 Level A/AA compliance
  • Reasoning: We test isolated components in Storybook, not full pages

2. Deterministic waits

  • Custom gotoStory() helper waits for specific conditions
  • No arbitrary timeouts or waitForLoadState('networkidle')
  • Faster, more reliable than waiting for network idle

3. Playwright projects for dual-generation support

  • Separate configurations for 1st gen (port 8080) and 2nd gen (port 6006)
  • Allows running tests independently or together
  • Auto-starts both Storybook instances as needed

4. Collocated tests

  • Tests live in each component's test/ directory
  • Follows existing test organization patterns
  • Easier discovery and maintenance

5. Shared, generation-agnostic helpers

  • Single helper library at first-gen/test/a11y-helpers.ts
  • Works for both 1st gen (sp-*) and 2nd gen (swc-*) components
  • No code duplication

Related Issue(s)

  • This is a proof-of-concept RFC for team discussion
  • No existing issue (greenfield implementation)

Author's Checklist

  • I have read the CONTRIBUTING and PULL_REQUESTS documents
  • I have reviewed the Accessibility Practices for this feature
  • I have added automated tests to cover my changes
  • I have included updated documentation

Reviewer's Checklist

Questions for Discussion

  1. Approach: Do ARIA snapshots + aXe validation provide the right balance?
  2. Coverage: Should we add these tests to all components or start with high-priority ones?
  3. CI Integration: How should these run in CI? (All PRs? Scheduled? On-demand?)
  4. Maintenance: Who owns keeping snapshots updated when designs change?
  5. Snapshot Management: ARIA snapshots are committed - is this the right approach?

Manual Testing

Verify tests run successfully:

  1. Clean environment: pkill -f "storybook"
  2. Run all tests: cd first-gen && yarn test:a11y
  3. Expected: 25 passing tests in ~30 seconds
  4. Verify both Storybooks auto-start (ports 8080 and 6006)

Review test outputs:

  1. Open HTML report: yarn playwright show-report
  2. Review ARIA snapshots in **/test/*-snapshots/ directories
  3. Verify human-readable YAML format

Try individual commands:

  • yarn test:a11y:1st - Should run 13 1st gen tests
  • yarn test:a11y:2nd - Should run 12 2nd gen tests
  • yarn test:a11y:ui - Should open Playwright UI
  • yarn test:a11y badge --update-snapshots - Update baselines

Review documentation:

  • Read ACCESSIBILITY_TESTING.md for comprehensive guide
  • Follow "Adding tests to a component" section
  • Verify examples are clear and copy-paste ready

Note: This is a POC for discussion. Not intended for immediate merge - seeking feedback on approach and implementation before broader rollout.

@cdransf cdransf self-assigned this Oct 28, 2025
@cdransf cdransf added the Status: WIP PR is a work in progress or draft label Oct 28, 2025
@changeset-bot
Copy link

changeset-bot bot commented Oct 28, 2025

⚠️ No Changeset found

Latest commit: 4f3b5ed

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@github-actions
Copy link
Contributor

github-actions bot commented Oct 28, 2025

📚 Branch Preview

🔍 Visual Regression Test Results

When a visual regression test fails (or has previously failed while working on this branch), its results can be found in the following URLs:

Deployed to Azure Blob Storage: pr-5835

If the changes are expected, update the current_golden_images_cache hash in the circleci config to accept the new images. Instructions are included in that file.
If the changes are unexpected, you can investigate the cause of the differences and update the code accordingly.

@github-actions
Copy link
Contributor

Tachometer results

Currently, no packages are changed by this PR...

@cdransf cdransf force-pushed the cdransf/a11y-testing-spike branch 7 times, most recently from 97fc1d7 to 0c06161 Compare October 28, 2025 20:08
…ight

Implements automated accessibility testing using two complementary approaches:

1. ARIA Snapshot Testing
   - Captures and validates accessibility tree structure
   - Detects unintended changes to component semantics
   - Serves as living documentation of expected a11y structure

2. aXe Rule Validation
   - Automated WCAG 2.0/2.1 Level A/AA compliance checking
   - Excludes best-practice rules (focused on component testing)
   - Validates color contrast, ARIA attributes, and more

Test Coverage (14/14 passing, ~6s runtime):
- Badge: default, icons, semantic variants, color contrast
- Status Light: sizes (s/m/l), disabled state, color contrast

Key Implementation Details:
- Integrated with existing Storybook stories (no duplication)
- Element visibility waits (reliable, fast)
- WCAG-only scanning (appropriate for isolated components)
- HTML report generation for debugging

Files Added:
- first-gen/playwright.config.ts - Playwright configuration
- first-gen/test/playwright-a11y/aria-snapshots.spec.ts - ARIA tests
- first-gen/test/playwright-a11y/axe-validation.spec.ts - aXe tests
- first-gen/test/playwright-a11y/README.md - Documentation
- RFC_A11Y_TESTING.md - Comprehensive RFC with scaling plan
- README.A11Y.md - Quick start guide

Usage:
  yarn test:a11y       # Run all accessibility tests
  yarn test:a11y:ui    # Open Playwright UI for debugging
  yarn test:a11y:1st   # Run only 1st gen
  yarn test:a11y:2nd   # Run only 2nd gen
@cdransf cdransf force-pushed the cdransf/a11y-testing-spike branch from 0c06161 to 1e47ff4 Compare October 28, 2025 20:10
@cdransf cdransf added Status: Ready for review PR ready for review or re-review. and removed Status: WIP PR is a work in progress or draft labels Oct 28, 2025
@cdransf cdransf added Status: WIP PR is a work in progress or draft and removed Status: Ready for review PR ready for review or re-review. labels Oct 28, 2025
@cdransf cdransf marked this pull request as ready for review October 28, 2025 20:56
@cdransf cdransf requested a review from a team as a code owner October 28, 2025 20:56
@cdransf cdransf added the Status: Ready for review PR ready for review or re-review. label Oct 28, 2025
@cdransf cdransf changed the title test: add Playwright accessibility testing POC for Badge and Status Light feat(testing): add Playwright accessibility testing POC for Badge and Status Light Oct 28, 2025
@cdransf cdransf marked this pull request as draft October 28, 2025 21:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Status: Ready for review PR ready for review or re-review. Status: WIP PR is a work in progress or draft

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants