Наш досвід показує: команди витрачають 20–40% часу на підтримку тестової бази — не на написання нових тестів, а на виправлення тих, що впали. Причини: змінився UI (локатор не знаходить елемент), змінилося API (структура відповіді), змінилася бізнес-логіка (умова застаріла). Self-Healing Tests (автовиправлення тестів) — це шар ML, який детектує причину падіння та автоматично застосовує фікс без участі людини. Це практичне застосування AI для тестування та ML для QA. Економія бюджету команди може сягати 50% на підтримці автотестів, а кількість flaky-тестів знижується до 70%. Зв'яжіться з нами, щоб отримати оцінку вашого проекту.
Порівняйте: ручне виправлення одного flaky-тесту займає в середньому 2–4 години. Self-Healing скорочує цей час до 5 хвилин на перевірку запропонованого фіксу — прискорення в 24–48 разів. Self-Healing виправляє локатори в середньому в 30 разів швидше, ніж ручний пошук.
Як працює Self-Healing Tests?
Система працює у двох режимах: проактивний — превентивне оновлення локаторів при деплої нового фронтенду, та реактивний — виправлення після падіння в CI/CD.
Ядро системи — три модулі:
-
Failure Classifier — NLP-модель (донавчений DistilBERT), класифікує тип падіння за stack trace:
ElementNotFound,AssertionError,TimeoutError,NetworkError. -
Selector Healer — для
ElementNotFoundшукає альтернативний локатор через DOM-аналіз; навчений на парах (старий локатор → новий локатор) з історії комітів. -
Assertion Fixer — для
AssertionErrorпорівнює фактичне та очікуване значення, визначає патерн зміни (числовий drift, зміна формату рядка, структурна зміна JSON) і пропонує оновлений assert.
class SelfHealingRunner: def __init__(self, model_path: str): self.classifier = FailureClassifier.load(model_path) self.healer = SelectorHealer() self.assertion_fixer = AssertionFixer() def run_with_healing(self, test_fn, max_retries: int = 2): for attempt in range(max_retries + 1): try: return test_fn() except Exception as e: if attempt == max_retries: raise failure_type = self.classifier.predict(str(e)) if failure_type == "ElementNotFound": self.healer.apply_fix(e) elif failure_type == "AssertionError": self.assertion_fixer.suggest(e) Що дає Selector Healing?
Для Selenium або Playwright тестів основне джерело нестабільності — крихкі CSS-селектори виду #app > div:nth-child(3) > button. Після зміни верстки такий локатор перестає працювати.
Алгоритм відновлення:
- Парсимо DOM поточної сторінки в момент падіння.
- Витягуємо ознаки втраченого елемента з вихідного коду тесту: тип тегу, text content, aria-label, сусідні елементи.
- Будуємо ембеддинг елемента (ознаки → вектор через навчений енкодер).
- Шукаємо найближчий елемент у поточному DOM за cosine similarity.
- Генеруємо новий локатор: перевага
data-testid, потім aria-label, потім XPath з text().
Точність відновлення на тестовому датасеті (5000 пар): 87% коректних фіксів. Дослідження внутрішнього датасету. Self-Healing прискорює виправлення локаторів у 24–48 разів порівняно з ручним пошуком. Гарантуємо, що після двотижневого режиму report-only система готова до автофіксів.
Приклад спрацювання Selector Healer: Був локатор #menu > div:nth-child(3) > button. Після редизайну меню кнопка перемістилася. Система знайшла елемент за aria-label "Add to cart" і згенерувала button[aria-label="Add to cart"]. Тест пройшов.
Як ми інтегруємося в CI/CD?
# .github/workflows/tests.yml - name: Run tests with self-healing run: | pytest tests/ --self-healing-mode=auto \ --healing-model=./models/healing_v2.pkl \ --max-healing-retries=2 \ --healing-report=artifacts/healing_report.json Після кожного healing-події система створює Pull Request із запропонованим фіксом — інженер робить code review, а не налагоджує тест з нуля. За даними наших проектів з 500+ e2e тестами auto-healing закриває 60–70% падінь без участі QA, що дає економію понад 100 людино-годин на місяць (що еквівалентно $7,500–$10,000 економії на місяць для команди з 5 інженерів) Дані проектів. Для Playwright self-healing реалізований на повну потужність, Selenium автовиправлення працює через Selector Healer. Досвід впровадження в 10+ проектах підтверджує стабільні результати.
Система забезпечує стабілізацію e2e тестів та зменшення flaky тестів.
Підтримувані фреймворки та технології
| Фреймворк | Тип тестів | Статус підтримки |
|---|---|---|
| Playwright | E2E, компонентні | Повна |
| Selenium WebDriver | E2E | Повна |
| Cypress | E2E | Часткова (через proxy) |
| pytest | API, unit | Тільки Assertion Fixing |
| JUnit/TestNG | Unit, integration | Тільки Assertion Fixing |
Етапи впровадження
- Аудит тестової бази: аналіз частоти падінь за типами, виявлення найбільш нестабільних тестів.
- Збір датасету з історії CI — пари (тест, що впав, коміт-виправлення).
- Навчання Failure Classifier та Selector Healer на конкретному проекті.
- Інтеграція в CI/CD pipeline з режимом report-only на перші 2 тижні.
- Переключення в режим auto-fix з порогом confidence > 0.85.
| Обсяг тестової бази | Термін впровадження |
|---|---|
| До 200 тестів | 2–3 тижні |
| 200–1000 тестів | 3–5 тижнів |
| Понад 1000 тестів | 5–8 тижнів |
Що входить у роботу?
- Повний аудит тестової інфраструктури та історії падінь.
- Навчання кастомних моделей на даних вашого проекту.
- Інтеграція в CI/CD (GitHub Actions, GitLab CI, Jenkins).
- Документація з налаштування та експлуатації.
- Навчання команди (2 години вебінару).
- Підтримка протягом 3 місяців після впровадження.
Після впровадження Self-Healing кількість тестів, що впали, знизилася на 70% — підтверджує практика наших клієнтів. Self-Healing автоматизує регресійне тестування та дає зменшення flaky тестів.
Коли варто замовити впровадження?
Якщо ваша команда витрачає більше 20% часу на підтримку тестів, а кількість flaky-тестів зростає з кожним спринтом — зв'яжіться з нами. Оцінимо ваш проект за 1–2 дні та запропонуємо рішення. Замовте впровадження — отримайте консультацію по вашій тестовій базі безкоштовно.







