Modern QA2026CI-пайплайн визуального тестирования и доступности
Join

Course10 Visual & Accessibility Testing

Cutting-edge · Chapter 10

CI-пайплайн визуального тестирования и доступности

Updated Jul 2026

Полный пайплайн

# .github/workflows/visual-a11y.yml
name: Visual & Accessibility Tests
on: [pull_request]

jobs:
  accessibility:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
      - run: npm ci
      - run: npm run build

      - name: Start app
        run: npm run start &
        env:
          PORT: 3000

      - name: Wait for app
        run: npx wait-on http://localhost:3000 --timeout 30000

      - name: Run axe-core accessibility audit
        run: npx playwright test tests/accessibility/ --reporter=json > a11y-results.json

      - name: Upload accessibility report
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: accessibility-report
          path: a11y-results.json

  visual-regression:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
      - run: npm ci

      - name: Build Storybook
        run: npx storybook build -o storybook-static

      - name: Run Chromatic
        uses: chromaui/action@latest
        with:
          projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
          exitOnceUploaded: true

  design-token-drift:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npm run build && npm run start &

      - name: Wait for app
        run: npx wait-on http://localhost:3000 --timeout 30000

      - name: Verify design tokens
        run: npx playwright test tests/design-system/

      - name: Check Figma drift
        if: env.FIGMA_TOKEN != ''
        run: python scripts/figma_design_drift.py --report drift-report.json
        env:
          FIGMA_TOKEN: ${{ secrets.FIGMA_TOKEN }}

  keyboard-navigation:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npm run build && npm run start &

      - name: Wait for app
        run: npx wait-on http://localhost:3000 --timeout 30000

      - name: Run keyboard navigation tests
        run: npx playwright test tests/accessibility/keyboard-navigation.spec.ts

Этапы пайплайна по скорости и охвату

Этап Длительность Охват Когда запускать
Сканирование axe-core 30-60 секунд Все страницы, автоматические правила Каждый PR
Клавиатурная навигация 1-2 минуты Критичные потоки Каждый PR
Визуальная регрессия (Playwright) 2-5 минут Сравнение скриншотов Каждый PR
Визуальная регрессия (Chromatic) 3-10 минут Снимки компонентов Каждый PR
Дрифт дизайн-токенов 1-2 минуты Сравнение значений токенов PR, затрагивающие компоненты/стили
AI-аудит доступности 5-15 минут Качественный анализ Еженедельно по расписанию
Полный аудит Lighthouse 2-5 минут Производительность + PWA + доступность Релизная ветка

Стратегия обработки сбоев

Тип нарушения Действие CI Требуется ревью?
Критическое нарушение доступности (axe-core) Блокировка слияния Нет -- требуется исправление
Серьёзное нарушение доступности Блокировка слияния Нет -- требуется исправление
Умеренное нарушение доступности Предупреждение, без блокировки Да -- триаж в спринте
Минорное нарушение доступности Только логирование Ревью ежемесячно
Визуальная регрессия (значительная) Блокировка слияния Да -- одобрить или исправить
Визуальная регрессия (минорная) Автоодобрение, если ниже порога Нет
Дрифт дизайн-токенов Комментарий к PR Да -- согласовать с дизайном
Сбой клавиатурной навигации Блокировка слияния Нет -- требуется исправление

Мониторинг и отчётность

Дашборд оценки доступности

# Track accessibility compliance over time
def generate_a11y_dashboard(reports):
    """Generate accessibility trend data from CI reports."""
    trends = []
    for report in reports:
        trends.append({
            "date": report["date"],
            "total_violations": report["total_violations"],
            "critical": report["critical"],
            "serious": report["serious"],
            "pages_tested": report["pages_tested"],
            "compliance_rate": 1 - (report["total_violations"] / report["pages_tested"]),
        })

    return {
        "current_violations": trends[-1]["total_violations"],
        "trend": "improving" if trends[-1]["total_violations"] < trends[-2]["total_violations"] else "degrading",
        "compliance_rate": f"{trends[-1]['compliance_rate']:.1%}",
        "history": trends,
    }

Ключевые выводы

  • AI-визуальное тестирование устраняет проблему ложных срабатываний, которая погубила внедрение попиксельного сравнения. Модели компьютерного зрения могут отличить значимые изменения от шума рендеринга.
  • axe-core автоматически выявляет 30-40% проблем доступности -- запускайте его на каждой странице при каждом PR. Оставшиеся 60-70% требуют экспертной оценки человека и AI-аудита.
  • Цветовой контраст — наиболее часто нарушаемый критерий WCAG и самый простой для автоматического тестирования. Закодируйте соотношения 4.5:1 и 3:1 в ваш CI-пайплайн.
  • Тестирование клавиатурной навигации выявляет реальные проблемы пользователей -- если ваш процесс оформления заказа нельзя пройти только с клавиатуры, вы исключаете пользователей и приглашаете судебные иски.
  • European Accessibility Act вступил в силу -- если ваш продукт продаётся в ЕС, соответствие WCAG 2.1 AA является юридически обязательным, а не опциональным.
  • Верификация дизайн-токенов предотвращает дрифт дизайна -- автоматическое сравнение спецификаций Figma и вычисленных CSS-стилей выявляет постепенное расхождение, которое ручное ревью пропускает.
  • Визуальное тестирование компонентов в Storybook выявляет проблемы раньше, чем скриншоты уровня страницы, при значительно меньших затратах.

Тезис для собеседования

«Я подхожу к визуальному тестированию и тестированию доступности как к взаимодополняющим дисциплинам. Для визуальной регрессии я использую комбинацию встроенного сравнения скриншотов Playwright для скорости и инструмента вроде Percy или Chromatic для кроссбраузерного покрытия с AI-триажем, который фильтрует шум рендеринга и отмечает только значимые изменения. Для доступности я запускаю axe-core на каждой странице при каждом PR как минимум — он автоматически выявляет 30-40% проблем WCAG 2.1 AA. Но я выхожу за рамки сканирования на основе правил, используя AI-агентов, которые могут оценить, является ли alt-текст действительно описательным, направляют ли сообщения об ошибках пользователя и является ли поток чтения логичным — то, что axe-core принципиально не может оценить. Я также тестирую клавиатурную навигацию сквозным образом: наш процесс оформления заказа должен быть проходим без мыши, с видимыми индикаторами фокуса и корректным захватом фокуса в модальных окнах. С учётом вступления в силу European Accessibility Act и более 4 000 исков по ADA в год в США, доступность — не приятное дополнение, а юридическое и бизнес-требование, которое я встраиваю в CI-пайплайн с первого дня.»