QA Interview Hub · База знань · Тести

Product Engineering

A/B-тести й feature flags

A/B-тести очима QA

A/B-тест — експеримент, у якому аудиторію випадково ділять на групи: control (поточний досвід) і одну чи кілька variant (зміна). Далі порівнюють цільову метрику (конверсію, retention) і за допомогою статистики вирішують, чи різниця не випадкова. Він відповідає на питання «чи справді зміна допомагає», а не «чи нам подобається».

Що важливо знати QA:

  • Стабільність призначення (stickiness). Користувач має завжди потрапляти в ту саму групу: після перезавантаження, входу з іншого пристрою (якщо є ідентифікатор), нової сесії. Якщо людина бачить то A, то B, її дані спотворюють результат, а досвід виглядає як баг;
  • Перевіряти всі варіанти. Кожен variant — це окрема версія продукту. Функціональність, верстка, аналітика, локалізація й доступність потребують тестів у кожному. Часта помилка — протестувати лише «нове»;
  • Примусове призначення. Для тестування потрібен спосіб потрапити у варіант (query-параметр, cookie, внутрішній інструмент), а не чекати на випадковість. Такий механізм не повинен бути доступним у продакшені всім;
  • Аналітика експерименту. Подія експозиції (користувач побачив варіант) має відправлятися один раз і з назвою групи. Інакше метрики будуть порівнювати не тих;
  • Не «підглядати» за результатом. Якщо зупинити тест, щойно варіант вирвався вперед, висока ймовірність помилково «виграти» через випадкові коливання. Тривалість і потрібний розмір вибірки визначають заздалегідь, і QA не підштовхує до дострокового висновку;
  • Перетин експериментів. Два тести на одному екрані можуть впливати один на одного. Їх розводять (взаємовиключні групи, layers) або враховують у аналізі;
  • Якість варіантів. Варіант, що ламає частину браузерів чи уповільнює сторінку, програє не через ідею, а через дефект. QA захищає чистоту експерименту.

Про «розмір вибірки» достатньо концептуально: що менша очікувана різниця і що вища потрібна впевненість, то більше користувачів і часу потрібно; кілька днів на малому трафіку зазвичай нічого не доводять.

Feature flags: комбінації, kill switch, прибирання

Feature flag — перемикач у конфігурації, що вмикає чи вимикає функціональність без нового деплою. Керують ними власні конфіги або сервіси на кшталт LaunchDarkly чи Unleash. Прапори дозволяють мерджити незавершений код, поступово відкривати фічу, вмикати її для частини користувачів і швидко вимкнути при проблемі.

Як тестувати фічу за прапором.

  • Обидва стани. Прапор вимкнено — поведінка як раніше (регресія не з’явилась); увімкнено — нова. Часто забувають перший;
  • Перехід. Що буде, коли прапор вмикають, а в користувача вже є дані, створені старою логікою? Що, коли вимикають посеред сесії?
  • Таргетинг. Правила (відсоток, країна, роль, версія застосунку) спрацьовують так, як задумано, у тому числі на межах і для не авторизованих;
  • Комбінації. n прапорів дають 2n станів. Усі не перевірити, тому беруть ті, що реально співіснують у продакшені, та пари, які торкаються однієї області коду;
  • Оточення. Прапор по-різному налаштований у dev, staging і prod. Перед релізом перевіряють його продакшн-значення, а не лише тестове.

Kill switch — прапор, призначений для аварійного вимкнення ризикової функції (оплата через нового провайдера, важкий запит). Його перевіряють заздалегідь: вимкнення справді діє швидко, без перезапуску; застосунок поводиться чемно (запасний шлях або зрозуміле повідомлення), не падає й не втрачає дані, створені, поки фіча була увімкнена.

Прибирання. Кожен прапор — тимчасова складність. Прапор, що давно увімкнений для всіх, лишає мертву гілку коду й тести для неї, а ще пастку: хтось вимкне його «на пробу». Тому при створенні прапора призначають власника й дату перегляду; після повного релізу код старої гілки й відповідні тести видаляють. Довгі «забуті» прапори — технічний борг, який QA має нагадувати.