AI-система пріоритезації тестів (Test Impact Analysis AI)

Регресійний прогін розтягується на години, а збірка простоює в черзі. Ми розробляємо AI-систему пріоритезації тестів під ключ: модель відбирає перевірки, яких справді стосуються зміни, і запускає їх першими. Команда швидше отримує зворотний зв'язок і витрачає менше часу на ручне сортування перевірок.
Часті запитання

Пріоритизація тестів AI: де ламається конвеєр збірки

Повний набір перевірок на кожну зміну перестає вкладатися в робоче вікно. Регресія, яка раніше проходила до кінця зміни, тепер триває до ранку: результат зустрічають уже на іншому завданні, із втраченим контекстом і наполовину зібраною картиною правок.

Вузьке місце конвеєра збірки — не збірка й не викладка на стенд, а очікування регресії.

Збірка вкладається в хвилини, а черга на прогін розтягується на години, і час зворотного зв'язку розробника майже не залежить від розміру зміни: правка в один рядок у спільному модулі тягне за собою весь набір, хоча реально з нею пов'язані зазвичай одиниці відсотків перевірок.

Зрізати набір напряму не можна. Зайві тести прибрати легко, але ціна пропущеного регресу — відкат, розбір інциденту й втрачена довіра до самого конвеєра, тому команди залишають усе й терплять затримку.

Завдання в іншому: запускати не весь набір, а ті перевірки, що справді пов'язані зі зміною.

Пріоритизація тестів AI спирається на історію падінь, карту залежностей модулів, змінені файли та статистику нестабільних тестів — і ставить на початок черги те, що з високою ймовірністю виявить дефект.

Розбираємо, як це закривається на практиці: які дані потрібні моделі, як переконатися, що вона не пропускає дефекти, і як вбудувати вибір перевірок у конвеєр, не втративши контроль над випуском.

Що дає вибірковий прогін перевірок на кожному коміті

На кожен коміт запускається не весь набір перевірок, а та підмножина, яку цей коміт справді зачіпає.

Система зіставляє змінені файли з картою залежностей модулів та історією минулих падінь: тести, які вже виявляли дефекти в цьому коді, піднімаються на початок черги, а явно не пов'язані йдуть у нічний повний прогін. Вибірковий прогін — це не «урізати перевірки», а переставити їх так, щоб сигнал надходив раніше.

Перший вимірюваний ефект — час прогону перевірок. Зворотний зв'язок по гілці надходить за одиниці хвилин замість десятків, і розробник не перемикається на інше завдання в очікуванні результату. Це змінює звичку: правки стають дрібнішими, а конфлікти злиття — дешевшими в розборі.

Другий — покриття регресії. Частка виявлених дефектів тримається на рівні повного набору: жоден тест не видаляється, змінюються лише порядок і момент запуску. Нічний прогін, як і раніше, проходить повністю й слугує контрольною точкою, а не єдиним шансом щось помітити.

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

Звідси й стабільність випуску: релізна гілка отримує передбачуваний набір перевірок замість лотереї через перевантажені машини й таймаути.

Режими запуску: порівняння підходів та їхні обмеження

Режим запуску перевірок визначає, скільки чекати на результат після правки й яку частину регресії він закриває. Вибір залежить не від розміру проєкту, а від того, наскільки повно описано граф залежностей між модулями й чи є накопичена історія прогонів.

На практиці порівнюють чотири схеми — від повного прогону до гібрида. Жодна не виграє завжди: обмеження підходу проявляються рівно там, де закінчуються дані, на яких він побудований.

Режим запуску перевірок Коли підходить Обмеження підходу
Повний прогін нестабільний або неповний граф залежностей, релізні перевірки, невеликий набір тестів час зростає лінійно: результат надходить через десятки хвилин, паралельні правки чекають у черзі
Відбір за залежностями єдиний репозиторій із явним графом модулів, правки локалізовані втрачає зв'язки, яких немає в графі: налаштування, схеми даних, перемикачі конфігурації
Статистична модель відбору часта інтеграція, накопичена історія прогонів і падінь на новому коді та після великих переробок точність падає, потрібен контроль частки пропущених дефектів
Гібридний режим релізний цикл за високої частоти правок складніший у налаштуванні: два набори правил, потрібна регулярна звірка з повним прогоном

Базова схема, яку ми закладаємо, — гібридна: робочі гілки отримують швидкий зворотний зв'язок, релізні та нічні прогони йдуть повним набором. Розходження між відібраним і повним набором стає видно до викладки, а не після.

Перемикання між режимами залишаємо керованим, щоб у разі збою відбору система поверталася до повного прогону, а не до порожнього звіту.

Як відбувається впровадження: етапи інженерної роботи

Впровадження відбувається кроками, і кожен крок завершується артефактом, який можна перевірити: списком перевірок, картою зв'язків, звітом тіньового режиму.

Без цього модель відбору залишається чорною скринькою, а команда не віддасть їй право вирішувати, які перевірки можна пропустити.

  1. Аудит набору перевірок. Інвентаризуємо наявні тести: тривалість, частоту хибних падінь, дублі та перевірки, які не падали жодного разу за всю історію. На виході — перелік, де видно, що взагалі має сенс відбирати.
  2. Збір статистики прогонів. Беремо історію із системи безперервної збірки: які перевірки запускалися, які падали, який код змінювався в тому самому наборі правок. Це навчальна вибірка — без неї модель нема чим налаштовувати.
  3. Карта залежностей. Будуємо зв'язок «змінений модуль → перевірки, які його покривають». Явні зв'язки беремо з розбору залежностей у коді, неявні — з фактичних падінь в історії: частина дефектів спливає в тестах, формально не пов'язаних із правкою.
  4. Навчання моделі відбору. Модель ранжує перевірки за ймовірністю падіння від конкретної зміни. Поріг калібруємо так, щоб критичні для бізнесу сценарії запускалися завжди, незалежно від оцінки.
  5. Тіньовий режим. Модель працює паралельно з повним прогоном і лише пропонує порядок, нічого не вимикаючи. Звіряємо її відбір із тими перевірками, що реально впали, й рахуємо, яку частку дефектів вона б пропустила.
  6. Увімкнення в конвеєр. Починаємо з окремих гілок, потім переводимо основний потік. Повний набір залишається доступним вручну, а зміни в критичних областях за правилом запускають усе.
  7. Передача в супровід. Віддаємо документацію, регламент донавчання та метрики з оповіщеннями: якщо частка пропущених падінь зростає, відбір автоматично повертається до повного набору.

Після передачі команда сама оновлює модель у разі зміни коду — зовнішня участь для цього не потрібна.

Що залишається в репозиторії після здачі робіт

Здаємо не лише робочий сервіс пріоритизації, а й усе, що потрібно команді, щоб змінювати правила відбору тестів без нас.

Кожен артефакт лежить у репозиторії поруч із кодом, версіонується й проходить рев'ю — за півроку ніхто не гадає, чому конкретний тест потрапив у прогін або залишився за його межею.

  • Конфігурація відбору — файл із правилами: які зміни запускають повний прогін, які тести вважати пов'язаними з модулем. Зміни проходять звичайне рев'ю, правити код моделі для цього не потрібно.
  • Карта залежностей — граф зв'язків модулів, тестів і зовнішніх контрактів, зібраний зі статичного аналізу та історії прогонів. Зберігається в машиночитному вигляді й оновлюється за розкладом.
  • Правила винятків — перелік тестів, які йдуть у прогін завжди: платежі, авторизація, критичні сценарії. Для кожного зафіксовано, чому його виведено з-під моделі.
  • Звіти про якість прогнозу — частка пропущених дефектів, частка відібраних тестів, час прогону до й після. Формуються автоматично за розкладом.
  • Інструкції для інженерів — як додати тест, як позначити нову залежність, що робити, якщо модель помилилася й пропустила регрес.
  • Регламент супроводу — хто, з якою періодичністю та за якими метриками переглядає пороги й правила; що робити в разі падіння точності.
  • Документація рішення — схема компонентів, точки стикування з конвеєром збірки, формати даних і журнал ухвалених рішень з обґрунтуванням.

Кейс: як AI-відбір скоротив регресійний прогін

До впровадження регресійний набір із 4 200 автотестів проходив близько дев'яти годин, і нічний прогін не встигав завершитися до ранкового розбору.

Команда тримала повний набір лише перед релізом, а в інші дні запускала урізаний список «на око» — частину перевірок вимикали вручну, і дефекти в рідкісних шляхах доходили до тестового контуру.

Ми навчили модель на історії прогонів: зіставили змінені файли з перевірками, які падали в минулих збірках, додали карту залежностей між модулями та вагу за критичністю.

Підхід Test Impact Analysis дає кожному тесту оцінку ймовірності виявити регрес — на її основі система збирає вибірку під конкретний набір змін.

Метрики до й після: тривалість регресії скоротилася з 9 годин до 55 хвилин, обсяг нічного прогону — з 4 200 до 700–900 перевірок, а частка виявлених дефектів залишилася на рівні повного набору.

Хибні пропуски за перший квартал — 0,3 %: три випадки, коли дефект знайшовся лише на повному прогоні. Розібрали причини: два були пов'язані з правками в конфігурації поза відстежуваними файлами.

Додали правило — модулі високого ризику та все, що стосується схеми даних, завжди йде у вибірку повністю.

Повний прогін ми не прибрали: він залишився перед релізом і раз на добу як страховка, але перестав бути вузьким місцем. Нічне вікно вкладається в 40 хвилин, ранковий розбір починається з актуального статусу, а релізний цикл скоротився з тижня до двох-трьох днів.

Чим модель відрізняється від ручного розділення перевірок?

Ручне розділення перевірок — це фіксовані набори за рівнями: димовий мінімум на збірку, інтеграційні — раз на добу, повний регрес — перед релізом.

Рівні перевірок прив'язані до події, а не до змісту зміни: той самий список іде і після правки шаблону, і після переписаного шару доступу до даних.

У статичних наборів сильні сторони нудні, але реальні: передбачуваний час прогону, зрозумілий аудит — видно, що перевірялося в кожному релізі.

Слабке місце те саме: набір не знає, що змінилося, тому або зростає до годин, або його ріжуть вручну — і частина шляхів залишається без перевірки до інциденту.

Динамічний відбір іде від зміни: карта залежностей пов'язує змінені файли, модулі й схеми даних із конкретними перевірками, а історія падінь задає порядок запуску — першими йдуть ті, що частіше виявляють регрес у зачепленій області.

Це і є AI-пріоритизація тестів: модель оцінює ймовірність відмови та ціну перевірки, а не відбирає за маскою шляху.

Межі в динаміки чесні: неявні залежності — збірка конфігурації, генерація коду, міграції — потрапляють у карту не завжди, і зачеплена перевірка може не вибратися.

Тому відбір спирається на карту, яка оновлюється разом зі збіркою, і на повний прогін перед релізом як страховку від накопичених пропусків.

Порівнювати підходи як «або–або» не варто: динамічний відбір економить час на кожній збірці, а статичні рівні тримають межу перед релізом. Ручне розділення залишається потрібним там, де залежностей не видно: новий сервіс, зовнішній компонент, рідкісний сценарій.

Технічні сумніви: хибні пропуски та якість прогнозу

Будь-яка система, яка вирішує, які перевірки запускати, а які ні, заслуговує на скепсис: ціна помилки тут — дефект у релізі. Тому якість прогнозу вимірюємо не середньою точністю, а часткою хибних пропусків — випадків, коли модель вважала перевірку неактуальною, а вона б упала.

Нижче — п'ять заперечень, які найчастіше звучать на технічних сесіях, і те, чим кожне закрито в архітектурі.

Що якщо модель помилиться й пропустить дефект?

Хибні пропуски обмежені страхувальним повним прогоном: на релізних гілках і за нічним розкладом набір перевірок виконується повністю, незалежно від прогнозу.

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

Як система поводиться на холодному старті моделі?

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

Чи доведеться переписувати наявні перевірки?

Ні. Пріоритизація надбудовується над поточним набором: беремо метадані із системи збірки й репозиторію, зіставляємо зміни з областями покриття — методику Test Impact Analysis застосовуємо до того, що вже є.

Достатньо стабільних імен перевірок і розмітки модулів; переносити логіку в інший фреймворк не потрібно.

Хто підтримує модель після передачі?

Якість прогнозу залишається вимірюваною величиною: частка хибних пропусків і точність відсікання відстежуються на дашборді, перенавчання йде за розкладом і за тригером деградації.

Ми передаємо регламент перенавчання, набір контрольних зрізів для регрес-перевірки моделі та документацію — команда продовжує роботу без нас.

Обговоримо ваше завдання: що надіслати для оцінки

Щоб оцінка впровадження спиралася на факти, а не на анкету, нам достатньо вихідних даних проєкту — як зараз влаштований прогін тестів і де він втрачає час. Нижче мінімальний набір; якщо чогось немає, обговоримо завдання й підкажемо, як це зібрати.

  • Карта тестових наборів: скільки тестів, до яких модулів прив'язані, які перевірки вважаються критичними.
  • Історія прогонів за кілька тижнів: час повного прогону, частка падінь без реального дефекту.
  • Опис конвеєра: на якому етапі запускаються тести, що вже розпаралелено, чи є кеш результатів.
  • Зв'язок коду й тестів: чи є розмітка тестів за файлами та модулями, наскільки вона повна.
  • Потік змін: як часто й якими обсягами надходять правки, хто підтверджує готовність релізу.
  • Обмеження: доступи, політика зберігання історії прогонів, вимоги до ізоляції даних.
  • Контур для пілотного запуску: одна команда, один сервіс, частка прогонів під спостереженням.

За цими даними ми повернемося з оцінкою впровадження та планом робіт за етапами — від розбору історії прогонів до пілотного запуску на обмеженому контурі.

Заздалегідь фіксуємо метрики, за якими будемо рахувати ефект: час прогону на реліз, частка пропущених дефектів, частка ручних перезапусків.

Напрямки AI-розробки

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142