Что такое Feature Flags?

Feature flags (также называемые feature toggles) — это условные конструкции в коде, управляющие активностью фичи. Они отделяют деплой кода от выпуска фичи — вы можете задеплоить код в продакшен со скрытыми фичами, затем включать их постепенно.

Для QA-инженеров feature flags добавляют сложность тестирования, но дают мощные возможности: безопасное тестирование фич в продакшене, управление A/B-экспериментами и мгновенный откат проблемных фич без передеплоя.

Типы Feature Flags

ТипВремя жизниНазначениеФокус тестирования
Release flagsКороткое (дни-недели)Скрыть незавершённые фичиОба состояния on/off
Experiment flagsСреднее (недели-месяцы)A/B-тестирование, метрикиПоведение вариантов
Ops flagsДолгоживущиеCircuit breakers, kill switchesРежимы отказа
Permission flagsДолгоживущиеФичи по пользователям (premium, beta)Поведение по группам

Стратегия тестирования Feature Flags

Комбинаторная проблема

При N независимых флагах существует 2^N комбинаций. При 10 флагах — 1024 комбинации.

Прагматичный подход:

  1. Тестируйте каждый флаг независимо в обоих состояниях (2N тестов)
  2. Определите зависимые флаги, взаимодействующие друг с другом, и тестируйте их комбинации
  3. Тестируйте переходы — переключение флага во время сессии пользователя
  4. Тестируйте состояние по умолчанию — что видят пользователи при недоступности сервиса флагов

Пример тестовой матрицы

Для feature flag “new-checkout”:

СценарийСостояниеЧто тестировать
Feature off (default)OFFLegacy checkout работает корректно
Feature onONНовый checkout работает корректно
Переход: off → onOFF → ONПереключение mid-session не портит данные корзины
Переход: on → offON → OFFОткат не теряет данные пользователя
Сервис флагов недоступенFALLBACKПриложение корректно деградирует к default

Инструменты Feature Flags

ИнструментТипКлючевая особенность
LaunchDarklySaaSEnterprise, обновления в реальном времени
Split.ioSaaSВстроенная экспериментация
UnleashOpen sourceSelf-hosted, расширяемый
FlagsmithOpen sourceAPI-first, удалённая конфигурация
ConfigCatSaaSПростой, доступный

Упражнение: Спроектируйте стратегию тестирования флагов

Ваша команда запускает новый движок рекомендаций за feature flag с тремя вариантами: “off” (legacy), “basic” и “advanced” (ML). Прогрессивный rollout: 1% → 10% → 50% → 100%.

Решение

Фаза 1: До rollout

Функциональные тесты по вариантам:

  • OFF: Legacy-страница продукта, без секции рекомендаций
  • BASIC: Секция рекомендаций показывает связанные продукты по категории
  • ADVANCED: ML-рекомендации, персонализированные по пользователю

Тесты переходов:

  • OFF → BASIC: рекомендации появляются без проблем перезагрузки
  • BASIC → ADVANCED: ML-рекомендации заменяют базовые
  • ADVANCED → OFF: секция чисто исчезает

Фаза 2: Прогрессивный Rollout

При 1%: Smoke-тесты в продакшене, мониторинг error rate При 10%: Сравнение метрик между вариантами (A/B/C-тест) При 50%: Полная регрессия против каждого варианта При 100%: Финальная валидация, план удаления флага

Лучшие практики

  1. Очищайте старые флаги. Это технический долг. После полного запуска удалите флаг и старый код.
  2. Тестируйте поведение fallback. Что произойдёт, если сервис флагов недоступен?
  3. Никогда не вкладывайте feature flags глубоко. Максимум два уровня вложенности.
  4. Используйте переопределения флагов в тестовых окружениях.
  5. Мониторьте изменения состояний флагов. Логируйте когда и кто изменил.