qa-skills 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +168 -0
- package/bin/cli.js +42 -0
- package/dist/agents/registry.d.ts +5 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +101 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/types.d.ts +9 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/dependencies.d.ts +21 -0
- package/dist/dependencies.d.ts.map +1 -0
- package/dist/dependencies.js +125 -0
- package/dist/dependencies.js.map +1 -0
- package/dist/installer.d.ts +25 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +437 -0
- package/dist/installer.js.map +1 -0
- package/dist/scaffold.d.ts +27 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +182 -0
- package/dist/scaffold.js.map +1 -0
- package/package.json +40 -0
- package/skills/qa-accessibility-test-writer/SKILL.md +127 -0
- package/skills/qa-accessibility-test-writer/references/axe-core-patterns.md +349 -0
- package/skills/qa-accessibility-test-writer/references/best-practices.md +184 -0
- package/skills/qa-accessibility-test-writer/references/wcag-tests.md +331 -0
- package/skills/qa-api-contract-curator/SKILL.md +104 -0
- package/skills/qa-api-contract-curator/references/breaking-changes.md +363 -0
- package/skills/qa-api-contract-curator/references/openapi-structure.md +404 -0
- package/skills/qa-browser-data-collector/SKILL.md +132 -0
- package/skills/qa-browser-data-collector/references/data-collection-checklist.md +91 -0
- package/skills/qa-browser-data-collector/references/playwright-mcp-patterns.md +113 -0
- package/skills/qa-bug-ticket-creator/SKILL.md +148 -0
- package/skills/qa-bug-ticket-creator/references/bug-report-format.md +149 -0
- package/skills/qa-bug-ticket-creator/references/severity-guide.md +81 -0
- package/skills/qa-bug-ticket-creator/templates/bug-ticket-template.md +39 -0
- package/skills/qa-changelog-analyzer/SKILL.md +134 -0
- package/skills/qa-changelog-analyzer/references/git-analysis-patterns.md +138 -0
- package/skills/qa-changelog-analyzer/references/impact-mapping.md +120 -0
- package/skills/qa-clickup-integration/SKILL.md +166 -0
- package/skills/qa-clickup-integration/references/api-patterns.md +102 -0
- package/skills/qa-clickup-integration/references/field-mapping.md +71 -0
- package/skills/qa-codeceptjs-writer/SKILL.md +136 -0
- package/skills/qa-codeceptjs-writer/references/best-practices.md +207 -0
- package/skills/qa-codeceptjs-writer/references/config.md +255 -0
- package/skills/qa-codeceptjs-writer/references/patterns.md +285 -0
- package/skills/qa-coverage-analyzer/SKILL.md +166 -0
- package/skills/qa-coverage-analyzer/references/best-practices.md +142 -0
- package/skills/qa-coverage-analyzer/references/coverage-dimensions.md +155 -0
- package/skills/qa-coverage-analyzer/references/tools.md +204 -0
- package/skills/qa-cypress-writer/SKILL.md +134 -0
- package/skills/qa-cypress-writer/references/assertions.md +121 -0
- package/skills/qa-cypress-writer/references/best-practices.md +82 -0
- package/skills/qa-cypress-writer/references/config.md +121 -0
- package/skills/qa-cypress-writer/references/patterns.md +170 -0
- package/skills/qa-data-factory/SKILL.md +126 -0
- package/skills/qa-data-factory/references/factory-patterns.md +164 -0
- package/skills/qa-data-factory/references/faker-guide.md +131 -0
- package/skills/qa-diagram-generator/SKILL.md +125 -0
- package/skills/qa-diagram-generator/references/c4-model.md +53 -0
- package/skills/qa-diagram-generator/references/charts.md +58 -0
- package/skills/qa-diagram-generator/references/class-diagram.md +85 -0
- package/skills/qa-diagram-generator/references/er-diagram.md +69 -0
- package/skills/qa-diagram-generator/references/flowchart.md +92 -0
- package/skills/qa-diagram-generator/references/from-screenshot.md +45 -0
- package/skills/qa-diagram-generator/references/gantt.md +49 -0
- package/skills/qa-diagram-generator/references/journey.md +50 -0
- package/skills/qa-diagram-generator/references/mindmap.md +75 -0
- package/skills/qa-diagram-generator/references/sequence.md +69 -0
- package/skills/qa-diagram-generator/references/state-diagram.md +56 -0
- package/skills/qa-discovery-interview/SKILL.md +182 -0
- package/skills/qa-discovery-interview/references/completeness-checklist.md +53 -0
- package/skills/qa-discovery-interview/references/conflict-patterns.md +101 -0
- package/skills/qa-discovery-interview/references/qa-categories.md +147 -0
- package/skills/qa-discovery-interview/templates/qa-brief-template.md +168 -0
- package/skills/qa-environment-checker/SKILL.md +142 -0
- package/skills/qa-environment-checker/references/dependency-matrix.md +101 -0
- package/skills/qa-environment-checker/references/health-checks.md +209 -0
- package/skills/qa-environment-checker/templates/env-readiness-template.md +64 -0
- package/skills/qa-flaky-detector/SKILL.md +153 -0
- package/skills/qa-flaky-detector/references/ci-analysis.md +140 -0
- package/skills/qa-flaky-detector/references/flaky-patterns.md +247 -0
- package/skills/qa-github-issues-enhanced/SKILL.md +175 -0
- package/skills/qa-github-issues-enhanced/references/issue-templates.md +425 -0
- package/skills/qa-github-issues-enhanced/references/label-taxonomy.md +130 -0
- package/skills/qa-github-issues-enhanced/references/workflow-patterns.md +188 -0
- package/skills/qa-httpx-writer/SKILL.md +138 -0
- package/skills/qa-httpx-writer/references/assertions.md +195 -0
- package/skills/qa-httpx-writer/references/best-practices.md +140 -0
- package/skills/qa-httpx-writer/references/config.md +212 -0
- package/skills/qa-httpx-writer/references/patterns.md +262 -0
- package/skills/qa-jest-writer/SKILL.md +131 -0
- package/skills/qa-jest-writer/references/assertions.md +125 -0
- package/skills/qa-jest-writer/references/best-practices.md +136 -0
- package/skills/qa-jest-writer/references/config.md +134 -0
- package/skills/qa-jest-writer/references/patterns.md +172 -0
- package/skills/qa-jira-integration/SKILL.md +135 -0
- package/skills/qa-jira-integration/references/api-patterns.md +143 -0
- package/skills/qa-jira-integration/references/field-mapping.md +79 -0
- package/skills/qa-jira-integration/references/xray-integration.md +85 -0
- package/skills/qa-jmeter-writer/SKILL.md +171 -0
- package/skills/qa-jmeter-writer/references/best-practices.md +157 -0
- package/skills/qa-jmeter-writer/references/config.md +204 -0
- package/skills/qa-jmeter-writer/references/patterns.md +242 -0
- package/skills/qa-junit5-writer/SKILL.md +157 -0
- package/skills/qa-junit5-writer/references/assertions.md +118 -0
- package/skills/qa-junit5-writer/references/config.md +97 -0
- package/skills/qa-junit5-writer/references/patterns.md +162 -0
- package/skills/qa-k6-writer/SKILL.md +155 -0
- package/skills/qa-k6-writer/references/best-practices.md +236 -0
- package/skills/qa-k6-writer/references/config.md +219 -0
- package/skills/qa-k6-writer/references/patterns.md +304 -0
- package/skills/qa-linear-integration/SKILL.md +137 -0
- package/skills/qa-linear-integration/references/api-patterns.md +249 -0
- package/skills/qa-linear-integration/references/field-mapping.md +121 -0
- package/skills/qa-locust-writer/SKILL.md +151 -0
- package/skills/qa-locust-writer/references/best-practices.md +126 -0
- package/skills/qa-locust-writer/references/config.md +170 -0
- package/skills/qa-locust-writer/references/patterns.md +235 -0
- package/skills/qa-manual-test-designer/SKILL.md +145 -0
- package/skills/qa-manual-test-designer/references/exploratory-charters.md +138 -0
- package/skills/qa-manual-test-designer/references/personas.md +146 -0
- package/skills/qa-manual-test-designer/templates/exploratory-charter-template.md +47 -0
- package/skills/qa-manual-test-designer/templates/test-case-template.md +31 -0
- package/skills/qa-mobile-test-writer/SKILL.md +144 -0
- package/skills/qa-mobile-test-writer/references/best-practices.md +214 -0
- package/skills/qa-mobile-test-writer/references/config.md +309 -0
- package/skills/qa-mobile-test-writer/references/patterns.md +304 -0
- package/skills/qa-nfr-analyst/SKILL.md +177 -0
- package/skills/qa-nfr-analyst/references/iso-25010-model.md +159 -0
- package/skills/qa-nfr-analyst/references/owasp-wstg-baseline.md +202 -0
- package/skills/qa-nfr-analyst/references/wcag-checklist.md +184 -0
- package/skills/qa-nfr-analyst/templates/owasp-checklist-template.md +89 -0
- package/skills/qa-nfr-analyst/templates/wcag-checklist-template.md +48 -0
- package/skills/qa-orchestrator/SKILL.md +132 -0
- package/skills/qa-orchestrator/references/handoff-chains.md +105 -0
- package/skills/qa-orchestrator/references/pipeline-modes.md +115 -0
- package/skills/qa-orchestrator/references/scheduler-rules.md +84 -0
- package/skills/qa-pact-writer/SKILL.md +133 -0
- package/skills/qa-pact-writer/references/best-practices.md +100 -0
- package/skills/qa-pact-writer/references/config.md +135 -0
- package/skills/qa-pact-writer/references/patterns.md +161 -0
- package/skills/qa-plan-creator/SKILL.md +139 -0
- package/skills/qa-plan-creator/references/introduction-plan.md +43 -0
- package/skills/qa-plan-creator/references/migration-plan.md +44 -0
- package/skills/qa-plan-creator/references/onboarding-plan.md +46 -0
- package/skills/qa-plan-creator/references/performance-plan.md +44 -0
- package/skills/qa-plan-creator/references/regression-plan.md +45 -0
- package/skills/qa-plan-creator/references/release-plan.md +45 -0
- package/skills/qa-plan-creator/references/sprint-plan.md +44 -0
- package/skills/qa-plan-creator/references/test-plan.md +59 -0
- package/skills/qa-plan-creator/references/uat-plan.md +43 -0
- package/skills/qa-plan-creator/templates/checklist-template.md +36 -0
- package/skills/qa-plan-creator/templates/regression-checklist-template.md +49 -0
- package/skills/qa-plan-creator/templates/release-checklist-template.md +46 -0
- package/skills/qa-plan-creator/templates/test-plan-template.md +74 -0
- package/skills/qa-playwright-py-writer/SKILL.md +156 -0
- package/skills/qa-playwright-py-writer/references/best-practices.md +194 -0
- package/skills/qa-playwright-py-writer/references/config.md +195 -0
- package/skills/qa-playwright-py-writer/references/patterns.md +212 -0
- package/skills/qa-playwright-ts-writer/SKILL.md +151 -0
- package/skills/qa-playwright-ts-writer/references/assertions.md +109 -0
- package/skills/qa-playwright-ts-writer/references/best-practices.md +191 -0
- package/skills/qa-playwright-ts-writer/references/config.md +144 -0
- package/skills/qa-playwright-ts-writer/references/patterns.md +171 -0
- package/skills/qa-pytest-writer/SKILL.md +145 -0
- package/skills/qa-pytest-writer/references/assertions.md +149 -0
- package/skills/qa-pytest-writer/references/best-practices.md +97 -0
- package/skills/qa-pytest-writer/references/config.md +176 -0
- package/skills/qa-pytest-writer/references/patterns.md +251 -0
- package/skills/qa-qase-integration/SKILL.md +149 -0
- package/skills/qa-qase-integration/references/api-reference.md +354 -0
- package/skills/qa-qase-integration/references/ci-integration.md +196 -0
- package/skills/qa-qase-integration/references/field-mapping.md +157 -0
- package/skills/qa-requirements-generator/SKILL.md +152 -0
- package/skills/qa-requirements-generator/references/iso-29148-structure.md +153 -0
- package/skills/qa-requirements-generator/references/requirement-patterns.md +278 -0
- package/skills/qa-rest-assured-writer/SKILL.md +137 -0
- package/skills/qa-rest-assured-writer/references/best-practices.md +50 -0
- package/skills/qa-rest-assured-writer/references/config.md +124 -0
- package/skills/qa-rest-assured-writer/references/patterns.md +192 -0
- package/skills/qa-risk-analyzer/SKILL.md +158 -0
- package/skills/qa-risk-analyzer/references/impact-analysis.md +133 -0
- package/skills/qa-risk-analyzer/references/risk-factors.md +123 -0
- package/skills/qa-robot-framework-writer/SKILL.md +147 -0
- package/skills/qa-robot-framework-writer/references/best-practices.md +249 -0
- package/skills/qa-robot-framework-writer/references/config.md +204 -0
- package/skills/qa-robot-framework-writer/references/libraries.md +273 -0
- package/skills/qa-robot-framework-writer/references/patterns.md +216 -0
- package/skills/qa-security-test-writer/SKILL.md +123 -0
- package/skills/qa-security-test-writer/references/best-practices.md +155 -0
- package/skills/qa-security-test-writer/references/owasp-top10.md +331 -0
- package/skills/qa-security-test-writer/references/zap-config.md +258 -0
- package/skills/qa-selenium-java-writer/SKILL.md +143 -0
- package/skills/qa-selenium-java-writer/references/best-practices.md +59 -0
- package/skills/qa-selenium-java-writer/references/config.md +143 -0
- package/skills/qa-selenium-java-writer/references/patterns.md +170 -0
- package/skills/qa-selenium-py-writer/SKILL.md +150 -0
- package/skills/qa-selenium-py-writer/references/best-practices.md +175 -0
- package/skills/qa-selenium-py-writer/references/config.md +224 -0
- package/skills/qa-selenium-py-writer/references/patterns.md +255 -0
- package/skills/qa-shortcut-integration/SKILL.md +143 -0
- package/skills/qa-shortcut-integration/references/api-patterns.md +126 -0
- package/skills/qa-shortcut-integration/references/field-mapping.md +66 -0
- package/skills/qa-spec-auditor/SKILL.md +162 -0
- package/skills/qa-spec-auditor/references/audit-checklist.md +144 -0
- package/skills/qa-spec-auditor/references/drift-patterns.md +207 -0
- package/skills/qa-spec-writer/SKILL.md +143 -0
- package/skills/qa-spec-writer/references/gherkin-guide.md +253 -0
- package/skills/qa-spec-writer/references/specification-patterns.md +274 -0
- package/skills/qa-spring-test-writer/SKILL.md +170 -0
- package/skills/qa-spring-test-writer/references/best-practices.md +57 -0
- package/skills/qa-spring-test-writer/references/config.md +179 -0
- package/skills/qa-spring-test-writer/references/patterns.md +235 -0
- package/skills/qa-supertest-writer/SKILL.md +150 -0
- package/skills/qa-supertest-writer/references/assertions.md +192 -0
- package/skills/qa-supertest-writer/references/best-practices.md +102 -0
- package/skills/qa-supertest-writer/references/config.md +166 -0
- package/skills/qa-supertest-writer/references/patterns.md +242 -0
- package/skills/qa-task-creator/SKILL.md +142 -0
- package/skills/qa-task-creator/references/linking-patterns.md +127 -0
- package/skills/qa-task-creator/references/task-types.md +169 -0
- package/skills/qa-task-creator/templates/task-template.md +24 -0
- package/skills/qa-test-doc-compiler/SKILL.md +114 -0
- package/skills/qa-test-doc-compiler/references/agile-tailoring.md +220 -0
- package/skills/qa-test-doc-compiler/references/iso-29119-3-documents.md +302 -0
- package/skills/qa-test-healer/SKILL.md +101 -0
- package/skills/qa-test-healer/references/diagnosis-patterns.md +142 -0
- package/skills/qa-test-healer/references/fix-strategies.md +177 -0
- package/skills/qa-test-reporter/SKILL.md +130 -0
- package/skills/qa-test-reporter/references/best-practices.md +162 -0
- package/skills/qa-test-reporter/references/iso-29119-reports.md +236 -0
- package/skills/qa-test-reporter/references/report-formats.md +287 -0
- package/skills/qa-test-reviewer/SKILL.md +142 -0
- package/skills/qa-test-reviewer/references/anti-patterns.md +268 -0
- package/skills/qa-test-reviewer/references/review-checklist.md +93 -0
- package/skills/qa-test-strategy/SKILL.md +133 -0
- package/skills/qa-test-strategy/references/entry-exit-criteria.md +176 -0
- package/skills/qa-test-strategy/references/risk-matrix.md +102 -0
- package/skills/qa-test-strategy/references/testing-types.md +143 -0
- package/skills/qa-testcase-from-docs/SKILL.md +161 -0
- package/skills/qa-testcase-from-docs/references/test-case-format.md +196 -0
- package/skills/qa-testcase-from-docs/references/test-design-techniques.md +126 -0
- package/skills/qa-testcase-from-docs/templates/test-case-template.md +31 -0
- package/skills/qa-testcase-from-ui/SKILL.md +109 -0
- package/skills/qa-testcase-from-ui/references/ui-element-patterns.md +126 -0
- package/skills/qa-testcase-from-ui/references/visual-analysis-guide.md +146 -0
- package/skills/qa-testcase-from-ui/templates/test-case-template.md +31 -0
- package/skills/qa-visual-regression-writer/SKILL.md +175 -0
- package/skills/qa-visual-regression-writer/references/best-practices.md +154 -0
- package/skills/qa-visual-regression-writer/references/config.md +220 -0
- package/skills/qa-visual-regression-writer/references/patterns.md +213 -0
- package/skills/qa-vitest-writer/SKILL.md +141 -0
- package/skills/qa-vitest-writer/references/assertions.md +105 -0
- package/skills/qa-vitest-writer/references/best-practices.md +62 -0
- package/skills/qa-vitest-writer/references/config.md +127 -0
- package/skills/qa-vitest-writer/references/patterns.md +141 -0
- package/skills/qa-webdriverio-writer/SKILL.md +145 -0
- package/skills/qa-webdriverio-writer/references/best-practices.md +176 -0
- package/skills/qa-webdriverio-writer/references/config.md +240 -0
- package/skills/qa-webdriverio-writer/references/patterns.md +269 -0
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
# axe-core Integration Patterns
|
|
2
|
+
|
|
3
|
+
Integration patterns for axe-core with Playwright, Cypress, and Jest. Use with qa-accessibility-test-writer when generating accessibility tests.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Playwright + @axe-core/playwright
|
|
8
|
+
|
|
9
|
+
### Installation
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install -D @axe-core/playwright
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### Basic Usage
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { test, expect } from '@playwright/test';
|
|
19
|
+
import AxeBuilder from '@axe-core/playwright';
|
|
20
|
+
|
|
21
|
+
test('page has no accessibility violations', async ({ page }) => {
|
|
22
|
+
await page.goto('/');
|
|
23
|
+
const results = await new AxeBuilder({ page }).analyze();
|
|
24
|
+
|
|
25
|
+
expect(results.violations).toEqual([]);
|
|
26
|
+
});
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### With WCAG Tags
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
test('meets WCAG 2.2 AA', async ({ page }) => {
|
|
33
|
+
await page.goto('/dashboard');
|
|
34
|
+
const results = await new AxeBuilder({ page })
|
|
35
|
+
.withTags(['wcag2a', 'wcag2aa'])
|
|
36
|
+
.analyze();
|
|
37
|
+
|
|
38
|
+
expect(results.violations).toEqual([]);
|
|
39
|
+
});
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Scoped to Selector
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
test('main content is accessible', async ({ page }) => {
|
|
46
|
+
await page.goto('/');
|
|
47
|
+
const results = await new AxeBuilder({ page })
|
|
48
|
+
.include('main')
|
|
49
|
+
.exclude('.ad-banner')
|
|
50
|
+
.analyze();
|
|
51
|
+
|
|
52
|
+
expect(results.violations).toEqual([]);
|
|
53
|
+
});
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Disable Specific Rules
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
test('page accessible excluding color-contrast', async ({ page }) => {
|
|
60
|
+
await page.goto('/');
|
|
61
|
+
const results = await new AxeBuilder({ page })
|
|
62
|
+
.disableRules(['color-contrast'])
|
|
63
|
+
.analyze();
|
|
64
|
+
|
|
65
|
+
expect(results.violations).toEqual([]);
|
|
66
|
+
});
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Shadow DOM
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
test('component with shadow DOM', async ({ page }) => {
|
|
73
|
+
await page.goto('/web-components');
|
|
74
|
+
const results = await new AxeBuilder({ page })
|
|
75
|
+
.include(['#app', ['#shadow-host', '#shadow-root']])
|
|
76
|
+
.analyze();
|
|
77
|
+
|
|
78
|
+
expect(results.violations).toEqual([]);
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Assert with toPassAxe (if available)
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
import { expect } from '@playwright/test';
|
|
86
|
+
import { toPassAxe } from 'axe-playwright';
|
|
87
|
+
|
|
88
|
+
test.extend({ toPassAxe })('page passes axe', async ({ page, toPassAxe }) => {
|
|
89
|
+
await page.goto('/');
|
|
90
|
+
await expect(page).toPassAxe();
|
|
91
|
+
});
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Cypress + cypress-axe
|
|
97
|
+
|
|
98
|
+
### Installation
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
npm install -D cypress-axe axe-core
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Configuration (cypress/support/e2e.ts)
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
import 'cypress-axe';
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Basic Usage
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
describe('Accessibility', () => {
|
|
114
|
+
beforeEach(() => {
|
|
115
|
+
cy.visit('/');
|
|
116
|
+
cy.injectAxe();
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('has no violations', () => {
|
|
120
|
+
cy.checkA11y();
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('main content has no violations', () => {
|
|
124
|
+
cy.checkA11y('main');
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### With WCAG Tags
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
it('meets WCAG 2.2 AA', () => {
|
|
133
|
+
cy.checkA11y(null, {
|
|
134
|
+
runOnly: {
|
|
135
|
+
type: 'tag',
|
|
136
|
+
values: ['wcag2a', 'wcag2aa'],
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### With Specific Rules
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
it('checks critical rules only', () => {
|
|
146
|
+
cy.checkA11y(null, {
|
|
147
|
+
runOnly: {
|
|
148
|
+
type: 'rule',
|
|
149
|
+
values: ['color-contrast', 'label', 'button-name', 'image-alt'],
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Exclude Elements
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
it('excludes third-party widget', () => {
|
|
159
|
+
cy.checkA11y(null, {
|
|
160
|
+
exclude: [['.third-party-widget']],
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Custom Violation Callback
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
it('logs violations', () => {
|
|
169
|
+
cy.checkA11y(null, null, (violations) => {
|
|
170
|
+
violations.forEach((v) => {
|
|
171
|
+
cy.task('log', `${v.id}: ${v.help}`);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Wait for Dynamic Content
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
it('checks after content loads', () => {
|
|
181
|
+
cy.get('[data-cy="dynamic-content"]').should('be.visible');
|
|
182
|
+
cy.injectAxe();
|
|
183
|
+
cy.checkA11y();
|
|
184
|
+
});
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Jest + jest-axe
|
|
190
|
+
|
|
191
|
+
### Installation
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
npm install -D jest-axe @testing-library/react @testing-library/dom
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Basic Usage (React Testing Library)
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
import { render, screen } from '@testing-library/react';
|
|
201
|
+
import { axe, toHaveNoViolations } from 'jest-axe';
|
|
202
|
+
import { Button } from './Button';
|
|
203
|
+
|
|
204
|
+
expect.extend(toHaveNoViolations);
|
|
205
|
+
|
|
206
|
+
test('Button has no accessibility violations', async () => {
|
|
207
|
+
const { container } = render(<Button>Click me</Button>);
|
|
208
|
+
const results = await axe(container);
|
|
209
|
+
expect(results).toHaveNoViolations();
|
|
210
|
+
});
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### With Options
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
test('Button meets WCAG AA', async () => {
|
|
217
|
+
const { container } = render(<Button>Click me</Button>);
|
|
218
|
+
const results = await axe(container, {
|
|
219
|
+
runOnly: {
|
|
220
|
+
type: 'tag',
|
|
221
|
+
values: ['wcag2a', 'wcag2aa'],
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
expect(results).toHaveNoViolations();
|
|
225
|
+
});
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### Scoped to Element
|
|
229
|
+
|
|
230
|
+
```typescript
|
|
231
|
+
test('form is accessible', async () => {
|
|
232
|
+
const { container } = render(<SignupForm />);
|
|
233
|
+
const form = container.querySelector('form');
|
|
234
|
+
const results = await axe(form!);
|
|
235
|
+
expect(results).toHaveNoViolations();
|
|
236
|
+
});
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Disable Rules
|
|
240
|
+
|
|
241
|
+
```typescript
|
|
242
|
+
test('component without color-contrast check', async () => {
|
|
243
|
+
const { container } = render(<Chart />);
|
|
244
|
+
const results = await axe(container, {
|
|
245
|
+
rules: { 'color-contrast': { enabled: false } },
|
|
246
|
+
});
|
|
247
|
+
expect(results).toHaveNoViolations();
|
|
248
|
+
});
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## Pa11y (CLI + Node API)
|
|
254
|
+
|
|
255
|
+
### CLI
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
npm install -g pa11y
|
|
259
|
+
|
|
260
|
+
pa11y https://example.com
|
|
261
|
+
pa11y https://example.com --standard WCAG2AA
|
|
262
|
+
pa11y https://example.com --include-notices --include-warnings
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Node API
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
import pa11y from 'pa11y';
|
|
269
|
+
|
|
270
|
+
const results = await pa11y('https://example.com', {
|
|
271
|
+
standard: 'WCAG2AA',
|
|
272
|
+
includeWarnings: true,
|
|
273
|
+
runners: ['axe'],
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
console.log(results.issues);
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### With Puppeteer (for SPAs)
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
import pa11y from 'pa11y';
|
|
283
|
+
import puppeteer from 'puppeteer';
|
|
284
|
+
|
|
285
|
+
const browser = await puppeteer.launch();
|
|
286
|
+
const page = await browser.newPage();
|
|
287
|
+
await page.goto('https://example.com', { waitUntil: 'networkidle0' });
|
|
288
|
+
|
|
289
|
+
const results = await pa11y(await page.content(), {
|
|
290
|
+
standard: 'WCAG2AA',
|
|
291
|
+
page,
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
await browser.close();
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## Lighthouse (Chrome DevTools Protocol)
|
|
300
|
+
|
|
301
|
+
### Playwright Integration
|
|
302
|
+
|
|
303
|
+
```typescript
|
|
304
|
+
import { test } from '@playwright/test';
|
|
305
|
+
import { playAudit } from 'playwright-lighthouse';
|
|
306
|
+
|
|
307
|
+
test('Lighthouse accessibility score', async ({ page }) => {
|
|
308
|
+
await page.goto('/');
|
|
309
|
+
await playAudit({
|
|
310
|
+
page,
|
|
311
|
+
thresholds: {
|
|
312
|
+
performance: 80,
|
|
313
|
+
accessibility: 90,
|
|
314
|
+
'best-practices': 80,
|
|
315
|
+
seo: 80,
|
|
316
|
+
},
|
|
317
|
+
port: 9222,
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### Lighthouse CLI
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
npx lighthouse https://example.com --only-categories=accessibility --output=json
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
## Rule Tags Reference
|
|
331
|
+
|
|
332
|
+
| Tag | Description |
|
|
333
|
+
|-----|-------------|
|
|
334
|
+
| `wcag2a` | WCAG 2.2 Level A |
|
|
335
|
+
| `wcag2aa` | WCAG 2.2 Level AA |
|
|
336
|
+
| `wcag2aaa` | WCAG 2.2 Level AAA |
|
|
337
|
+
| `best-practice` | Best practice recommendations |
|
|
338
|
+
| `ACT` | W3C ACT rules |
|
|
339
|
+
| `section508` | Section 508 |
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## References
|
|
344
|
+
|
|
345
|
+
- [axe-core GitHub](https://github.com/dequelabs/axe-core)
|
|
346
|
+
- [@axe-core/playwright](https://github.com/dequelabs/axe-core-npm/tree/develop/packages/playwright)
|
|
347
|
+
- [cypress-axe](https://github.com/component-driven/cypress-axe)
|
|
348
|
+
- [jest-axe](https://github.com/nickcolley/jest-axe)
|
|
349
|
+
- [Pa11y](https://pa11y.org/)
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# Accessibility Testing Best Practices
|
|
2
|
+
|
|
3
|
+
Best practices for automated and manual accessibility testing. Use with qa-accessibility-test-writer when generating tests and planning audits.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Automated vs Manual Testing
|
|
8
|
+
|
|
9
|
+
### What Automation Covers
|
|
10
|
+
|
|
11
|
+
| Category | Automated | Manual |
|
|
12
|
+
|----------|-----------|--------|
|
|
13
|
+
| Color contrast | ✓ | ✓ (verify in context) |
|
|
14
|
+
| Alt text presence | ✓ | ✓ (verify accuracy) |
|
|
15
|
+
| ARIA validity | ✓ | ✓ (verify semantics) |
|
|
16
|
+
| Keyboard operability | Partial | ✓ |
|
|
17
|
+
| Focus order | Partial | ✓ |
|
|
18
|
+
| Screen reader experience | ✗ | ✓ |
|
|
19
|
+
| Cognitive load | ✗ | ✓ |
|
|
20
|
+
| Motion sensitivity | ✗ | ✓ |
|
|
21
|
+
|
|
22
|
+
### Recommended Mix
|
|
23
|
+
|
|
24
|
+
1. **Automated first** — axe-core, Pa11y, Lighthouse on every build
|
|
25
|
+
2. **Manual keyboard** — Tab through critical flows (login, checkout, forms)
|
|
26
|
+
3. **Manual screen reader** — NVDA/JAWS (Windows), VoiceOver (macOS/iOS), TalkBack (Android)
|
|
27
|
+
4. **Manual spot checks** — Color contrast in context, zoom to 200%, reduced motion
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Screen Reader Testing
|
|
32
|
+
|
|
33
|
+
### Tools
|
|
34
|
+
|
|
35
|
+
| Platform | Screen Reader | Notes |
|
|
36
|
+
|----------|---------------|-------|
|
|
37
|
+
| Windows | NVDA (free) | Most common for testing |
|
|
38
|
+
| Windows | JAWS | Commercial; often required for compliance |
|
|
39
|
+
| macOS | VoiceOver | Built-in; Cmd+F5 |
|
|
40
|
+
| iOS | VoiceOver | Built-in; triple-click Home/Side |
|
|
41
|
+
| Android | TalkBack | Built-in |
|
|
42
|
+
|
|
43
|
+
### Key Scenarios
|
|
44
|
+
|
|
45
|
+
1. **Landmarks** — Can user jump between main, nav, footer?
|
|
46
|
+
2. **Headings** — Can user navigate by heading level?
|
|
47
|
+
3. **Forms** — Are labels announced? Are errors announced?
|
|
48
|
+
4. **Dynamic content** — Are live regions (`aria-live`) announced?
|
|
49
|
+
5. **Custom widgets** — Do dialogs, tabs, accordions have correct roles and states?
|
|
50
|
+
|
|
51
|
+
### Testing Workflow
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
1. Unplug mouse; use keyboard only
|
|
55
|
+
2. Turn on screen reader
|
|
56
|
+
3. Navigate page from top (headings, landmarks, links)
|
|
57
|
+
4. Complete critical user flow (e.g., add to cart, checkout)
|
|
58
|
+
5. Note: missing labels, wrong order, unannounced updates
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Keyboard Testing
|
|
64
|
+
|
|
65
|
+
### Essential Keys
|
|
66
|
+
|
|
67
|
+
| Key | Purpose |
|
|
68
|
+
|-----|---------|
|
|
69
|
+
| Tab | Move forward through focusable elements |
|
|
70
|
+
| Shift+Tab | Move backward |
|
|
71
|
+
| Enter | Activate links, buttons |
|
|
72
|
+
| Space | Toggle checkboxes, activate buttons |
|
|
73
|
+
| Arrow keys | Navigate within components (tabs, menus, sliders) |
|
|
74
|
+
| Escape | Close modals, cancel |
|
|
75
|
+
|
|
76
|
+
### Checklist
|
|
77
|
+
|
|
78
|
+
- [ ] All interactive elements reachable via Tab
|
|
79
|
+
- [ ] No keyboard traps (can always Tab out)
|
|
80
|
+
- [ ] Focus order matches visual order
|
|
81
|
+
- [ ] Focus indicator visible (outline or equivalent)
|
|
82
|
+
- [ ] Skip link works and targets main content
|
|
83
|
+
- [ ] Modals trap focus and return focus on close
|
|
84
|
+
- [ ] Dropdowns/menus operable with Arrow keys
|
|
85
|
+
|
|
86
|
+
### Common Failures
|
|
87
|
+
|
|
88
|
+
| Issue | Fix |
|
|
89
|
+
|-------|-----|
|
|
90
|
+
| Custom div not focusable | Add `tabindex="0"` and keyboard handlers |
|
|
91
|
+
| Focus lost after modal close | Store focused element; restore on close |
|
|
92
|
+
| No visible focus | Add `:focus-visible` styles |
|
|
93
|
+
| Wrong tab order | Use `tabindex` sparingly; fix DOM order |
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Color Contrast
|
|
98
|
+
|
|
99
|
+
### Requirements (WCAG 2.2)
|
|
100
|
+
|
|
101
|
+
| Level | Normal Text | Large Text |
|
|
102
|
+
|-------|-------------|------------|
|
|
103
|
+
| AA | 4.5:1 | 3:1 |
|
|
104
|
+
| AAA | 7:1 | 4.5:1 |
|
|
105
|
+
|
|
106
|
+
Large text = 18pt+ or 14pt+ bold.
|
|
107
|
+
|
|
108
|
+
### Tools
|
|
109
|
+
|
|
110
|
+
- **axe-core** — Automated contrast checks
|
|
111
|
+
- **WebAIM Contrast Checker** — Manual verification
|
|
112
|
+
- **Chrome DevTools** — Inspect element → Accessibility panel
|
|
113
|
+
|
|
114
|
+
### Edge Cases
|
|
115
|
+
|
|
116
|
+
- **Logos** — Exempt; no contrast requirement
|
|
117
|
+
- **Disabled elements** — No contrast requirement
|
|
118
|
+
- **Placeholder text** — Should meet 4.5:1 or have visible label
|
|
119
|
+
- **Focus indicators** — 3:1 against adjacent colors
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Form Accessibility
|
|
124
|
+
|
|
125
|
+
### Labels
|
|
126
|
+
|
|
127
|
+
- Every input has a visible `<label>` or `aria-label`
|
|
128
|
+
- Labels describe purpose; placeholders are supplementary
|
|
129
|
+
- Error messages linked via `aria-describedby` or `aria-errormessage`
|
|
130
|
+
|
|
131
|
+
### Error Handling
|
|
132
|
+
|
|
133
|
+
- Errors identified in text (not color alone)
|
|
134
|
+
- `aria-invalid="true"` on invalid fields
|
|
135
|
+
- `role="alert"` or `aria-live="assertive"` for error announcements
|
|
136
|
+
- Suggestions provided (3.3.3 Error Suggestion)
|
|
137
|
+
|
|
138
|
+
### Autocomplete
|
|
139
|
+
|
|
140
|
+
- Use `autocomplete` attribute for common fields (name, email, address)
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Testing in CI/CD
|
|
145
|
+
|
|
146
|
+
### Playwright Example
|
|
147
|
+
|
|
148
|
+
```yaml
|
|
149
|
+
# .github/workflows/a11y.yml
|
|
150
|
+
- name: Run accessibility tests
|
|
151
|
+
run: npx playwright test tests/accessibility/
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Thresholds
|
|
155
|
+
|
|
156
|
+
- **Zero violations** for WCAG 2.2 A/AA in critical paths
|
|
157
|
+
- **Lighthouse accessibility score** ≥ 90 for key pages
|
|
158
|
+
- **Allow known exceptions** via axe `disableRules` with documented rationale
|
|
159
|
+
|
|
160
|
+
### Reporting
|
|
161
|
+
|
|
162
|
+
- Store JSON/HTML reports as artifacts
|
|
163
|
+
- Fail build on new violations
|
|
164
|
+
- Track trends over time (e.g., Lighthouse CI)
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## When to Escalate
|
|
169
|
+
|
|
170
|
+
| Situation | Action |
|
|
171
|
+
|-----------|--------|
|
|
172
|
+
| axe reports "needs review" | Manual verification; document decision |
|
|
173
|
+
| Design conflicts with WCAG | Discuss with design; propose alternatives |
|
|
174
|
+
| Third-party widget fails | Contact vendor; document as known limitation |
|
|
175
|
+
| AAA required | Plan manual testing; automation covers subset |
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## References
|
|
180
|
+
|
|
181
|
+
- [WCAG 2.2 Understanding](https://www.w3.org/WAI/WCAG22/Understanding/)
|
|
182
|
+
- [WebAIM Screen Reader User Survey](https://webaim.org/projects/screenreadersurvey9/)
|
|
183
|
+
- [Inclusive Design Principles](https://inclusivedesignprinciples.org/)
|
|
184
|
+
- [A11y Project Checklist](https://www.a11yproject.com/checklist/)
|