From ccd860ae8998a4259a5de24ed4365e1b84ea3ae2 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Tue, 4 Aug 2026 14:13:58 +0300 Subject: [PATCH] =?UTF-8?q?docs(tests):=20=D1=8D=D1=82=D0=B0=D0=BB=D0=BE?= =?UTF-8?q?=D0=BD=20=D0=BF=D1=80=D0=B8=20preRun=20=D1=84=D0=B8=D0=BA=D1=81?= =?UTF-8?q?=D0=B8=D1=80=D1=83=D0=B5=D1=82=20=D0=B2=D1=85=D0=BE=D0=B4=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit README называл info/validate-навыки типичным случаем для noSnapshot: эталон зафиксировал бы выход preRun, а не проверяемого навыка. Факт верный, вывод — нет. Когда preRun собирает фикстуру, эталон фиксирует ВХОД теста. Без него дрейф навыка-генератора меняет фикстуру молча, и ожидание вроде «Составной (6)» начинает проверяться на другом объекте — либо падает без внятной причины, либо сходится случайно и перестаёт что-либо проверять. meta-compile такой дрейф даёт регулярно. Поэтому ни один из семи info-навыков noSnapshot не использует — у всех эталоны, и это осознанно, а не упущение. Правило сформулировано явно: есть preRun с генерацией фикстуры → эталон; нет preRun или фикстура тривиальна → noSnapshot. В шапке verify-snapshots отмечено, что он работает и с кейсами навыков, которые сами ничего не пишут, — там он проверяет, что платформа принимает собранную preRun фикстуру. Плюс предупреждение, что на кейсах setup: external проверка вырождается в загрузку 1С собственной выгрузки: ~3 минуты на кейс без пользы. Co-Authored-By: Claude Opus 5 --- tests/skills/README.md | 15 +++++++++++++-- tests/skills/verify-snapshots.mjs | 4 ++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/tests/skills/README.md b/tests/skills/README.md index 16923a35..92ca6db6 100644 --- a/tests/skills/README.md +++ b/tests/skills/README.md @@ -293,8 +293,19 @@ ibcmd-проход автоматически `○ skipped`, если рядом } ``` -Типичный случай — навык ничего не пишет в рабочую директорию (info/validate): эталон зафиксировал бы -выход `preRun`, а не проверяемого навыка, и дублировал бы эталоны того навыка. +Типичный случай — навык ничего не пишет в рабочую директорию (info/validate) **и фикстуру не +собирает**: сверять нечего, проверяется stdout. + +**Но если у такого кейса есть `preRun`, собирающий фикстуру, — эталон нужен.** Он фиксирует не +выход проверяемого навыка, а **вход теста**. Без него дрейф навыка-генератора меняет фикстуру +молча: ожидание вида `"stdoutContains": "Составной (6)"` начинает проверяться уже на другом +объекте — в лучшем случае кейс падает с необъяснимой причиной, в худшем сходится случайно и +перестаёт что-либо проверять. `meta-compile` такой дрейф даёт регулярно, задевая эталоны +десятков навыков, и ловят его именно эталоны. Поэтому info-навыки в `cases/*-info/` эталоны +имеют — это осознанно. + +Правило: **есть `preRun` с генерацией фикстуры → эталон; нет `preRun` (или фикстура тривиальна) +→ `noSnapshot`.** **Причина обязательна** — непустая строка; `true` не принимается и валит кейс. Смысл в том, что отключение сверки должно стоить автору формулировки, а ревьюеру быть видно в diff'е: проверить diff --git a/tests/skills/verify-snapshots.mjs b/tests/skills/verify-snapshots.mjs index 0255b6b8..f2dd6ad3 100644 --- a/tests/skills/verify-snapshots.mjs +++ b/tests/skills/verify-snapshots.mjs @@ -6,6 +6,10 @@ // role-compile, subsystem-compile, subsystem-edit, mxl-compile, template-add, // help-add, cf-init, cf-edit, epf-init, meta-edit, interface-edit, // cfe-init, cfe-borrow, cfe-patch-method +// Работает и с кейсами навыков, которые сами ничего не пишут (info/validate), если у кейса +// есть preRun: проверяется, что платформа принимает собранную им фикстуру. +// Для кейсов на `setup: external:` проверка вырождается — 1С грузит собственную выгрузку +// типовой конфигурации (~3 мин на кейс, ноль информации). Такие гонять через --case. import { execFileSync } from 'child_process'; import { existsSync, mkdirSync, mkdtempSync, rmSync, readFileSync, writeFileSync,