Умная регрессия — запускайте только тесты, на которые влияет изменение
Умная регрессия анализирует файлы, изменённые в коммите, и сообщает,
какие тест-кейсы действительно нужно прогнать — вместо перезапуска всего
набора на каждый push. Это анализ влияния тестов (Test Impact
Analysis) для CI: вы отправляете список изменённых файлов, Mockarty
возвращает затронутый набор тестов плюс вердикт безопасности, а ваш
пайплайн прогоняет только это подмножество.
Это детерминированно — без ИИ, без обучения, без модели. Отбор —
прямое сопоставление изменённых файлов с записанным расположением
исходника каждого теста плюс два «всегда-прогонять» бакета безопасности.
Что попадает в отбор
Отобранный набор — это объединение до четырёх бакетов:
| Бакет | Почему прогоняется |
|---|---|
| Затронут по пути | Исходная ссылка теста совпадает с изменённым файлом. |
| Ранее упал | Последний прогон теста упал — перепроверить исправление. |
| Ни разу не прогонялся | У теста нет истории прогонов — предсказать нельзя, прогоняем всегда. |
| Несопоставимый (только conservative) | Тест прогонялся, но без исходной ссылки — diff по путям не может о нём судить, прогоняем на всякий случай. |
Профили риска
Выберите, насколько агрессивно сужать набор:
conservative(по умолчанию) — все четыре бакета, включая
несопоставимые тесты. Безопаснее всего; никогда не пропускает тест,
о котором анализ не может судить.standard— затронутые ∪ ранее-упавшие ∪ ни-разу-не-прогонявшиеся.fast— только затронутые по пути. Минимальный набор, выше риск;
используйте, когда у тестов полные исходные ссылки.
Защита от ошибок (fail-safe)
Если об изменении нельзя судить — нет изменённых файлов, нет покрытия
исходными ссылками или нет тест-кейсов — вердикт inconclusive
(неопределённо), и следует прогнать полный план. Умная регрессия
никогда не пропускает тест молча при неопределённости.
Использование в CI (CLI)
CLI собирает diff и запрашивает сервер:
mockarty-cli util ci impact \
--server https://mockarty.example.com \
--base origin/main --head HEAD \
--namespace my-team \
--risk conservative \
--allure-out testplan.json
Вывод:
✓ 12 test case(s) selected from 7 changed file(s)
risk=conservative buckets: affected-by-path=4 previously-failed=2 never-run=5 unmappable=1 (union=12)
wrote Allure testplan (12 tests) → testplan.json
--allure-out пишет стандартный файл тест-плана. Укажите его вашему
раннеру (ALLURE_TESTPLAN_PATH=testplan.json) — и он прогонит только
отобранное подмножество. Когда вердикт неопределённый, файл не
пишется — пайплайн должен прогнать полный план.
SDK Mockarty для Go, Python и Java читают этот файл «из коробки» и, если он
пуст или битый, отказываются от прогона, а не откатываются молча к полному.
Точное поведение и формы селекторов для каждого языка — в разделе
Выборочный прогон (тест-планы).
Собрать Mockarty Test Plan
Вместо экспорта файла для внешнего раннера можно попросить Mockarty
собрать Test Plan ровно из отобранных кейсов и (опционально) запустить его:
mockarty-cli util ci impact \
--base origin/main --head HEAD --namespace my-team \
--assemble-plan \
--plan-name "Регресс PR #482" \
--run
--assemble-plan создаёт план и печатает его id (advisory — человек может
посмотреть и запустить из UI). Добавьте --run, чтобы сразу стартовать
оркестрированный прогон и получить id прогона. Когда вердикт неопределённый,
план не собирается (прогоните полный план).
GitHub Actions
name: smart-regression
on: pull_request
jobs:
impact:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # полная история, чтобы был доступен base ref
- name: Вычислить затронутые тесты
env:
MOCKARTY_SERVER: ${{ secrets.MOCKARTY_SERVER }}
MOCKARTY_API_TOKEN: ${{ secrets.MOCKARTY_API_TOKEN }}
run: |
mockarty-cli util ci impact \
--base "origin/${{ github.base_ref }}" --head HEAD \
--namespace my-team --risk conservative \
--allure-out testplan.json
- name: Прогнать отобранные тесты
env:
ALLURE_TESTPLAN_PATH: testplan.json
run: ./run-tests.sh # ваша существующая команда тестов
Влияние на потребителей (не сломало ли изменение сервис ниже по цепочке?)
Если изменение затрагивает сервис, для которого вы публикуете контракт,
передайте id его записи в реестре — и Умная регрессия дополнительно
проверит, не сломает ли изменение какого-либо потребителя этого
сервиса:
mockarty-cli util ci impact --base origin/main --head HEAD \
--provider-entry <registry-entry-id> \
--fail-on-consumer-break
С --fail-on-consumer-break команда завершится с ненулевым кодом, если
потребитель сломается, останавливая пайплайн. Без флага проверка
рекомендательная (сообщается, но не блокирует).
API
POST /api/v1/ci/impact?namespace=my-team
{
"changedFiles": ["src/api/user.go", "src/login.py"],
"base": "origin/main", "head": "HEAD",
"risk": "conservative",
"providerRegistryEntryIds": ["<id>"],
"assemblePlan": true,
"runAfterAssemble": false,
"planName": "Регресс PR #482"
}
Ответ содержит selectedCaseIds, selectedCases (id + selector),
по-бакетный buckets, вердикт inconclusive + reason и опциональный
блок consumerImpact. Когда задан assemblePlan (и вердикт определённый),
ответ также несёт assembledPlanId (и assembledRunId, если задан
runAfterAssemble).
Для ИИ-агентов
Тот же анализ доступен агентской сети как инструмент
analyze_regression_impact (группа Test Plans). Автономный агент,
рассуждающий «что мне перепрогнать после этого изменения?», получает тот
же отбор, fail-safe-вердикт и влияние на потребителей, что человек или
CI-пайплайн.
Примечания
- Отбор ограничен вашим пространством; вы никогда не видите тесты другой
команды. - Точность зависит от полноты исходных ссылок тестов — тесты,
обнаруженные из вашего кода или импортированные с картой расположения,
сопоставляются точно; тесты без неё попадают в безопасный бакет
«несопоставимые» при профиле conservative.