Testing across the hierarchy
If guarantees do not survive composition, then neither does evidence. Each level of assembly needs its own evidence, of its own kind, and the level at which a claim was tested has to be stated alongside the claim.
Evidence per claim level
What can be automated falls away rapidly as the level rises, and what remains is exactly the part that decides whether the interface is usable.
| Level | Automatable | Requires human or AT evidence |
|---|---|---|
| Primitive | Role, name, state, contrast, target size, focusability | Little |
| Pattern | Required attributes and relationships, tab order within the widget | Keyboard grammar, announcement wording, AT variation |
| Compound | Duplicate identifiers, heading sequence, label association | Focus arbitration, announcement ordering, realistic content |
| Region | Landmark uniqueness, reflow at 320 CSS pixels | Reading order coherence, whether the region makes sense heard |
| Page | Page title, single main landmark, bypass mechanism, no duplicate identifiers | Whether the whole page is navigable and comprehensible non-visually |
| Process | Very little | Task completion, state retention, error recovery, timing, cognitive load |
The gradient is the point. Automation is nearly sufficient at the primitive level and nearly worthless at the process level, which is the level at which conformance is actually claimed.
A ten-step method
These steps run in order, and each one exists because it catches a class of failure the previous step cannot see.
- Component in isolation. Automated checks, keyboard walk, name and role verification, against the component’s declared guarantees.
- Component with hostile content. Long strings, empty values, missing alternatives, translations, user-generated markup, extreme density.
- Component in a realistic page. Real heading context, real landmarks, real siblings.
- Pairwise composition. Test known collision pairs deliberately: dialog with combobox, grid in tabpanel, form with live-region status, sticky header with in-page links.
- Region assembly. Focus arbitration, announcement ordering and coalescing, keyboard grammar resolution.
- Page assembly. Landmark uniqueness, tab order across the page, heading outline, reflow at 320 CSS pixels, 200% text, 400% zoom, text-spacing overrides, forced colours.
- Process assembly. Task completion by keyboard alone, by screen reader, and by speech input; data retention across steps; error recovery; timing.
- Assistive technology matrix. Per browser and screen reader combination, per platform, with results recorded per combination rather than collapsed to a single verdict.
- Override and escape-hatch regression. Every documented override retested for the guarantees it is known to touch.
- Profile variation. Each supported capability and preference profile exercised, since a variant selected for one profile is untested for another.
Step 4 is the one most likely to be skipped and the one that pays back fastest. The collision pairs are a short, enumerable list, and they are where the compositional bugs actually live.
What the tools reach
The tooling is real and useful. It is also almost entirely concentrated at the levels where the failures are least interesting.
| Tool | Reaches | Does not reach |
|---|---|---|
| axe-core | Rule-based checks on a rendered tree, at any level | Focus arbitration, announcement ordering, keyboard grammar, comprehension |
| Playwright and axe-core/playwright | Real browser, keyboard simulation, viewport and zoom variation, per-state scans | Actual assistive technology behaviour |
| Storybook test addon | Per-component and per-story checks in CI | Page and process assembly, by construction |
| Accessibility Insights and IBM Equal Access | Guided manual assessment, tab-order and landmark visualisation | Unattended regression at scale |
| ARIA-AT | Standardised expectations for screen reader behaviour on APG patterns | Arbitrary compositions and bespoke compounds |
ARIA-AT is the most significant of these for the argument in this section, because it is the only project that attempts to make screen reader behaviour testable at all rather than merely reportable. It is also scoped to patterns, which is precisely the level at which composition has not yet happened.
The hard limit
Component-level green is not evidence for the page.
Every component passing every automated check is compatible with a page that is unusable, and this is not a hypothetical. It is the predictable consequence of the eight failure modes: each of them lives in the relationships between components, and automated component-level rules examine components.
This is why a design system has to hold evidence scoped to a level and an environment, and why the level of the claim has to be recorded next to the claim. “This component is accessible” is not a false statement so much as an incomplete one: it omits the level at which it was established, the content it was established with, and the assistive technology it was established on.
References
- Deque Systems. axe-core API documentation. doc/API.md
- Deque Systems. axe-core/playwright integration. packages/playwright
- Playwright. Accessibility testing. docs/accessibility-testing
- Storybook. Accessibility tests. writing-tests/accessibility-testing
- Microsoft. Accessibility Insights. accessibilityinsights.io
- IBM. IBM Accessibility: toolkit tools. toolkit/tools
- W3C. ARIA-AT. aria-at.w3.org