Testing
آزمایش: بهروزرسانیها و Pluginها
این چکلیست اختصاصی برای اعتبارسنجی بهروزرسانی و Plugin است. هدف
ساده است: ثابت کند بستهی قابل نصب میتواند وضعیت واقعی کاربر را بهروزرسانی کند، وضعیت
legacy کهنه را از طریق doctor ترمیم کند، و همچنان Pluginها را از منابع پشتیبانیشده
نصب، بارگذاری، بهروزرسانی، و حذف کند.
برای نقشهی گستردهتر اجراکنندهی تست، تستکردن را ببینید. برای کلیدهای provider زنده و مجموعهتستهایی که شبکه را لمس میکنند، تست زنده را ببینید.
از چه چیزی محافظت میکنیم
تستهای بهروزرسانی و Plugin از این قراردادها محافظت میکنند:
- یک tarball بسته کامل است،
dist/postinstall-inventory.jsonمعتبر دارد، و به فایلهای بازشدهی repo وابسته نیست. - کاربر میتواند از یک بستهی منتشرشدهی قدیمیتر به بستهی candidate منتقل شود بدون اینکه config، agentها، sessionها، workspaceها، allowlistهای Plugin، یا config کانال را از دست بدهد.
openclaw doctor --fix --non-interactiveمالک مسیرهای پاکسازی و ترمیم legacy است. startup نباید migrationهای compatibility پنهان برای وضعیت کهنهی Plugin ایجاد کند.- نصب Plugin از دایرکتوریهای محلی، repoهای git، بستههای npm، و مسیر registry ClawHub کار میکند.
- وابستگیهای npm مربوط به Plugin در یک پروژهی npm مدیریتشده برای هر Plugin نصب میشوند، پیش از trust اسکن میشوند، و هنگام uninstall از طریق npm حذف میشوند تا وابستگیهای hoistشده باقی نمانند.
- بهروزرسانی Plugin وقتی چیزی تغییر نکرده پایدار است: رکوردهای نصب، منبع resolveشده، چیدمان وابستگی نصبشده، و وضعیت enabled دستنخورده میمانند.
اثبات محلی هنگام توسعه
از محدودهی باریک شروع کنید:
pnpm changed:lanes --jsonpnpm check:changedpnpm test:changedبرای تغییرات نصب Plugin، حذف نصب، وابستگی، یا inventory بسته، تستهای متمرکزی را هم اجرا کنید که seam ویرایششده را پوشش میدهند:
pnpm test src/plugins/uninstall.test.ts src/infra/package-dist-inventory.test.ts test/scripts/package-acceptance-workflow.test.tsپیش از آنکه هر lane Docker بستهای یک tarball را مصرف کند، artifact بسته را اثبات کنید:
pnpm release:checkrelease:check بررسیهای drift مربوط به config/docs/API را اجرا میکند، inventory توزیع بسته را مینویسد،
npm pack --dry-run را اجرا میکند، فایلهای بستهبندیشدهی ممنوع را رد میکند، tarball را
در یک prefix موقت نصب میکند، postinstall را اجرا میکند، و entrypointهای کانال bundled را smoke میکند.
laneهای Docker
laneهای Docker اثبات سطح محصول هستند. آنها یک بستهی واقعی را داخل containerهای Linux نصب یا بهروزرسانی میکنند و رفتار را از طریق فرمانهای CLI، startup Gateway، probeهای HTTP، وضعیت RPC، و وضعیت فایلسیستم assert میکنند.
هنگام تکرار و اصلاح، از laneهای متمرکز استفاده کنید:
pnpm test:docker:pluginspnpm test:docker:plugin-lifecycle-matrixpnpm test:docker:plugin-updatepnpm test:docker:upgrade-survivorpnpm test:docker:published-upgrade-survivorpnpm test:docker:update-restart-authpnpm test:docker:update-migrationlaneهای مهم:
test:docker:pluginssmoke نصب Plugin، نصب از پوشهی محلی، رفتار skip در بهروزرسانی پوشهی محلی، پوشههای محلی با وابستگیهای از پیش نصبشده، نصب بستههایfile:، نصبهای git با اجرای CLI، بهروزرسانیهای moving-ref در git، نصبهای registry npm با وابستگیهای transitive hoistشده، no-opهای بهروزرسانی npm، رد metadata معیوب بستهی npm، نصب fixture محلی ClawHub و no-opهای بهروزرسانی، رفتار بهروزرسانی marketplace، و فعالسازی/inspect بستهی Claude را اعتبارسنجی میکند. برای hermetic/offline نگهداشتن بلوک ClawHub،OPENCLAW_PLUGINS_E2E_CLAWHUB=0را تنظیم کنید.test:docker:plugin-lifecycle-matrixبستهی candidate را در یک container خالی نصب میکند، یک Plugin npm را از مسیرهای install، inspect، disable، enable، upgrade صریح، downgrade صریح، و uninstall پس از حذف کد Plugin عبور میدهد. برای هر phase، معیارهای RSS و CPU را log میکند.test:docker:plugin-updateاعتبارسنجی میکند که یک Plugin نصبشدهی بدون تغییر هنگامopenclaw plugins updateدوباره نصب نشود یا metadata نصب را از دست ندهد.test:docker:upgrade-survivortarball candidate را روی یک fixture کاربر قدیمی آلوده نصب میکند، بهروزرسانی بسته همراه با doctor غیرتعاملی را اجرا میکند، سپس یک Gateway loopback را شروع میکند و حفظ وضعیت را بررسی میکند.test:docker:published-upgrade-survivorابتدا یک baseline منتشرشده را نصب میکند، آن را از طریق recipe پختهشدهیopenclaw config setپیکربندی میکند، به tarball candidate بهروزرسانی میکند، doctor را اجرا میکند، پاکسازی legacy را بررسی میکند، Gateway را شروع میکند، و/healthz،/readyz، و وضعیت RPC را probe میکند.test:docker:update-restart-authبستهی candidate را نصب میکند، یک Gateway مدیریتشده با token-auth را شروع میکند، env مربوط به auth gateway caller را برایopenclaw update --yes --jsonunset میکند، و الزام میکند فرمان بهروزرسانی candidate پیش از probeهای معمول Gateway را restart کند.test:docker:update-migrationlane بهروزرسانی منتشرشده با پاکسازی سنگین است. از وضعیت کاربر پیکربندیشده به سبک Discord/Telegram شروع میکند، doctor baseline را اجرا میکند تا وابستگیهای Plugin پیکربندیشده فرصت materialize شدن داشته باشند، debris وابستگی legacy Plugin را برای یک Plugin بستهبندیشدهی پیکربندیشده seed میکند، به tarball candidate بهروزرسانی میکند، و post-update doctor را ملزم میکند rootهای legacy وابستگی را حذف کند.
variantهای مفید published-upgrade survivor:
OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC=openclaw@2026.4.23 \OPENCLAW_UPGRADE_SURVIVOR_SCENARIO=versioned-runtime-deps \pnpm test:docker:published-upgrade-survivor OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC=openclaw@latest \OPENCLAW_UPGRADE_SURVIVOR_SCENARIO=bootstrap-persona \pnpm test:docker:published-upgrade-survivorسناریوهای موجود عبارتاند از base، feishu-channel، bootstrap-persona،
plugin-deps-cleanup، configured-plugin-installs،
stale-source-plugin-shadow، tilde-log-path، و versioned-runtime-deps. در اجراهای تجمیعی،
OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues به همهی سناریوهای شکلگرفته از issueهای گزارششده گسترش مییابد،
از جمله migration نصب Plugin پیکربندیشده.
migration کامل بهروزرسانی عمدا از Full Release CI جدا است. وقتی پرسش release این است که «آیا هر
release پایدار منتشرشده از 2026.4.23 به بعد میتواند به این candidate بهروزرسانی شود و
debris وابستگی Plugin را پاک کند؟»، از workflow دستی Update Migration استفاده کنید:
gh workflow run update-migration.yml \ --ref main \ -f workflow_ref=main \ -f package_ref=main \ -f baselines=all-since-2026.4.23 \ -f scenarios=plugin-deps-cleanupPackage Acceptance
Package Acceptance گیت native بسته در GitHub است. یک بستهی candidate را به یک tarball
package-under-test resolve میکند، version و SHA-256 را ثبت میکند، سپس
laneهای Docker E2E قابل استفادهی مجدد را علیه همان tarball دقیق اجرا میکند. ref harness workflow
از ref منبع بسته جدا است، بنابراین منطق تست فعلی میتواند releaseهای trusted قدیمیتر را اعتبارسنجی کند.
منابع candidate:
source=npm:openclaw@beta،openclaw@latest، یا یک version دقیق منتشرشده را اعتبارسنجی کنید.source=ref: یک branch، tag، یا commit trusted را با harness فعلی انتخابشده pack کنید.source=url: یک tarball عمومی HTTPS را باpackage_sha256الزامی اعتبارسنجی کنید. این مسیر credentialهای URL، portهای HTTPS غیرپیشفرض، hostnameها یا نتایج DNS/IP خصوصی/داخلی، فضای IP با کاربری ویژه، و redirectهای ناامن را رد میکند.source=trusted-url: یک tarball HTTPS را باpackage_sha256وtrusted_source_idالزامی علیه policy متعلق به maintainer در.github/package-trusted-sources.jsonاعتبارسنجی کنید. برای mirrorهای enterprise/private بهجای ضعیفکردنsource=urlبا یک switch سطح ورودی allow-private، از این استفاده کنید. Bearer auth، وقتی توسط policy پیکربندی شده باشد، از secret ثابتOPENCLAW_TRUSTED_PACKAGE_TOKENاستفاده میکند.source=artifact: از tarball بارگذاریشده توسط یک اجرای دیگر Actions دوباره استفاده کنید.
Full Release Validation بهصورت پیشفرض از source=artifact استفاده میکند، که از
SHA release resolveشده ساخته شده است. برای اثبات پس از انتشار،
package_acceptance_package_spec=openclaw@YYYY.M.PATCH را پاس دهید تا همان ماتریس upgrade
بهجای آن بستهی npm shipشده را هدف بگیرد.
بررسیهای release، Package Acceptance را با مجموعهی package/update/restart/plugin فراخوانی میکنند:
doctor-switch update-channel-switch update-corrupt-plugin upgrade-survivor published-upgrade-survivor update-restart-auth plugins-offline plugin-updateوقتی release soak فعال باشد، اینها را هم پاس میدهند:
published_upgrade_survivor_baselines=last-stable-4 2026.4.23 2026.5.2 2026.4.15published_upgrade_survivor_scenarios=reported-issuestelegram_mode=mock-openaiاین کار migration بسته، switching کانال بهروزرسانی، تحمل Plugin مدیریتشدهی خراب، پاکسازی وابستگی کهنهی Plugin، پوشش Plugin آفلاین، رفتار بهروزرسانی Plugin، و QA بستهی Telegram را روی همان artifact resolveشده نگه میدارد بدون اینکه گیت پیشفرض بستهی release را مجبور کند همهی releaseهای منتشرشده را طی کند.
last-stable-4 به چهار release پایدار آخر OpenClaw که در npm منتشر شدهاند resolve میشود.
release package acceptance مقدار 2026.4.23 را بهعنوان نخستین مرز compatibility بهروزرسانی Plugin،
2026.5.2 را بهعنوان مرز churn معماری Plugin، و
2026.4.15 را بهعنوان یک baseline قدیمیتر بهروزرسانی منتشرشدهی 2026.4.1x pin میکند؛ resolver
pinهایی را که از قبل در چهار مورد آخر هستند dedupe میکند. برای پوشش exhaustive migration
بهروزرسانی منتشرشده، بهجای Full Release CI از all-since-2026.4.23 در workflow جداگانهی Update
Migration استفاده کنید. وقتی anchor قدیمی پیش از تاریخ را هم میخواهید،
release-history همچنان برای نمونهگیری دستی گستردهتر در دسترس است.
وقتی چند baseline published-upgrade survivor انتخاب شود، workflow قابل استفادهی مجدد Docker هر baseline را به job هدفمند runner خودش shard میکند. هر baseline shard همچنان مجموعه سناریوی انتخابشده را اجرا میکند، اما logها و artifactها per-baseline میمانند و زمان wall بهجای یک job serial بزرگ با کندترین shard محدود میشود.
هنگام اعتبارسنجی candidate پیش از release، یک profile بسته را دستی اجرا کنید:
gh workflow run package-acceptance.yml \ --ref main \ -f workflow_ref=main \ -f source=npm \ -f package_spec=openclaw@beta \ -f suite_profile=package \ -f published_upgrade_survivor_baselines="last-stable-4 2026.4.23 2026.5.2 2026.4.15" \ -f published_upgrade_survivor_scenarios=reported-issues \ -f telegram_mode=mock-openaiوقتی پرسش release شامل کانالهای MCP، پاکسازی cron/subagent، جستوجوی وب OpenAI، یا OpenWebUI است،
از suite_profile=product استفاده کنید. فقط وقتی به پوشش کامل مسیر release در Docker نیاز دارید
از suite_profile=full استفاده کنید.
پیشفرض release
برای release candidateها، stack اثبات پیشفرض چنین است:
pnpm check:changedوpnpm test:changedبرای regressionهای سطح source.pnpm release:checkبرای integrity artifact بسته.- profile
packageمربوط به Package Acceptance یا laneهای package سفارشی release-check برای قراردادهای install/update/restart/plugin. - بررسیهای release بین سیستمعاملها برای installer، onboarding، و رفتار platform وابسته به OS.
- مجموعهتستهای زنده فقط وقتی surface تغییرکرده رفتار provider یا hosted-service را لمس میکند.
روی ماشینهای maintainer، gateهای گسترده و اثبات product مربوط به Docker/package باید در Testbox اجرا شوند مگر اینکه صراحتا اثبات محلی انجام شود.
compatibility legacy
leniency مربوط به compatibility باریک و زماندار است:
- بستهها تا
2026.4.25، شامل2026.4.25-beta.*، ممکن است gapهای metadata بسته که قبلا ship شدهاند را در Package Acceptance تحمل کنند. - بستهی منتشرشدهی
2026.4.26ممکن است برای فایلهای stamp مربوط به metadata build محلی که قبلا ship شدهاند warn کند. - بستههای بعدی باید قراردادهای مدرن را رعایت کنند. همان gapها بهجای warning یا skipping شکست میخورند.
برای این shapeهای قدیمی، migrationهای startup جدید اضافه نکنید. یک ترمیم doctor اضافه یا گسترش دهید،
سپس وقتی فرمان update مالک restart است، آن را با upgrade-survivor، published-upgrade-survivor، یا
update-restart-auth اثبات کنید.
افزودن پوشش
هنگام تغییر رفتار update یا Plugin، پوشش را در پایینترین لایهای اضافه کنید که میتواند به دلیل درست fail شود:
- منطق صرفاً مربوط به مسیر یا فراداده: تست واحد کنار منبع.
- رفتار موجودی بسته یا فایلهای بستهبندیشده: تست
package-dist-inventoryیا بررسیکننده tarball. - رفتار نصب/بهروزرسانی CLI: assertion مسیر Docker یا fixture.
- رفتار مهاجرت انتشار منتشرشده: سناریوی
published-upgrade-survivor. - رفتار راهاندازی مجدد تحت مالکیت بهروزرسانی:
update-restart-auth. - رفتار منبع registry/بسته: fixture مربوط به
test:docker:pluginsیا سرور fixture مربوط به ClawHub. - رفتار چیدمان وابستگی یا پاکسازی: هم اجرای runtime و هم مرز فایلسیستم را assert کنید. وابستگیهای npm ممکن است داخل پروژه npm مدیریتشده Plugin بالا کشیده شوند، بنابراین تستها باید ثابت کنند که همان پروژه اسکن/پاکسازی میشود، نه اینکه فرض کنند فقط درخت
node_modulesمحلیِ بسته Plugin بررسی میشود.
fixtureهای جدید Docker را بهصورت پیشفرض hermetic نگه دارید. از registryهای fixture محلی و بستههای جعلی استفاده کنید، مگر اینکه هدف تست، رفتار registry زنده باشد.
تریاژ شکست
با هویت artifact شروع کنید:
- خلاصه
resolve_packageدر Package Acceptance: منبع، نسخه، SHA-256 و نام artifact. - artifactهای Docker:
.artifacts/docker-tests/**/summary.json،failures.json، لاگهای مسیر و فرمانهای اجرای مجدد. - خلاصه upgrade survivor:
.artifacts/upgrade-survivor/summary.json، شامل نسخه baseline، نسخه candidate، سناریو، زمانبندیهای phase و گامهای recipe.
اجرای مجدد همان مسیر دقیقِ شکستخورده با همان artifact بسته را به اجرای مجدد کل چتر انتشار ترجیح دهید.