Front-end accessibility testing with BigTest/Jest+RTL

Front-end accessibility testing with BigTest/Jest+RTL

Implementing with BigTest

For BigTest tests we'll be using "axe-core" package.
Link to package's GitHub page - https://github.com/dequelabs/axe-core

 

In your test file import "axe-core"

import axe from 'axe-core';

And if you want to use default axe configuration you can simply use this object in your tests:

describe('SomeComponent', () => { // setup your tested component as usual describe('waiting for aXe to run', () => { beforeEach(async () => { a11yResults = await axe.run(); }); it('should not have any a11y issues', () => { expect(a11yResults.violations).to.be.empty; }); }); });

Note: please make sure that axe.run is not called before all tests, because it will slow down tests. So, don't put "await axe.run()" in global "beforeEach"

// Bad example describe('SomeComponent', () => { // setup your tested component as usual beforeEach(async () => { a11yResults = await axe.run(); }); it('should not have any a11y issues', () => { expect(a11yResults.violations).to.be.empty; }); });

 

Additionally, you can configure axe to enable/disable certain rules. To do this you can call "axe.configure" or "axe.run()" with your axe configuration options:

import axe from "axe-core"; axe.configure({ rules: [{ id: 'color-contrast', enabled: false, }], });

More info on Deque aXe a11y rules: https://dequeuniversity.com/rules/axe/4.1

In case there are rules that you want to disable for all tests you might want to create a test helper to reduce code duplication:

import axe from 'axe-core'; const getAxe = () => { axe.reset(); axe.configure({ rules: [{ id: 'color-contrast', enabled: false, }], }); return axe; }; export default getAxe;

And you can use this function in your tests.

Implementing with Jest+RTL

For Jest+RTL tests we'll be using "jest-axe" package that provides a function to configure axe object and a custom "toHaveNoViolations" matcher
Link to package's GitHub page - https://github.com/nickcolley/jest-axe?

 

In your test file import "jest-axe"

import { axe, toHaveNoViolations} from "jest-axe";

and extend jest's expect method with a custom matcher

expect.extend(toHaveNoViolations);

At this point you're ready to write accessibility test cases. Example:

it('should demonstrate this matcher`s usage with react testing library', async () => { const { container } = render(<App/>) const results = await axe(container) expect(results).toHaveNoViolations() })

 

Additionally, you can configure axe to enable/disable certain rules. To do this import configureAxe helper from "jest-axe" and call it with your axe configuration options:

import { configureAxe } from "jest-axe"; const axe = configureAxe({ rules: { 'color-contrast': { enabled: false }, }, });

More info on Deque aXe a11y rules: https://dequeuniversity.com/rules/axe/4.1

 

In case there are rules that you want to disable for all tests you might want to create a test helper to reduce code duplication:

import { configureAxe } from 'jest-axe'; const getAxe = (config = {}) => { return configureAxe({ rules: { 'meta-viewport': { enabled: false }, 'landmark-one-main': { enabled: false }, 'page-has-heading-one': { enabled: false }, 'bypass': { enabled: false }, }, ...config, }); }; export default getAxe;

And you can use this function in your tests.