test: измерване на coverage и ratchet праг в CI (#93)#216
Conversation
- @vitest/coverage-v8 през общ preset (vitest.shared.ts); vitest.config.ts за всичките 6 workspace-а с тестове, с експлицитен include за да не са невидими непокритите модули - scripts/check-coverage.mjs: per-workspace ratchet (lines/branches срещу комитнат coverage-baseline.json, 0.5pp толеранс), markdown таблица с делти + информативен общ сбор; --update вдига baseline-а локално - CI: pnpm test -- --coverage + ratchet gate (self-test първо), artifact с отчета, step summary, sticky PR коментар само за same-repo PR-и (fork token-ът е read-only); turbo test task пази coverage/** outputs - документирано в docs/review-testing.md
|
Прегледах #216 стриктно (харнесът за #93). Сигурност — издържана: trigger е Ratchet — коректен и fail-closed: липсващ отчет = твърда грешка, липсваща метрика = грешка, спад > tolerance = fail; Две точни бележки — за да не се чете покритието погрешно (не блокер за merge): 1) Derive слоят на ETL е ИЗВЪН обхвата на покритието — по конструкция. 2) Сред измерените workspace-и, branch подовете на accuracy слоевете са ниски. Иначе е точно каквото #93 иска и е сигурно направено. Approve; двете бележки са за roadmap-а на покритието. |
…ар fix Адресира ревю находките по PR midt-bg#216: - validateBaseline: празен/невалиден workspaces обект, изтрит или забравен ключ за workspace с test script, stale ключ и traversal/__proto__ ключове вече fail-ват gate-а вместо тихо да го изключват - --update печата per-workspace делти и предупреждава шумно при спад, за да не може реална регресия тихо да влезе в нов baseline - coverage exclude покрива и .test.tsx/.spec.* варианти - sticky comment: gh api | head пренаписан на два стъпки (pipefail SIGPIPE) - по-точно съобщение при липсващ отчет след crash-нал vitest процес
|
Прегледах новия връх
Approve остава. Двете ми roadmap бележки (ETL derive извън обхвата на coverage; ниски branch подове на db/config) са проследени в #217 (priority: high) — не блокират този PR. |
Какво и защо
В monorepo-то нямаше измерване на test coverage — нито
@vitest/coverage-*, нито праг, а CI пускашеpnpm testбез--coverage. Този PR добавя харнеса от #93: измерване per workspace, ratchet праг който fail-ва CI при спад, и coverage делта видима в PR-а. Само харнесът — новите тестове бяха отделен обхват (#74, вече merged).@vitest/coverage-v8(root devDep) през общ presetvitest.shared.ts;vitest.config.tsза всичките 6 workspace-а с тестове, с експлицитенinclude— иначе v8 provider-ът брои само файловете, заредени от тестове, и нов непокрит модул би бил невидим за ratchet-а.coverage-baseline.json(seed-нат от реалните числа) +scripts/check-coverage.mjs— lines% и branches% на всеки workspace не може да падне >0.5pp под baseline-а. При покачване >1pp скриптът подканя--update(локално; никога в CI). Умишлен спад = сваляне на числото в baseline-а в същия PR, видимо на ревю. Общият сбор е информативен, смятан от сумирани covered/total бройки, не осреднени проценти.pnpm test -- --coverage(тестовете се пускат веднъж), ratchet gate със self-test първо (по модела на docs проверката), таблицата с делтите в step summary + artifactcoverage-report. Sticky PR коментар само за same-repo PR-и — fork PR-ите получават read-only token независимо отpermissions:, затова коментарният job е отделен, гейтнат поhead.repo.full_nameиcontinue-on-error;checkjob-ът остава с read-only token.testtask-ът декларираoutputs: ["coverage/**"], така че cache replay възстановява отчетите (проверено: FULL TURBO + наличенcoverage-summary.json).docs/review-testing.md.Бележка:
apps/web/tsconfig.node.jsonдобавя../../vitest.shared.tsвinclude(composite проектът изисква изброени файлове).packages/api-contractе извън baseline-а, докато няма тестове. Sticky-коментарният job може да се провери реално чак на този PR — всичко останало е проверено локално.Свързан issue
Closes #93.
Вид промяна
test/ci/build/chore— поддръжкаКак е тествано
pnpm check:coverage:test— 12/12 (node:test, адверсариални случаи: спад отвъд толеранса, спад в толеранса, независим branches ratchet, липсващ отчет/метрика, merge на бройки vs осредняване).pnpm test -- --coverage— 6/6 workspace-а зелени, всеки произвеждаcoverage/coverage-summary.json.packages/shared+2pp → exit 1 с actionable съобщение; +0.3pp → exit 0 (толеранс).outputs).pnpm typecheck,pnpm lint,pnpm check:docs— зелени.Чеклист
Co-Authored-By:trailermidt-bg/sigma:mainpnpm typecheckминаваpnpm test(поне за засегнатите пакети) минаваpnpm lintе чисто.env*или.dev.varsdocs/е обновена, ако промяната го налага