Repository navigation
Перепроектирование исполнителей тестов - #37
Conversation
… границе - Сообщения трансляции и состав плана внутри ядра - прикладные структуры (Номер/Событие/Путь/Результат/Состав, Имя/ИмяМетода/Тип/Дети); английские имена остаются только на границе: КаналСобытийИзоляции (строка stdout процесса), РепортерПланJSON (файл плана), ПереносРезультатов (записи отчета). События трансляции - модуль-перечисление СобытияИзоляции. - Отчет дочернего прогона разбирается один раз (ПереносРезультатов.РезультатыОтчета), транслятор отдает копию результата с измеренным временем (ПереносимыйРезультат). - «Нет значения» - Опциональный вместо Неопределено: поиск в плане, разбор строки канала, чтение состава и отчета, ошибка среды, ретранслятор поделки, перенесенное время результата; перехват вывода - парой методов вместо Неопределено. - Коллекции collectionos и конвейеры вместо циклов, табакерки вместо Поделка.НайтиЖелудь, описания типов со ссылками «см.» на месте типа. - Исправлено: ПереносРезультатов.ЗначениеСвойства никогда не возвращал умолчание - Свойство() обнуляет переменную, если ключа нет. - Тест: изолированные тесты наследуют пропуск набора из отчета дочернего прогона. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Первый шаг перепроектирования исполнителей, поведение не меняется: - ВызовМетода.Вызвать - вызов метода так, как исполняется код тестов: фоновое задание с таймаутом, перехват вывода, исключение -> состояние выполнения; значение метода - Опциональный. Вывод читается ТестированиеСлужебный.ПрочитатьПоток, как у изоляции. - ФабрикаЭкземпляров.Экземпляр - единственное место создания экземпляра набора (исполнитель, условия, &ИсточникВыражение, совет изоляции), возвращает Опциональный: пустой - autumn проглотил исключение конструктора. У ОпределениеТестНабора вместо ТестНабор() и поделки - ИмяЖелудя(). - Лямбды условий, источника-выражения и совета захватывают экземпляр, только если он есть; Выполнять условий принимает Опциональный. - Тест: выключенный набор со сломанным конструктором остается пропущенным. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Второй шаг перепроектирования исполнителей: - ДиспетчерТестов раздает узлы плана исполнителям и публикует начало и конец плана и каждого розданного узла; прекращение на первом падении (флаг - АтомарноеБулево, зависимость atomic 0.1.1) и отметка незапущенных узлов - здесь же. МенеджерТестирования исполняет план через него. - Узел знает своего исполнителя: обнаружитель записывает в набор и тест имя желудя-исполнителя (модуль ИсполнителиТестов) по описанию изоляции. У узлов добавлен Набор(). - Исполнитель возвращает результат узла через Исполнить(Узел), событий не публикует. Асинхронный отдает детей набора и контейнера диспетчеру, ИсполнительИзоляции возвращает результат среды. - Условия изолированного теста проверяются в его среде, как условия изолированного набора; пропущенный там контейнер приходит без итераций. - В ИсполнительИзоляции "Фреш*" переименованы в "*Среды". Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…льным шагом Третий шаг перепроектирования исполнителей: - ИсполнительИзоляции разделен на ПоделочныйИсполнительТестов (свежая поделка) и ПроцессныйИсполнительТестов (дочерний процесс); обнаружитель выбирает исполнителя узла по уровню изоляции. - Исполнитель умеет Развернуть(Набор) - обнаружить состав набора в своей среде для чистого обнаружения. МенеджерТестирования.Обнаружить() после обнаружителя раздает наборы на разворачивание через диспетчер; обнаружитель больше не зависит от изоляции. - Описание изоляции узла - Опциональный вместо Неопределено. - Причина "тест не был выполнен в изолированной среде" - общая, ПереносРезультатов.ПричинаТестНеВыполнен. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Четвертый шаг перепроектирования исполнителей: - Ошибки обнаружения - свойство узла плана (ОшибкиОбнаружения, у плана - ЕстьОшибкиОбнаружения). Их записывают обнаружитель (отказ поставщика контекста шаблона, неверное объявление &Изолированный) и диспетчер (отказ разворачивания изолированного набора - вместо предупреждения в лог). - Шаблон, итерации которого не удалось получить, становится тестом со своей ошибкой обнаружения: так его видят статистика и все отчеты. Набор с неверным объявлением изоляции сломан целиком. - Если экземпляра набора нет, а выражение источника упало, первая причина - "Не удаётся инстанцировать тестовый набор", ошибка выражения - ее причина. - При исполнении узел с ошибками обнаружения сломан без исполнителя. - discover выводит такой узел в дереве и плоском списке со значком и причиной на его месте и завершается с ненулевым кодом; MCP discover_tests отдает tests и problems; ошибки доходят из изолированных сред в JSON-составе плана. - В репортерах дерева и плоского списка "нет результата" - Опциональный, убрано неиспользуемое поле кодировок. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Пятый шаг перепроектирования исполнителей: - Экземпляры компанейского набора: один - на условия набора и ПередВсеми, свой - на ПослеВсех (если такие методы есть), по одному на тест - на его условия, ПередКаждым, тест и ПослеКаждого; контейнеру экземпляр нужен только для условий. Отказ создания проверяется после условий: выключенный набор со сломанным конструктором остается пропущенным, а тест без экземпляра сломан, а не роняет прогон. - ФабрикаЭкземпляров.Создать перехватывает вывод создания: лог autumn с исключением конструктора - корень причины "Не удаётся инстанцировать тестовый набор". Условие, выражение источника и лямбда совета, которым нужен несозданный экземпляр, ломают узел цепочкой: отказ создания, ошибка кода, исключение конструктора (ВызватьОтказ). На уровне "Процесс" ту же цепочку печатает точка входа дочернего процесса. - discover ничего не пишет до плана: у узла краткая причина, подробные причины с цепочками - блоками после плана в любом режиме вывода (РепортерСтатистика.ВывестиОшибкиОбнаружения); отказ обнаружения процессного набора - причина с выводом ребенка; MCP discover_tests отдает в problems.message полную цепочку. - Перехваченный вывод не выбрасывается: ИсключениеСВыводом - прозрачная обертка ошибки, которая несет вывод упавшего кода как контекст. Вывод условий (и у пропущенных), конструктора, выражения источника (с узла шаблона - в вывод контейнера), совета изолированного набора и отказа среды попадает в вывод узла; вывод совета больше не рвет вывод прогона. - Тесты: экземпляры по журналу, отказы создания и их цепочки, вывод вне тестов, вывод совета и источника, discover и MCP; модуль поддержки ЦепочкиПричин. ЖизненныйЦиклВыполняетсяПоПорядку прогоняет свою фикстуру сам - журнал общий. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ется Исправления по ревью ветки относительно master: - Условия изолированного узла сначала проверяются в текущем прогоне (ПроверкаУсловийИзоляции): выключенный узел пропускается, не поднимая ни поделки, ни дочернего процесса. Условия изолированного теста - на экземпляре его набора, условия изолированного набора - без экземпляра (конструктор вне своей среды не выполняется); упавшее условие решает среда, а не выключенный узел среда проверяет заново. - Условия проверяются раньше ошибок обнаружения: выключенный шаблон с битым источником пропущен, а не сломан. Узел, который не удалось обнаружить, исполнитель текущей поделки проверяет условиями и ломает своими ошибками. - Вывод не теряется: вывод совета "Поделки" и самой поделки идет с отказом среды; вывод лямбды совета уровня "Процесс" точка входа передает родителю сообщением канала (ВыводСовета); вывод конструктора при отброшенном отказе создания (пропуск, контейнер, удачная лямбда) - в выводе узла; JSON-отчет и MCP несут output у проблем и пропусков, процессный тест наследует вывод упавшего набора. - ФабрикаЭкземпляров: ВычислитьНаЭкземпляре - общая для совета и выражения источника; сбой поделки при создании - отказ, а не падение прогона. - Пересозданное звено цепочки причин показывает модуль, строку и стек исходной ошибки (ТестированиеСлужебный.ОшибкаСПричиной, ИсключениеСПричиной). - Точка входа процесса не создает набор с параметрами конструктора: отказ лямбды без захвата не приписывается созданию набора. - Неверный &Изолированный на тесте изолированного набора ломает тест. - Примеры аннотаций условий: причина - именованным параметром Причина, позиционный второй аргумент ломает загрузку набора. - Убраны ЗначенияПоляЛога, недостижимый разбор обертки в ВызовМетода и прочий мертвый код; ЦепочкиПричин проверяет звенья по границам "По причине:". Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configuration
📒 Files selected for processing (21)
🚧 Files skipped from review as they are similar to previous changes (1)
Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review. WalkthroughИзменена архитектура обнаружения и выполнения тестов. Ошибки обнаружения сохраняются в плане; исполнители обрабатывают обычные и изолированные узлы. Вывод, причины ошибок и результаты передаются через отчёты, CLI и MCP. ChangesОбнаружение и выполнение тестов
Priority: ➖ Normal Estimated code review effort: 4 (Complex) | ~60 minutes Change: Feature · Severity of issue fixed: Medium Sequence Diagram(s)sequenceDiagram
participant Dispatcher as ДиспетчерТестов
participant Executor as ПроцессныйИсполнительТестов
participant Child as Дочерний прогон
participant Channel as КаналСобытийИзоляции
participant Relay as РетрансляторСобытийИзоляции
Dispatcher->>Executor: передаёт изолированный узел
Executor->>Child: запускает тест или обнаружение набора
Child->>Channel: передаёт события, состав и вывод совета
Channel->>Relay: преобразует сообщения и передаёт данные
Relay->>Dispatcher: публикует результаты и события узлов
Merge Risk: ⚪ Minimal · up to No actionable merge-blocking issue is established; the change is mergeable after normal checks. 🚥 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 |
sfaqer
left a comment
There was a problem hiding this comment.
Ревью ветки feature/executors: 9 замечаний в комментариях к строкам.
Возможные ошибки (стоит подтвердить тестом):
КонструкторБезПараметровне учитывает параметры со значениями по умолчанию.- Условия изолированных узлов вычисляются в родительском окружении, и пропуск там окончательный.
ПостроитьСоветсоздаёт экземпляр изолированного набора вне его окружения.
Чистота кода: двойная проверка ошибок обнаружения, двойное создание экземпляра набора, дублирование РезультатОбнаружения, ручной перехват вывода в шести местах, расхождение логики публикации дочерних результатов, лишняя зависимость atomic.
Generated by Claude Code
…цессе Исправления по ревью PR #37: - Перехват вывода - в одном месте: ТестированиеСлужебный.ВыполнитьСПерехватомВывода возвращает значение, вывод и ошибку и завершает перехват при любом исходе, ВычислитьСПерехватомВывода компилирует лямбду внутри перехвата, ВыполнитьМимоПерехватаВывода снимает перехват на время вызова. Фабрика экземпляров, обнаружитель, ВызовМетода, поделочный исполнитель и точка входа ребенка больше не перехватывают вывод вручную, ретранслятору не нужен поток перехвата. Ошибка вне своего обработчика выбрасывается прозрачной оберткой ВызватьСВыводом и с пустым выводом. - Условия узла с Импорты в родителе не проверяются: они могут зависеть от библиотек, которые подключают только импорты, - узел всегда уходит в свой процесс. - Точка входа ребенка создает набор для лямбды совета и тогда, когда все параметры его конструктора необязательные. - РезультатОбнаружения - один, в РепортерСтатистика, а не копией в двух лог-репортерах. - Комментарий и README: ради условий конструктор изолированного набора вне среды не выполняется, для лямбды совета уровня "Поделка" - выполняется. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
sfaqer
left a comment
There was a problem hiding this comment.
Повторное ревью после 752f18b: новых замечаний нет, CI зелёный на всех шести конфигурациях.
Исправлено и проверено:
КонструкторБезПараметровсмотрит наЕстьЗначениеПоУмолчанию, поэтому набор с необязательными параметрами конструктора снова создаётся напрямую. Тест на это есть.- Узел с
Импортыв родителе не проверяется: условия решает только его процесс. Узлы без импортов, как и раньше, проверяются заранее; оставшийся риск описан в README. РезультатОбнаружениявынесен вРепортерСтатистика, копий в лог-репортерах больше нет.- Перехват вывода сведён к
ВыполнитьСПерехватомВывода/ВычислитьСПерехватомВывода/ВыполнитьМимоПерехватаВывода, ручных копий не осталось. Перехват завершается при любом исходе.ВыполнитьМимоПерехватаВыводавосстанавливает именно тот поток, который снял, и это надёжнее прежнего_ПотокПерехвата.
Отдельно проверил смену поведения: ошибка с пустым выводом теперь тоже оборачивается в ИсключениеСВыводом. Это безопасно, потому что КраткоеОписаниеОшибки, ПодробноеОписаниеОшибки и РазобратьОшибку обрабатывают обёртку прозрачно, а СостояниеИсключения в ВызовМетода получает ошибку без обёртки.
Оставлено с объяснением, согласен: перенаправление сломанных узлов в диспетчере, второй экземпляр набора для совета на уровне «Поделка», РезультатТестаСреды в двух исполнителях, АтомарноеБулево. Экземпляр для лямбды совета уровня «Поделка» по-прежнему создаётся вне среды, но теперь это явно описано в ПроверкаУсловийИзоляции и README.
Generated by Claude Code
|
@coderabbitai review |
✅ Action performedReview finished.
|
Что сделано
Исполнение тест-плана разложено на роли: диспетчер раздаёт узлы, исполнители исполняют их каждый в своей среде, службы вызывают методы и создают экземпляры наборов.
ВызовМетода,ФабрикаЭкземпляров): вызов методов в фоне с таймаутом и перехватом вывода; единственное место создания экземпляров набора.ИсполнительИзоляции. Обнаружение состава изолированных наборов дляdiscover— отдельным шагом (ДиспетчерТестов.Развернуть).&Изолированный— узел сломан с причиной, остальной план исполняется; ошибки доходят из изолированных сред.ПередВсеми, наПослеВсех, на каждый тест. Отказ создания — цепочка причин: «Не удаётся инстанцировать тестовый набор» ← ошибка кода ← исключение конструктора.discoverничего не пишет до плана: у узла краткая причина, подробные цепочки — после плана.system-out, JSON/MCPoutput).Причина(позиционный второй аргумент ломает загрузку набора).Проверка
Полный прогон — 203 из 203. Новое поведение проверено мутациями: откат каждого исправления роняет его тест.
🤖 Generated with Claude Code
Summary by CodeRabbit
oneunit discoverвозвращает ненулевой код при таких ошибках.