MCP-сервер для работы с тестами из ИИ-агентов#27
Conversation
Команда oneunit mcp поднимает MCP-сервер (stdio) на autumn-mcp с двумя инструментами: run_tests выполняет прогон и возвращает структурированный результат (статистика, проблемы с текстами ошибок и стеками, пропущенные тесты, опционально сводка покрытия кода), discover_tests возвращает список полных имен тестов без выполнения. Сопутствующие изменения: - РепортерJSON в ядре: машиночитаемый отчет прогона (статистика, проблемы, пропуски) с подключением по детальке ПутьКОтчетуJSON - Общий желудь ЗапускательТестирования: единая логика запуска прогонов дочерним процессом для команд execute/discover и MCP-инструментов, включая сбор покрытия - Служебные модули cli/internal ожелужены (КонсольноеПриложениеТестирование- Служебный, ЗапускательТестирования), команды получают их пластилином - Канонизация регистра рабочего каталога: отчет покрытия фильтруется по каталогу исходников регистрозависимо, а клиенты (VSCode) передают путь проекта в произвольном регистре - Подняты зависимости: autumn-mcp 1.1.1 (поддержка DI в инструментах), decorator 2.0.8 (исправление подмены Неопределено в обертках) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Warning Review limit reached
Next review available in: 30 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
WalkthroughДобавлены MCP-сервер OneUnit и инструменты ChangesMCP и тестирование
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant MCPClient
participant CommandMCP
participant MCPMain
participant MCPTool
participant TestRunner
participant JSONReport
MCPClient->>CommandMCP: запускает mcp
CommandMCP->>MCPMain: загружает MCP-сервер
MCPMain->>MCPTool: подключает инструмент
MCPTool->>TestRunner: передает фильтры и параметры
TestRunner->>JSONReport: формирует отчет
JSONReport-->>MCPTool: возвращает результаты
MCPTool-->>MCPClient: возвращает ответ
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (1)
tests/MCPИнструменты.os (1)
20-97: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winДобавьте покрытие для параметров 5–9 в
ДеталькиФильтровtests/MCPИнструменты.os:20-97Сейчас тесты проверяют только значения по умолчанию для
ТегиИсключаемые,ТестовыеНаборыВключаемые/ИсключаемыеиТестовыеМетодыВключаемые/Исключаемые. Добавьте хотя бы один кейс с непустыми значениями для этих позиций и проверкой соответствующих полей вДетальки, чтобы не пропустить смещение позиционных аргументов.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tests/MCPИнструменты.os` around lines 20 - 97, Добавьте в область тестов новый сценарий для процедуры ДеталькиФильтров, передав непустые значения в параметры 5–9: ТегиИсключаемые, ТестовыеНаборыВключаемые, ТестовыеНаборыИсключаемые, ТестовыеМетодыВключаемые и ТестовыеМетодыИсключаемые. Проверьте в результате Детальки соответствующие поля с исходными значениями и порядком, чтобы выявить смещение позиционных аргументов.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/cli/internal/Классы/ЗапускательТестирования.os`:
- Around line 174-199: Добавьте внешний тайм-аут вокруг вызова
Команда.Исполнить() в процедуре запуска тестирования, чтобы зависший дочерний
oscript не блокировал MCP-сеанс; используйте существующий механизм тайм-аутов
проекта, корректно прерывайте процесс по истечении времени и сохраняйте текущую
обработку вывода через Команда.ПолучитьВывод().
In `@src/core/internal/Классы/РепортерJSON.os`:
- Around line 64-68: В рекурсивной ветке обработки контейнеров обновите вызов
ОбработатьНабор, передавая полное имя текущего контейнера через Дитя.ПолноеИмя()
вместо родительского ИмяНабора; вызов ОбработатьТест оставьте без изменений.
In `@src/mcp/internal/Классы/MCPИнструментыСлужебный.os`:
- Around line 161-166: В
src/mcp/internal/Классы/MCPИнструментыСлужебный.os#L161-L166 оберните разбор
через ЧтениеJSON и ПрочитатьJSON в Попытка/Исключение, закрывая ЧтениеJSON при
ошибке и возвращая Неопределено; аналогично обработайте разбор ЧтениеXML в
src/mcp/internal/Классы/MCPИнструментыСлужебный.os#L199-L236, гарантируя
закрытие ресурса и возврат Неопределено при исключении, чтобы сохранить откат к
консольному выводу.
In `@src/mcp/Классы/ИнструментВыполнитьТесты.os`:
- Around line 139-185: Оберните операции формирования фильтров, запуска
тестирования, чтения отчета и покрытия в методе инструмента в конструкцию
Попытка/Исключение с гарантированным вызовом МенеджерВременныхФайлов.Удалить().
Сохраните текущее поведение и проброс исключений, обеспечив удаление временных
файлов как при успешном выполнении, так и при ошибке в
_Служебный.ДеталькиФильтров, _Служебный.ВыполнитьТестирование,
_Служебный.ПрочитатьОтчет или _Служебный.СводкаПокрытия.
---
Nitpick comments:
In `@tests/MCPИнструменты.os`:
- Around line 20-97: Добавьте в область тестов новый сценарий для процедуры
ДеталькиФильтров, передав непустые значения в параметры 5–9: ТегиИсключаемые,
ТестовыеНаборыВключаемые, ТестовыеНаборыИсключаемые, ТестовыеМетодыВключаемые и
ТестовыеМетодыИсключаемые. Проверьте в результате Детальки соответствующие поля
с исходными значениями и порядком, чтобы выявить смещение позиционных
аргументов.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: abc62e78-8e59-4076-a080-1684862f77e4
📒 Files selected for processing (19)
.bsl-language-server.jsonREADME.mdpackagedefsrc/cli/internal/Классы/ЗапускательТестирования.ossrc/cli/internal/Классы/КонсольноеПриложениеТестированиеСлужебный.ossrc/cli/main.ossrc/cli/Классы/КомандаMCP.ossrc/cli/Классы/КомандаОбнаружить.ossrc/cli/Классы/КомандаТестировать.ossrc/core/internal/Классы/РепортерJSON.ossrc/core/internal/Классы/РогаткаТестирование.ossrc/mcp/internal/Классы/MCPИнструментыСлужебный.ossrc/mcp/main.ossrc/mcp/Классы/ИнструментВыполнитьТесты.ossrc/mcp/Классы/ИнструментОбнаружитьТесты.ostests/MCPИнструменты.ostests/support/Модули/ЖурналВыполнения.ostests/support/Модули/ПрогоныТестов.ostests/КонсольноеПриложение.os
| Команда = Новый Команда(); | ||
|
|
||
| Команда.УстановитьКоманду("oscript"); | ||
| Команда.УстановитьРабочийКаталог(ТекущийКаталог()); | ||
|
|
||
| Если ФормироватьПокрытие Тогда | ||
| ПутьКСтатистике = МенеджерВременныхФайлов.НовоеИмяФайла("json"); | ||
| Команда.ДобавитьПараметр("-codestat=" + ПутьКСтатистике); | ||
| КонецЕсли; | ||
|
|
||
| Если Параметры.ПортОтладки > 0 Тогда | ||
| Команда.ДобавитьПараметр("-debug=" + Параметры.ПортОтладки); | ||
| КонецЕсли; | ||
|
|
||
| Если СтрНайти(ИмяТочкиВхода, " ") > 0 Тогда | ||
| ИмяТочкиВхода = Команда.ОбернутьВКавычки(ИмяТочкиВхода); | ||
| КонецЕсли; | ||
|
|
||
| Команда.ДобавитьПараметр(ИмяТочкиВхода); | ||
|
|
||
| Если Параметры.ЛогВывода <> Неопределено Тогда | ||
| Команда.ДобавитьЛогВыводаКоманды(Параметры.ЛогВывода); | ||
| КонецЕсли; | ||
|
|
||
| КодВозврата = Команда.Исполнить(); | ||
| Вывод = Команда.ПолучитьВывод(); |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Map the target file and nearby symbols
ast-grep outline "src/cli/internal/Классы/ЗапускательТестирования.os" --view expanded || true
# Read the relevant slice with line numbers
sed -n '150,220p' "src/cli/internal/Классы/ЗапускательТестирования.os" | cat -n
# Search for timeout-related logic in the file and for log-output methods used by this command wrapper
rg -n "Таймаут|Исполнить\(|ДобавитьЛогВыводаКоманды|ПоказыватьВыводНемедленно|ЛогВывода|Команд" "src/cli/internal/Классы/ЗапускательТестирования.os" || true
# Search the repo for references to the 1commands docs wording or immediate output handling
rg -n "ПоказыватьВыводНемедленно|ДобавитьЛогВыводаКоманды|Команда\.Исполнить|Командный файл|зависан" .Repository: sfaqer/OneUnit
Length of output: 4090
Добавьте внешний тайм-аут для Команда.Исполнить() — здесь нет ограничения времени на сам вызов дочернего oscript, а при Параметры.ЛогВывода <> Неопределено вывод еще и транслируется через ДобавитьЛогВыводаКоманды(). Зависший процесс повесит весь MCP-сеанс.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/cli/internal/Классы/ЗапускательТестирования.os` around lines 174 - 199,
Добавьте внешний тайм-аут вокруг вызова Команда.Исполнить() в процедуре запуска
тестирования, чтобы зависший дочерний oscript не блокировал MCP-сеанс;
используйте существующий механизм тайм-аутов проекта, корректно прерывайте
процесс по истечении времени и сохраняйте текущую обработку вывода через
Команда.ПолучитьВывод().
| Если Дитя.ТипОпределения() = ТипыОпределенийТестов.Контейнер Тогда | ||
| ОбработатьНабор(Дитя, ИмяНабора, Проблемы, Пропущенные); | ||
| Иначе | ||
| ОбработатьТест(Дитя, ИмяНабора, Проблемы, Пропущенные); | ||
| КонецЕсли; |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Передавайте корректное имя набора для вложенных контейнеров.
При рекурсивном обходе вложенных наборов тестов в метод ОбработатьНабор передается родительское ИмяНабора. Из-за этого для всех тестов, находящихся глубоко во вложенных наборах, в итоговом JSON-отчете будет ошибочно указано имя самого верхнего (корневого) набора.
Рекомендуется передавать полное имя текущего контейнера (Дитя.ПолноеИмя()), чтобы в отчете корректно сохранялась принадлежность тестов к их фактическим наборам.
🐛 Предлагаемое исправление
Если Дитя.ТипОпределения() = ТипыОпределенийТестов.Контейнер Тогда
- ОбработатьНабор(Дитя, ИмяНабора, Проблемы, Пропущенные);
+ ОбработатьНабор(Дитя, Дитя.ПолноеИмя(), Проблемы, Пропущенные);
Иначе
ОбработатьТест(Дитя, ИмяНабора, Проблемы, Пропущенные);
КонецЕсли;📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| Если Дитя.ТипОпределения() = ТипыОпределенийТестов.Контейнер Тогда | |
| ОбработатьНабор(Дитя, ИмяНабора, Проблемы, Пропущенные); | |
| Иначе | |
| ОбработатьТест(Дитя, ИмяНабора, Проблемы, Пропущенные); | |
| КонецЕсли; | |
| Если Дитя.ТипОпределения() = ТипыОпределенийТестов.Контейнер Тогда | |
| ОбработатьНабор(Дитя, Дитя.ПолноеИмя(), Проблемы, Пропущенные); | |
| Иначе | |
| ОбработатьТест(Дитя, ИмяНабора, Проблемы, Пропущенные); | |
| КонецЕсли; |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/core/internal/Классы/РепортерJSON.os` around lines 64 - 68, В рекурсивной
ветке обработки контейнеров обновите вызов ОбработатьНабор, передавая полное имя
текущего контейнера через Дитя.ПолноеИмя() вместо родительского ИмяНабора; вызов
ОбработатьТест оставьте без изменений.
…ных файлов - ПрочитатьОтчет и СводкаПокрытия возвращают Неопределено вместо исключения, если аварийно завершившийся прогон оставил недописанный отчет - инструмент откатывается к консольному выводу; ресурсы чтения закрываются при ошибке - Временные файлы run_tests удаляются и при исключении прогона: MCP-сервер живет дольше одного вызова, мусор не должен копиться - Тест на различение девяти позиционных параметров ДеталькиФильтров Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Что добавлено
Команда
oneunit mcpподнимает MCP-сервер (Model Context Protocol, stdio) на базе autumn-mcp, позволяющий ИИ-агентам (Claude Code, Cursor и другим MCP-клиентам) работать с тестами проекта напрямую, без разбора консольного вывода.Инструменты
run_testsstatistics,problems(статус, набор, тест, сообщение, стек),skipped_tests; параметрcoverageдобавляет сводку покрытия — общий процент и непокрытые строки по файламdiscover_testsПодключение описано в README (раздел 3), включая конфигурации для Windows (
cmd /c) и Linux/macOS.Сопутствующие изменения
РепортерJSON(core) — машиночитаемый отчёт прогона по деталькеПутьКОтчетуJSON: статусы из настоящих состояний выполнения (failed/broken/skipped/aborted), причины и стекиЗапускательТестирования(cli/internal) — общий желудь запуска прогонов дочерним процессом: одна реализация дляexecute,discoverи MCP-инструментов, включая сбор покрытия (-codestat+ГенераторОтчетаПокрытия)&Пластилин, MCP-инструменты получают сервисы конструктором (требует autumn-mcp 1.1.1)КаноническийРегистрПути): отчёт покрытия фильтруется по каталогу исходников регистрозависимо, а VSCode передаёт путь проекта с маленькой буквой диска — без канонизации покрытие возвращалось пустымautumn-mcp1.1.1,decorator2.0.8 (оба фикса — апстрим-PR из этой работы: DI в инструментах autumn-mcp и подменаНеопределенов обёртках decorator, Исправлена подмена Неопределено на декоратор при отсутствии исходного объекта nixel2007/decorator#28)Тесты
105 тестов (было 77), покрытие src 98.5%. Новые: интеграционные на запускатель (зелёный/красный прогоны, обнаружение, отчёты покрытия), РепортерJSON (проблемы, пропуски, прерванные контейнеры), MCP-обвязка (детальки, разбор JSONL, сводка покрытия, канонизация регистра).
Проверено end-to-end живым MCP-клиентом (Claude Code):
tools/list,run_testsс покрытием на полном наборе тестов проекта,discover_tests.🤖 Generated with Claude Code
Summary by CodeRabbit
Новые возможности
Документация
Тесты