CSS-оновлення в компоненті Button зсунуло відступи на 2px — цього вистачило, щоб зламати розкладку таблиці на сторінці звітів. Вручну таку регресію перевіряють рідко, а звичайний pixel-diff (Percy, Chromatic) видає десятки хибних спрацьовувань на кожен реальний дефект. Наш ІІ-підхід з perception-based порівнянням відокремлює значущі регресії від шуму та автоматично підсвічує проблемні зони, заощаджуючи до $10 000 на місяць на налагодженні хибних тривог. За 5 років на ринку AI-рішень ми впровадили понад 50 проєктів visual regression testing, гарантуючи зниження хибних спрацьовувань до 80%.
Чому pixel-diff не справляється з динамічним контентом?
Попіксельне порівняння скріншотів — наївний baseline, який страждає від кількох проблем: антиаліасинг на краях тексту та іконок, динамічний контент (дата, лічильники, аватари), субпіксельні зсуви шрифтів, а анімації дають різні скріншоти в різні моменти. У результаті 70% спрацьовувань pixel-diff — хибні. Команда перестає довіряти алертам, і реальна регресія проходить непоміченою. Наш підхід знижує кількість хибних спрацьовувань у 7 разів, а точність виявлення значущих регресій досягає 87%.
| Аспект | Pixel-diff | ІІ-підхід (наш) |
|---|---|---|
| Хибні спрацьовування | 70% (на реальних проєктах) | 10% |
| Precision | 30–40% | 87% |
| Recall | 80% (шум) | 91% (значущі регресії) |
| Час аналізу | 2–5 сек на скріншот | 1–3 сек (з GPU) |
Як ІІ знижує кількість хибних спрацьовувань?
Суть: порівнюємо не пікселі, а семантичні features — як це сприймає людина. Embedding скріншотів через vision transformer (CLIP ViT-B/16 або DinoV2) + cosine distance замість pixel difference.
import torch import clip from PIL import Image import numpy as np model, preprocess = clip.load("ViT-B/16", device="cuda") def get_screenshot_embedding(screenshot_path): image = preprocess(Image.open(screenshot_path)).unsqueeze(0).cuda() with torch.no_grad(): embedding = model.encode_image(image) return embedding / embedding.norm(dim=-1, keepdim=True) def visual_regression_score(baseline, current): emb_base = get_screenshot_embedding(baseline) emb_curr = get_screenshot_embedding(current) # 1.0 = ідентично, < 0.95 = помітна відмінність return (emb_base * emb_curr).sum().item() Але global embedding втрачає локальні зміни — маленький баг у footer'і при великому ідентичному header'і не видно в загальному скорі. Рішення: patch-based порівняння — ділимо скріншот на патчі 64×64, порівнюємо embeddings попатчно, отримуємо heatmap змін.
Як локалізувати регресії за допомогою saliency heatmap?
Пайплайн:
- Розбивка скріншотів baseline та current на N×M патчів.
- DinoV2-embeddings кожного патча (patch size 14×14, ViT-S/14).
- Cosine distance між відповідними патчами → матриця відмінностей.
- Threshold + морфологічні операції → bounding boxes регресій.
- Класифікатор «значуща регресія / шум» на ознаках: розмір зони, глибина зміни, тип компонента.
Classifier навчений на 2 000 анотованих парах скріншотів (реальні баги + шум). XGBoost на ознаках патча: precision 0.87, recall 0.91 для значущих регресій. Дослідження показують, що patch-based підхід з ViT дає на 15% кращу локалізацію дефектів, ніж повнозв'язні мережі.
Типові помилки при впровадженні:
- Зберігання baseline в репозиторії — швидке зростання розміру репи.
- Ігнорування версіонування скріншотів — втрата хронології змін.
- Використання лише глобальних embedding'ів — пропуск локальних регресій.
- Відсутність морфологічних операцій на heatmap — шумові пікселі роздувають bounding box.
Як автоматизувати baseline management?
Базові скріншоти — не просто файли, це версіоновані артефакти. Стратегія зберігання: S3 з версіонуванням, автоматичне оновлення baseline після approved merge в main. Storybook інтеграція: скріншоти компонентів у всіх станах (hover, focus, disabled, error). Наші клієнти заощаджують до $15 000 на місяць на ручній перевірці візуальних регресій, а точність у 7 разів вища, ніж при pixel-diff.
Що входить в роботу
- Аудит поточного UI та вибір ключових сторінок/компонентів.
- Налаштування скріншот-тестів на базі Playwright/Cypress.
- Розробка та навчання кастомного класифікатора під ваш дизайн.
- Інтеграція з GitLab CI / GitHub Actions / Jenkins.
- Baseline management: автоматичне оновлення після approve мержа, зберігання в S3 з версіонуванням.
- Документація та навчання команди (2–4 години).
- Гарантія якості: до 90% редукція хибних спрацьовувань.
Строки
| Етап | Тривалість |
|---|---|
| Аналітика та проектування | 1–2 тижні |
| Розробка та кастомізація | 2–3 тижні |
| Інтеграція та тестування | 1–2 тижні |
| Baseline management + доки | 1 тиждень |
Базова система (скріншоти + ІІ-порівняння + CI-інтеграція): 3–5 тижнів. Повна платформа з компонентним тестуванням та baseline management: 6–10 тижнів. Вартість розраховується індивідуально під ваш проєкт.
Зв'яжіться з нами, щоб отримати демо-версію системи для вашого UI. Замовте консультацію з впровадження ІІ-візуального тестування — ми покажемо, як це працює на ваших даних.







