Команда тратит 20–40% времени на поддержку тестовой базы — не на написание новых тестов, а на исправление упавших. Причины: изменился UI (локатор не находит элемент), изменилось API (структура ответа), изменилась бизнес-логика (условие устарело). Self-Healing Tests (автоисправление тестов) — это слой ML, который детектирует причину падения и автоматически применяет фикс без участия человека. Это практическое применение AI для тестирования и ML для QA. Экономия бюджета команды может достигать 50% на поддержке автотестов, а количество flaky-тестов снижается до 70%. Свяжитесь с нами, чтобы получить оценку вашего проекта.
Сравните: ручное исправление одного flaky-теста занимает в среднем 2–4 часа. Self-Healing сокращает это время до 5 минут на проверку предложенного фикса — ускорение в 24–48 раз.
Как работает 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 человеко-часов в месяц. Для Playwright self-healing реализован на полную мощность, Selenium автоисправление работает через Selector Healer. Опыт внедрения в 10+ проектах подтверждает стабильные результаты.
Поддерживаемые фреймворки и технологии
| Фреймворк | Тип тестов | Статус поддержки |
|---|---|---|
| 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 дня и предложим решение. Закажите внедрение — получите консультацию по вашей тестовой базе бесплатно.







