AI-система приоритизации тестов (Test Impact Analysis AI)
Полный тестовый прогон на крупном проекте занимает 40–90 минут. Запускать все тесты на каждый коммит — дорого и медленно. Test Impact Analysis (TIA) решает обратную задачу: по изменённым файлам определить минимальный набор тестов, который покроет зону изменений и не пропустит регрессию. AI-подход расширяет классический TIA за счёт исторического анализа: какие тесты исторически находили баги в этих компонентах.
Классический TIA vs AI-подход
Классический TIA работает через code coverage mapping: запускает все тесты с инструментацией, записывает какой тест покрывает какой файл, при следующем изменении выбирает только тесты, покрывающие изменённые файлы. Точный, но требует полного coverage-прогона как baseline.
AI-подход добавляет исторический сигнал:
- Тесты, которые исторически падали при изменениях в данном компоненте
- Тесты с высокой семантической близостью к изменённому коду (через code embeddings)
- Тесты, покрывающие функции, использующие изменённые API
class AITestSelector:
def __init__(self, coverage_db, history_db, code_encoder):
self.coverage_db = coverage_db # test → file coverage map
self.history_db = history_db # history of test failures by change
self.encoder = code_encoder # CodeBERT/UniXcoder embeddings
def select_tests(self, changed_files: list[str],
changed_diffs: list[str]) -> list[str]:
# Coverage-based candidates
coverage_tests = self.coverage_db.get_tests_for_files(changed_files)
# History-based candidates
history_tests = self.history_db.get_historically_related(changed_files)
# Semantic similarity candidates
diff_embedding = self.encoder.encode(changed_diffs)
semantic_tests = self.find_semantic_matches(diff_embedding)
# Merge and rank by failure probability
all_candidates = coverage_tests | history_tests | semantic_tests
return self.rank_by_failure_probability(all_candidates, changed_files)
Ранжирование тестов по вероятности падения
После формирования набора кандидатов применяем ранжирующую модель (LightGBM), обученную на истории CI. Признаки для ранжирования:
- Время последнего падения теста при изменении данного компонента
- Cosine similarity между diff-эмбеддингом и эмбеддингом теста
- Глубина покрытия: тест покрывает изменённую строку напрямую или через 2–3 вызова
- Признак «критический тест»: тест связан с платёжным функционалом, аутентификацией и т.д.
- Исторический flakiness score теста
Тесты ранжируются по убыванию failure_probability, CI запускает их в таком порядке — fast feedback приходит быстрее, так как тесты с высоким риском стартуют первыми.
Адаптивный выбор стратегии
Система автоматически переключается между режимами в зависимости от контекста изменений:
| Тип изменения | Стратегия |
|---|---|
| Правка одного файла в известном компоненте | TIA-отбор, ~10–30% тестов |
| Изменение shared utility / common lib | Расширенный отбор, ~50–70% тестов |
| Изменение конфигурации / env variables | Полный прогон |
| Изменение в 10+ файлах (крупный рефакторинг) | Полный прогон |
| Коммит в ветку main/master | Полный прогон |
Метрики реальных проектов
На проекте с 1200 тестами и средним временем прогона 55 минут после внедрения TIA AI:
- Среднее время CI для feature-коммитов: 12 минут (было 55)
- Пропущенных регрессий за 6 месяцев: 0 (safe selection mode)
- Процент запускаемых тестов на коммит: 22% в среднем
Интеграция
Поддержка GitHub Actions, GitLab CI, Jenkins, Buildkite. Плагины для pytest, JUnit, Go test, Jest. Хранение coverage map и исторических данных в PostgreSQL или ClickHouse.
| Тип проекта | Срок внедрения |
|---|---|
| Один язык, один CI | 2–3 недели |
| Несколько языков / микросервисы | 4–6 недель |
| Энтерпрайз (10+ команд) | 6–10 недель |







