Testing
การทดสอบ: การอัปเดตและ Plugin
นี่คือเช็กลิสต์เฉพาะสำหรับการตรวจสอบความถูกต้องของการอัปเดตและ Plugin เป้าหมาย
เรียบง่าย: พิสูจน์ว่าแพ็กเกจที่ติดตั้งได้สามารถอัปเดตสถานะผู้ใช้จริง ซ่อมแซมสถานะ
ดั้งเดิมเก่าผ่าน doctor และยังคงติดตั้ง โหลด อัปเดต และถอนการติดตั้ง
Plugin จากแหล่งที่รองรับได้
สำหรับแผนผังตัวรันการทดสอบที่กว้างขึ้น โปรดดู การทดสอบ สำหรับ คีย์ผู้ให้บริการแบบสดและชุดทดสอบที่แตะเครือข่าย โปรดดู การทดสอบแบบสด
สิ่งที่เราปกป้อง
การทดสอบอัปเดตและ Plugin ปกป้องสัญญาเหล่านี้:
- tarball ของแพ็กเกจสมบูรณ์ มี
dist/postinstall-inventory.jsonที่ถูกต้อง และไม่ขึ้นกับไฟล์ repo ที่ยังไม่ได้แพ็ก - ผู้ใช้สามารถย้ายจากแพ็กเกจที่เผยแพร่เก่ากว่าไปยังแพ็กเกจตัวเลือกได้ โดยไม่สูญเสีย config, agent, session, workspace, allowlist ของ Plugin หรือ channel config
openclaw doctor --fix --non-interactiveเป็นเจ้าของเส้นทางล้างและซ่อมแซม ดั้งเดิมเก่า Startup ไม่ควรเพิ่ม migration ความเข้ากันได้ที่ซ่อนอยู่สำหรับ สถานะ Plugin ที่ค้างเก่า- การติดตั้ง Plugin ทำงานจากไดเรกทอรีในเครื่อง, git repo, แพ็กเกจ npm และเส้นทาง registry ของ ClawHub
- dependency ของ npm สำหรับ Plugin ถูกติดตั้งในโปรเจกต์ npm ที่จัดการหนึ่งรายการต่อ Plugin สแกนก่อนเชื่อถือ และถูกลบผ่าน npm ระหว่างถอนการติดตั้ง เพื่อไม่ให้ dependency ที่ถูก hoist ค้างอยู่
- การอัปเดต Plugin เสถียรเมื่อไม่มีอะไรเปลี่ยน: install record, source ที่ resolve แล้ว, layout ของ dependency ที่ติดตั้ง และสถานะ enabled ยังคงอยู่ครบถ้วน
หลักฐานในเครื่องระหว่างการพัฒนา
เริ่มแบบแคบ:
pnpm changed:lanes --jsonpnpm check:changedpnpm test:changedสำหรับการเปลี่ยนแปลงด้านการติดตั้ง Plugin, การถอนการติดตั้ง, dependency หรือ package-inventory ให้รันการทดสอบแบบเจาะจงที่ครอบคลุม seam ที่แก้ไขด้วย:
pnpm test src/plugins/uninstall.test.ts src/infra/package-dist-inventory.test.ts test/scripts/package-acceptance-workflow.test.tsก่อนที่ Docker lane ของแพ็กเกจใดจะใช้ tarball ให้พิสูจน์ artifact ของแพ็กเกจก่อน:
pnpm release:checkrelease:check รันการตรวจสอบ drift ของ config/docs/API, เขียน inventory ของ package dist,
รัน npm pack --dry-run, ปฏิเสธไฟล์ที่ห้ามถูกแพ็ก, ติดตั้ง tarball ลงใน temp prefix,
รัน postinstall และ smoke entrypoint ของ channel ที่ bundle มา
Docker lane
Docker lane คือหลักฐานระดับผลิตภัณฑ์ โดยจะติดตั้งหรืออัปเดตแพ็กเกจจริง ภายในคอนเทนเนอร์ Linux และยืนยันพฤติกรรมผ่านคำสั่ง CLI, การเริ่มต้น Gateway, HTTP probe, สถานะ RPC และสถานะ filesystem
ใช้ 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:pluginsตรวจสอบ smoke การติดตั้ง Plugin, การติดตั้งจากโฟลเดอร์ในเครื่อง, พฤติกรรมข้ามการอัปเดตโฟลเดอร์ในเครื่อง, โฟลเดอร์ในเครื่องที่มี dependency ติดตั้งไว้ล่วงหน้า, การติดตั้งแพ็กเกจfile:, การติดตั้งจาก git พร้อมการเรียกใช้ CLI, การอัปเดต moving-ref ของ git, การติดตั้งจาก npm registry พร้อม transitive dependency ที่ถูก hoist, no-op ของการอัปเดต npm, การปฏิเสธ metadata แพ็กเกจ npm ที่ผิดรูป, การติดตั้งจาก fixture ClawHub ในเครื่องและ no-op ของการอัปเดต, พฤติกรรมการอัปเดต marketplace และการ enable/inspect ของ Claude-bundle ตั้งค่าOPENCLAW_PLUGINS_E2E_CLAWHUB=0เพื่อให้บล็อก ClawHub เป็นแบบ hermetic/offlinetest:docker:plugin-lifecycle-matrixติดตั้งแพ็กเกจตัวเลือกในคอนเทนเนอร์เปล่า, รัน Plugin npm ผ่าน install, inspect, disable, enable, explicit upgrade, explicit downgrade และ uninstall หลังลบโค้ด Plugin โดยจะบันทึก metric RSS และ CPU สำหรับแต่ละเฟสtest:docker:plugin-updateตรวจสอบว่า Plugin ที่ติดตั้งแล้วและไม่เปลี่ยนแปลง จะไม่ติดตั้งซ้ำหรือสูญเสีย metadata การติดตั้งระหว่างopenclaw plugins updatetest:docker:upgrade-survivorติดตั้ง tarball ตัวเลือกทับ fixture ผู้ใช้เก่าที่มีสถานะสกปรก, รันการอัปเดตแพ็กเกจพร้อม doctor แบบ non-interactive จากนั้นเริ่ม Gateway แบบ loopback และตรวจสอบการรักษาสถานะtest:docker:published-upgrade-survivorติดตั้ง baseline ที่เผยแพร่ก่อน, config ผ่านสูตรopenclaw config setที่อบไว้, อัปเดตเป็น tarball ตัวเลือก, รัน doctor, ตรวจสอบการล้างของเก่า, เริ่ม Gateway และ probe/healthz,/readyzรวมถึงสถานะ RPCtest:docker:update-restart-authติดตั้งแพ็กเกจตัวเลือก, เริ่ม Gateway แบบ token-auth ที่จัดการอยู่, unset env auth ของ gateway ฝั่ง caller สำหรับopenclaw update --yes --jsonและกำหนดให้คำสั่งอัปเดตตัวเลือก restart Gateway ก่อน probe ปกติtest:docker:update-migrationคือ lane published-update ที่เน้นการล้างมากเป็นพิเศษ โดยเริ่มจาก สถานะผู้ใช้สไตล์ Discord/Telegram ที่ config แล้ว, รัน doctor baseline เพื่อให้ dependency ของ Plugin ที่ config แล้วมีโอกาส materialize, seed เศษซาก dependency ดั้งเดิมเก่าของ Plugin สำหรับ Plugin แบบแพ็กเกจที่ config แล้ว, อัปเดตเป็น tarball ตัวเลือก และกำหนดให้ doctor หลังอัปเดตลบ root ของ dependency ดั้งเดิมเก่าออก
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-survivorscenario ที่มีคือ 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 จะขยายเป็น scenario ที่มีรูปทรงเหมือน issue ที่ถูกรายงานทั้งหมด
รวมถึง migration การติดตั้ง Plugin ที่ config แล้ว
Full update migration แยกออกจาก Full Release CI โดยตั้งใจ ใช้ workflow แบบ manual
Update Migration เมื่อคำถามของ release คือ "ทุก stable release ที่เผยแพร่ตั้งแต่ 2026.4.23 เป็นต้นไป
สามารถอัปเดตเป็นตัวเลือกนี้และล้างเศษซาก dependency ของ Plugin ได้หรือไม่":
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-cleanupการยอมรับแพ็กเกจ
Package Acceptance คือ gate แพ็กเกจแบบ GitHub-native โดย resolve แพ็กเกจตัวเลือกหนึ่งรายการ
เป็น tarball package-under-test, บันทึก version และ SHA-256 จากนั้นรัน Docker E2E lane ที่ reusable
กับ tarball เดียวกันนั้น ref ของ workflow harness แยกจาก ref ของ source แพ็กเกจ
ดังนั้น logic การทดสอบปัจจุบันจึงตรวจสอบ release เก่าที่เชื่อถือได้ได้
แหล่งตัวเลือก:
source=npm: ตรวจสอบopenclaw@beta,openclaw@latestหรือ version ที่เผยแพร่แบบเจาะจงsource=ref: แพ็ก branch, tag หรือ commit ที่เชื่อถือได้ด้วย harness ปัจจุบันที่เลือกsource=url: ตรวจสอบ tarball HTTPS สาธารณะพร้อมpackage_sha256ที่จำเป็น เส้นทางนี้ปฏิเสธ credential ใน URL, พอร์ต HTTPS ที่ไม่ใช่ค่า default, hostname หรือผลลัพธ์ DNS/IP แบบ private/internal, พื้นที่ IP สำหรับการใช้งานพิเศษ และ redirect ที่ไม่ปลอดภัยsource=trusted-url: ตรวจสอบ tarball HTTPS พร้อมpackage_sha256และtrusted_source_idที่จำเป็น เทียบกับ policy ที่ maintainer เป็นเจ้าของใน.github/package-trusted-sources.jsonใช้เส้นทางนี้สำหรับ mirror enterprise/private แทนการทำให้source=urlอ่อนลงด้วยสวิตช์ allow-private ระดับ input Bearer auth เมื่อ config โดย policy จะใช้ secret คงที่OPENCLAW_TRUSTED_PACKAGE_TOKENsource=artifact: ใช้ tarball ที่อัปโหลดโดย Actions run อื่นซ้ำ
Full Release Validation ใช้ source=artifact เป็นค่า default ซึ่ง build จาก SHA ของ release ที่ resolve แล้ว
สำหรับหลักฐานหลังเผยแพร่ ให้ส่ง
package_acceptance_package_spec=openclaw@YYYY.M.PATCH เพื่อให้ upgrade matrix เดียวกัน
target แพ็กเกจ npm ที่ส่งมอบแล้วแทน
Release check เรียก 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สิ่งนี้ทำให้ package migration, การสลับ update channel, tolerance ต่อ managed-plugin ที่เสียหาย, การล้าง dependency ของ Plugin ที่ค้างเก่า, coverage ของ Plugin แบบ offline, พฤติกรรมการอัปเดต Plugin และ QA แพ็กเกจ Telegram อยู่บน artifact ที่ resolve เดียวกัน โดยไม่ทำให้ gate แพ็กเกจ release แบบ default ต้องเดินผ่านทุก release ที่เผยแพร่แล้ว
last-stable-4 resolve เป็น release OpenClaw แบบ stable สี่รายการล่าสุดที่เผยแพร่บน npm
Release package acceptance pin 2026.4.23 เป็นขอบเขตความเข้ากันได้แรกของ plugin-update,
2026.5.2 เป็นขอบเขต churn ของสถาปัตยกรรม Plugin และ 2026.4.15 เป็น baseline published-update
เก่ากว่าจาก 2026.4.1x; resolver จะ dedupe pin ที่อยู่ในสี่รายการล่าสุดอยู่แล้ว สำหรับ coverage migration
published update แบบ exhaustive ให้ใช้ all-since-2026.4.23 ใน workflow Update Migration แยก
แทน Full Release CI release-history ยังคงพร้อมใช้สำหรับการสุ่มตัวอย่างที่กว้างขึ้นแบบ manual
เมื่อคุณต้องการ anchor pre-date ดั้งเดิมเก่าด้วย
เมื่อเลือก baseline ของ published-upgrade survivor หลายรายการ workflow Docker ที่ reusable จะแบ่ง shard baseline แต่ละรายการเป็น runner job เป้าหมายของตัวเอง แต่ละ baseline shard ยังคงรันชุด scenario ที่เลือก แต่ log และ artifact จะอยู่แยกตาม baseline และ wall time ถูกจำกัดด้วย shard ที่ช้าที่สุดแทน job serial ขนาดใหญ่หนึ่งรายการ
รัน package profile แบบ manual เมื่อตรวจสอบตัวเลือกก่อน release:
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ใช้ suite_profile=product เมื่อคำถามของ release รวมถึง MCP channel,
การล้าง cron/subagent, OpenAI web search หรือ OpenWebUI ใช้ suite_profile=full
เฉพาะเมื่อคุณต้องการ coverage เส้นทาง release ของ Docker แบบเต็ม
ค่า default ของ release
สำหรับ release candidate ชุดหลักฐาน default คือ:
pnpm check:changedและpnpm test:changedสำหรับ regression ระดับ sourcepnpm release:checkสำหรับความสมบูรณ์ของ artifact แพ็กเกจ- Package Acceptance profile
packageหรือ lane แพ็กเกจแบบ custom ของ release-check สำหรับสัญญา install/update/restart/plugin - release check ข้าม OS สำหรับ installer, onboarding และพฤติกรรม platform เฉพาะ OS
- ชุดทดสอบแบบสดเฉพาะเมื่อ surface ที่เปลี่ยนแตะพฤติกรรมผู้ให้บริการหรือ hosted-service
บนเครื่อง maintainer, gate กว้างและหลักฐานผลิตภัณฑ์ Docker/package ควรรันใน Testbox เว้นแต่ตั้งใจทำหลักฐานในเครื่องอย่างชัดเจน
ความเข้ากันได้ดั้งเดิมเก่า
การผ่อนปรนด้านความเข้ากันได้แคบและมีกำหนดเวลา:
- แพ็กเกจจนถึง
2026.4.25รวมถึง2026.4.25-beta.*อาจยอมรับช่องว่าง metadata ของแพ็กเกจที่ส่งมอบไปแล้วใน Package Acceptance - แพ็กเกจ
2026.4.26ที่เผยแพร่แล้วอาจเตือนสำหรับไฟล์ stamp metadata ของ build ในเครื่อง ที่ส่งมอบไปแล้ว - แพ็กเกจหลังจากนั้นต้องผ่านสัญญาสมัยใหม่ ช่องว่างเดียวกันจะ fail แทนการเตือนหรือข้าม
อย่าเพิ่ม startup migration ใหม่สำหรับ shape เก่าเหล่านี้ เพิ่มหรือขยายการซ่อมแซมของ doctor
แล้วพิสูจน์ด้วย upgrade-survivor, published-upgrade-survivor หรือ
update-restart-auth เมื่อคำสั่งอัปเดตเป็นเจ้าของการ restart
การเพิ่ม coverage
เมื่อเปลี่ยนพฤติกรรมการอัปเดตหรือ Plugin ให้เพิ่ม coverage ที่ layer ต่ำที่สุดที่ สามารถ fail ด้วยเหตุผลที่ถูกต้อง:
- ตรรกะเกี่ยวกับพาธหรือเมทาดาทาล้วน ๆ: ทดสอบแบบ unit ไว้ข้างซอร์ส
- ลักษณะการทำงานของ inventory ของแพ็กเกจหรือไฟล์ที่ถูกแพ็ก: ทดสอบด้วย
package-dist-inventoryหรือ tarball checker - ลักษณะการทำงานของการติดตั้ง/อัปเดตผ่าน CLI: assertion ใน Docker lane หรือ fixture
- ลักษณะการทำงานของการย้ายข้อมูลจากรีลีสที่เผยแพร่แล้ว: สถานการณ์
published-upgrade-survivor - ลักษณะการทำงานของการรีสตาร์ทที่การอัปเดตเป็นเจ้าของ:
update-restart-auth - ลักษณะการทำงานของซอร์ส registry/แพ็กเกจ: fixture ของ
test:docker:pluginsหรือเซิร์ฟเวอร์ fixture ของ ClawHub - ลักษณะการทำงานของเลย์เอาต์ dependency หรือการล้างข้อมูล: assert ทั้งการทำงานตอนรันไทม์และขอบเขตของ
ระบบไฟล์ dependency ของ npm อาจถูก hoist ไว้ภายในโปรเจกต์ npm ที่ Plugin
จัดการอยู่ ดังนั้นการทดสอบควรพิสูจน์ว่าโปรเจกต์นั้นถูกสแกน/ล้างข้อมูล
แทนที่จะสมมติว่ามีเพียงแผนผัง
node_modulesภายในแพ็กเกจ Plugin เท่านั้น
ให้ Docker fixture ใหม่เป็นแบบ hermetic โดยค่าเริ่มต้น ใช้ registry fixture ในเครื่องและ แพ็กเกจปลอม เว้นแต่ว่าจุดประสงค์ของการทดสอบคือพฤติกรรมของ registry จริง
การคัดแยกความล้มเหลว
เริ่มจากตัวตนของ artifact:
- สรุป
resolve_packageของ Package Acceptance: ซอร์ส, เวอร์ชัน, SHA-256 และ ชื่อ artifact - Docker artifacts:
.artifacts/docker-tests/**/summary.json,failures.json, บันทึก lane และคำสั่ง rerun - สรุป upgrade survivor:
.artifacts/upgrade-survivor/summary.json, รวมถึงเวอร์ชัน baseline, เวอร์ชัน candidate, สถานการณ์, เวลาในแต่ละ phase และ ขั้นตอน recipe
ควร rerun lane ที่ล้มเหลวเดิมแบบเจาะจงด้วย artifact แพ็กเกจเดิม มากกว่า rerun release umbrella ทั้งหมด