Версионирование конфигураций

Axe-core — библиотека для автоматической проверки доступности веб-приложений, предоставляющая гибкие механизмы настройки правил и конфигураций. Одной из ключевых практик при работе с библиотекой является версионирование конфигураций. Это позволяет сохранять стабильность тестов при обновлении приложения, обеспечивать повторяемость результатов и управлять изменениями правил доступности.

Структура конфигураций

Конфигурации в Axe-core представляют собой объекты JavaScript с набором полей, определяющих поведение анализа:

  • rules — объект, где ключами являются идентификаторы правил, а значениями — настройки (enabled/disabled, параметры исключения, thresholds).
  • checks — позволяет настраивать отдельные проверки, например глубину анализа или игнорируемые элементы.
  • include/exclude — массивы CSS-селекторов для явного указания областей, которые необходимо или не следует анализировать.
  • reporterOptions — настройки формата и уровня детализации отчётов.

Каждое изменение в этих объектах может существенно влиять на результаты проверки доступности. Версионирование помогает отслеживать такие изменения.

Принципы версионирования

  1. Семантическое версионирование Каждая конфигурация должна иметь явный номер версии в формате MAJOR.MINOR.PATCH:

    • MAJOR — несовместимые изменения правил или структуры конфигурации.
    • MINOR — добавление новых правил или опций без нарушения существующих.
    • PATCH — исправление ошибок в конфигурации или уточнение параметров правил.
  2. Изоляция версий Каждая версия конфигурации хранится отдельно, чтобы существующие тесты могли использовать старые версии без риска поломки. В коде это реализуется через именованные файлы конфигураций или отдельные экспортируемые объекты.

// axeConfig_v1.js
export const axeConfig_v1 = {
  rules: {
    'color-contrast': { enabled: true },
    'label': { enabled: true }
  }
};

// axeConfig_v2.js
export const axeConfig_v2 = {
  rules: {
    'color-contrast': { enabled: true, threshold: 4.5 },
    'label': { enabled: true },
    'aria-hidden-focus': { enabled: false }
  }
};
  1. Документирование изменений Каждое обновление конфигурации сопровождается логом изменений: какие правила добавлены, какие изменены, какие отключены. Это необходимо для воспроизводимости тестов и понимания причин различий в отчётах доступности.

Интеграция версионированных конфигураций

При интеграции с тестовыми фреймворками (например, Jest, Cypress или Playwright) рекомендуется использовать динамический выбор версии конфигурации в зависимости от контекста тестирования:

import { axe, toHaveNoViolations } from 'jest-axe';
import { axeConfig_v2 } from './axeConfig_v2';

expect.extend(toHaveNoViolations);

test('Проверка доступности страницы', async () => {
  const results = await axe(document.body, axeConfig_v2);
  expect(results).toHaveNoViolations();
});

Такой подход позволяет одновременно поддерживать тесты, использующие старые конфигурации, и внедрять новые правила без риска сломать существующую инфраструктуру.

Управление совместимостью

Версионирование конфигураций важно для обеспечения обратной совместимости. При добавлении новых правил рекомендуется:

  • включать новые правила с enabled: false по умолчанию;
  • использовать экспериментальные версии для тестирования;
  • постепенно повышать версию MINOR после полной стабилизации правил.

Автоматизация версионирования

Для крупных проектов удобно автоматизировать версионирование с помощью скриптов:

  • проверка структуры конфигурации;
  • автоматическое обновление номера PATCH при изменении комментариев или метаданных;
  • генерация отчёта о различиях между версиями.

Пример автоматизированного сравнения конфигураций:

import deepDiff from 'deep-diff';
import { axeConfig_v1 } from './axeConfig_v1';
import { axeConfig_v2 } from './axeConfig_v2';

const differences = deepDiff(axeConfig_v1, axeConfig_v2);
console.log(differences);

Это позволяет выявлять потенциально критические изменения до запуска тестов.

Практические рекомендации

  • Для проектов с несколькими командами использовать централизованный репозиторий конфигураций.
  • Каждое изменение конфигурации должно проходить код-ревью.
  • Использовать семантические теги версий в системах контроля версий (Git) для облегчения интеграции с CI/CD.
  • Хранить отдельные конфигурации для разных сред (разработка, тестирование, продакшн).

Версионирование конфигураций в Axe-core обеспечивает стабильность тестов доступности, прозрачность изменений и упрощает масштабирование проверки для крупных приложений.