Изоляция тестов аннотацией &Изолированный#28
Conversation
Тест или весь набор выполняется в изоляции - свежей поделке или отдельном дочернем процессе - как будто набор прогнали только с этим тестом: - уровни "Поделка" и "Процесс", гранулярность набора и отдельного теста; - совет создания изолированной поделки лямбдой в контексте набора, на уровне процесса через границу переезжает только текст лямбды; - отложенные импорты уровня "Процесс" для библиотек, ядовитых уже при подключении; - сдерживание отказов: падение изолированной среды ломает только набор, с причиной, выводом дочернего прогона и без служебных стеков; - обнаружение (discover, MCP) показывает фактический состав изолированных наборов, разворачивая их в собственных средах без исполнения; - покрытие кода включает изолированные процессные прогоны: статистика дочерних процессов складывается в общий каталог и мержится в отчеты. Попутно обнаружитель перестал разворачивать наборы чужих поделок процесса (аннотированные типы глобальны, прогоны в свежих поделках зацикливались) и исправлена вклейка контейнеров изолированного набора. 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 (4)
WalkthroughДобавлена поддержка изоляции тестов и наборов в поделке или отдельном процессе. Реализованы обнаружение, дочерние прогоны, перенос отчетов и ошибок, покрытие, конфигурация точек входа, документация и интеграционные тесты. ChangesИзоляция тестов
Estimated code review effort: 5 (Critical) | ~120 minutes Sequence Diagram(s)sequenceDiagram
participant ТестовыйРаннер
participant ОбнаружительТестов
participant ИсполнительИзоляции
participant ДочернийПрогон
participant РодительскийПлан
ТестовыйРаннер->>ОбнаружительТестов: обнаруживает изолированный набор
ОбнаружительТестов->>ИсполнительИзоляции: передаёт описание изоляции
ИсполнительИзоляции->>ДочернийПрогон: запускает discover или тестирование
ДочернийПрогон-->>ИсполнительИзоляции: возвращает JSON-план или отчет
ИсполнительИзоляции->>РодительскийПлан: переносит узлы, статусы, причины и события
Possibly related PRs
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: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/core/internal/Классы/РепортерJSON.os (1)
65-127: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy liftJSON-контракт не позволяет восстановить контейнеры процессного прогона.
Репортёр сериализует только плоские листья, после чего исполнитель создаёт из них прямых потомков набора. Это меняет структуру повторяемых/параметризованных тестов и не переносит собственные результаты контейнеров.
src/core/internal/Классы/РепортерJSON.os#L65-L127: сериализуйте контейнеры, их тип, родителя и результат либо передавайте дерево.src/core/internal/Классы/ИсполнительИзоляции.os#L568-L659: восстанавливайте дерево рекурсивно и публикуйте события и результаты контейнеров.🤖 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 65 - 127, Измените src/core/internal/Классы/РепортерJSON.os:65-127 в процедурах ОбработатьНабор, ОбработатьТест и функции ЗаписьТеста, чтобы сериализовать контейнеры вместе с их типом, родителем и собственным результатом, сохранив дерево вместо плоского списка листьев. В src/core/internal/Классы/ИсполнительИзоляции.os:568-659 измените восстановление дерева на рекурсивное по этим связям и обеспечьте публикацию событий и результатов контейнеров; структура повторяемых и параметризованных тестов должна полностью сохраняться.
🧹 Nitpick comments (2)
tests/Изоляция.os (2)
382-400: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy liftПроверяйте объединенное покрытие, а не только наличие сырой статистики.
Наличие
stat_*.jsonподтверждает запись данных, но не их объединение родителем. Ошибка в механизме merge пройдет этот тест. Проверьте итоговый отчет на строке, исполняемой исключительно в изолированном дочернем процессе.🤖 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/Изоляция.os` around lines 382 - 400, Обновите тест ИзолированныйПроцессПишетСтатистикуПокрытия: вместо проверки только наличия файлов stat_*.json проверьте итоговый объединенный отчет покрытия, сформированный родительским процессом. Добавьте проверку строки, исполняемой исключительно в изолированном дочернем процессе, чтобы тест выявлял ошибки merge, сохранив очистку МенеджерВременныхФайлов.
241-254: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winПроверьте фактический вывод дочернего процесса.
Сейчас проверяется лишь родительская фраза «завершился аварийно». Потеря захваченного stdout/stderr ребенка останется незамеченной. Добавьте проверку устойчивого фрагмента ошибки из JSON-источника, например имени
НеТотПараметр.🤖 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/Изоляция.os` around lines 241 - 254, Дополните процедуру АварийныйДочернийПроцессЛомаетНаборСВыводом проверкой захваченного вывода дочернего процесса: в описании причины из Результат.ОписанияПричин() найдите устойчивый фрагмент ошибки из JSON-источника, например «НеТотПараметр», сохранив существующую проверку фразы «завершился аварийно».
🤖 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/core/internal/Классы/ИсполнительИзоляции.os`:
- Around line 538-559: Обеспечьте восстановление исходного текущего каталога при
любом исключении внутри функции Импорты, включая ошибки ФС.НормализоватьПуть.
Используйте механизм гарантированного выполнения, охватывающий цикл обработки
импортов, и сохраните текущие результаты для успешного выполнения.
In `@src/shared/Классы/ПостроительТочкиВхода.os`:
- Around line 448-470: В цикле чтения конфигурации вокруг ПрочитаннаяСтрока
пропускайте пустые строки и строки-комментарии, не обращаясь к элементу [1].
Разбирайте запись только по первому символу "=" и удаляйте пробелы вокруг Ключ и
Значение, чтобы формат «ключ = значение» корректно обрабатывал lib.*; сохраните
существующую обработку значений после нормализации.
In `@tests/fixtures/isolation/НаборСБитойЛямбдойСовета.os`:
- Around line 20-22: Добавьте модификатор Экспорт к процедуре ПриСозданииОбъекта
в тестовом наборе &ТестовыйНабор, чтобы конструктор стал доступен встроенной
рефлексии и аннотация корректно обнаруживалась.
---
Outside diff comments:
In `@src/core/internal/Классы/РепортерJSON.os`:
- Around line 65-127: Измените src/core/internal/Классы/РепортерJSON.os:65-127 в
процедурах ОбработатьНабор, ОбработатьТест и функции ЗаписьТеста, чтобы
сериализовать контейнеры вместе с их типом, родителем и собственным результатом,
сохранив дерево вместо плоского списка листьев. В
src/core/internal/Классы/ИсполнительИзоляции.os:568-659 измените восстановление
дерева на рекурсивное по этим связям и обеспечьте публикацию событий и
результатов контейнеров; структура повторяемых и параметризованных тестов должна
полностью сохраняться.
---
Nitpick comments:
In `@tests/Изоляция.os`:
- Around line 382-400: Обновите тест
ИзолированныйПроцессПишетСтатистикуПокрытия: вместо проверки только наличия
файлов stat_*.json проверьте итоговый объединенный отчет покрытия,
сформированный родительским процессом. Добавьте проверку строки, исполняемой
исключительно в изолированном дочернем процессе, чтобы тест выявлял ошибки
merge, сохранив очистку МенеджерВременныхФайлов.
- Around line 241-254: Дополните процедуру
АварийныйДочернийПроцессЛомаетНаборСВыводом проверкой захваченного вывода
дочернего процесса: в описании причины из Результат.ОписанияПричин() найдите
устойчивый фрагмент ошибки из JSON-источника, например «НеТотПараметр», сохранив
существующую проверку фразы «завершился аварийно».
🪄 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: 121e9d4d-801a-4114-aa7f-961d5802f892
📒 Files selected for processing (49)
.bsl-language-server.jsonREADME.mddocs/api/Аннотации/Изолированный.mdlib.configsrc/cli/internal/Классы/КонсольноеПриложениеТестированиеСлужебный.ossrc/cli/main.ossrc/core/internal/Классы/АсинхронныйИсполнительТестов.ossrc/core/internal/Классы/ЗаготовкаТестирование.ossrc/core/internal/Классы/ИсполнительИзоляции.ossrc/core/internal/Классы/ОбнаружительТестов.ossrc/core/internal/Классы/ОпределениеТестНабора.ossrc/core/internal/Классы/ОпределениеТеста.ossrc/core/internal/Классы/РепортерJSON.ossrc/core/internal/Классы/РепортерПланJSON.ossrc/core/internal/Модули/УровниИзоляции.ossrc/core/Классы/АннотацияИзолированный.ossrc/core/Классы/МенеджерТестирования.ossrc/mcp/internal/Классы/MCPИнструментыСлужебный.ossrc/shared/Классы/ЗапускательТестирования.ossrc/shared/Классы/ПостроительТочкиВхода.ossrc/shared/Модули/ТестированиеСлужебный.ostests/MCPИнструменты.ostests/fixtures/broken/НаборСНевернойИзоляцией.ostests/fixtures/isolation/ИзолированныйБитыйНабор.ostests/fixtures/isolation/ИзолированныйЗеленыйНабор.ostests/fixtures/isolation/ИзолированныйНаборСПовторяемымТестом.ostests/fixtures/isolation/ИзолированныйНаборСПустымСоветом.ostests/fixtures/isolation/ИзолированныйНаборССоветомИзМетода.ostests/fixtures/isolation/ИзолированныйНевидимыйНабор.ostests/fixtures/isolation/ИзолированныйОбъектныйНабор.ostests/fixtures/isolation/ИзолированныйПоделочныйКрасныйНабор.ostests/fixtures/isolation/ИзолированныйПроцессныйБитыйНабор.ostests/fixtures/isolation/ИзолированныйПроцессныйКрасныйНабор.ostests/fixtures/isolation/ИзолированныйПроцессныйНабор.ostests/fixtures/isolation/ИзолированныйПроцессныйНаборСПропуском.ostests/fixtures/isolation/ИзолированныйПроцессныйПовторяемыйНабор.ostests/fixtures/isolation/ИзолированныйПроцессныйСоветныйНабор.ostests/fixtures/isolation/ИзолированныйСоветныйНабор.ostests/fixtures/isolation/Модули/ГенераторИзоляции.ostests/fixtures/isolation/НаборПадающийВИзоляции.ostests/fixtures/isolation/НаборПропускаемыйВИзоляции.ostests/fixtures/isolation/НаборСБитойЛямбдойСовета.ostests/fixtures/isolation/НаборСИзолированнымиТестами.ostests/fixtures/isolation/НаборСНевидимымИзолированнымТестом.ostests/fixtures/isolation/НаборСПроцесснымПовторяемымТестом.ostests/fixtures/isolation/ОшибочныеКлассы/ДваЖелудяСОднимИменем/Классы/Желудь1.ostests/fixtures/isolation/ОшибочныеКлассы/ДваЖелудяСОднимИменем/Классы/Желудь2.ostests/Изоляция.ostests/КонсольноеПриложение.os
💤 Files with no reviewable changes (1)
- src/cli/internal/Классы/КонсольноеПриложениеТестированиеСлужебный.os
| &ТестовыйНабор | ||
| Процедура ПриСозданииОбъекта() | ||
| КонецПроцедуры |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Добавьте модификатор Экспорт для конструктора набора.
Для того чтобы фреймворк тестирования смог корректно обнаружить аннотацию &ТестовыйНабор через рефлексию, метод ПриСозданииОбъекта должен быть экспортным (встроенная рефлексия OneScript возвращает только экспортные методы).
🐛 Рекомендуемое исправление
&ТестовыйНабор
-Процедура ПриСозданииОбъекта()
+Процедура ПриСозданииОбъекта() Экспорт
КонецПроцедуры📝 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 `@tests/fixtures/isolation/НаборСБитойЛямбдойСовета.os` around lines 20 - 22,
Добавьте модификатор Экспорт к процедуре ПриСозданииОбъекта в тестовом наборе
&ТестовыйНабор, чтобы конструктор стал доступен встроенной рефлексии и аннотация
корректно обнаруживалась.
- ПостроительТочкиВхода.ПрочитатьКонфигурационныйФайл: пропускает пустые строки и строки-комментарии (начинаются с "#") вместо падения на индексации несуществующего второго элемента расщепленной по "=" строки; запись разбирается по первому "=" с обрезкой пробелов вокруг ключа и значения - закрывает #25. - ИсполнительИзоляции.Импорты: восстанавливает текущий каталог процесса при исключении (например, из ФС.НормализоватьПуть на неверном пути импорта) перед тем как отдать его дальше - иначе каталог остается подмененным для остального прогона. - Тесты: регрессия на комментарии/пустые строки в oscript.cfg; проверка, что причина аварийного дочернего прогона содержит исходную ошибку из его вывода, а не только обёрточное сообщение. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Что сделано
Аннотация
&Изолированныйвыполняет тест или весь набор в изоляции — так, как будто набор прогнали только с этим тестом. Снаружи это обычные тесты: статусы, причины и выводы попадают в общий план, репортёры и статистика об изоляции не знают.Уровни и гранулярность
Уровень = "Поделка"(по умолчанию) — тот же процесс, свежая поделка. Защищает от протечек состояния желудей.Уровень = "Процесс"— отдельный дочерний процесс. Защищает от того, что поделкой не лечится: глобальная система типов, падающие импорты,ЗавершитьРаботу.&ТестовыйНабор— весь набор одним контекстом, на тесте — каждый тест своим (с полным жизненным циклом набора).Совет создания изолированной поделки
Параметр
Совет— лямбда в контексте набора, возвращающаяСоветДругогоМастера(механика как у&ИсточникВыражение). На уровне «Процесс» через границу переезжает только текст лямбды: она исполняется в дочернем процессе с захватом экземпляра набора, поднятого черезНовый, поэтому детальки совета не ограничены сериализуемостью. Закрывает кейсы ручной сборки поделок в тестах (autumn, autumn-data).Отложенные импорты
Импорты(только уровень «Процесс») подключаются в дочернем процессе после старта его поделки — библиотека, ломающая скан типов уже при подключении, уводится из родительского процесса. Закрывает кейсautumn/tests/ИзолированныеТесты, которые сейчас гоняются по одному в отдельных task'ах.Сдерживание отказов и диагностика
Падение изолированной среды ломает только набор/тест, прогон продолжается. Причины переносятся структурно и неотличимы от нативных (без служебных стеков обёртки), при аварии дочернего процесса в причину попадает его вывод. Вывод дочерних прогонов не рвёт консольное дерево родителя.
Обнаружение и покрытие
discoverи MCPdiscover_testsпоказывают фактический состав изолированных наборов — состав обнаруживается в изолированной среде без исполнения тестов.Попутно
ЗапускательТестированияпереехал из cli/internal в shared, из него выделенПостроительТочкиВхода.Тесты
139/139, покрытие src 97.4%. Изоляция покрыта 31 тестом на 23 фикстурах: все срезы уровень × гранулярность, советы (значение, объект, метод набора, многострочная лямбда), контейнеры, пропуски, наследование падения набора, аварийные дочерние процессы, обнаружение, перенос покрытия.
🤖 Generated with Claude Code
Summary by CodeRabbit
Новые возможности
&Изолированныйдля запуска тестов и наборов в отдельной поделке или процессе.Документация
Исправления