Release and CI
การทดสอบ
-
ชุดเครื่องมือทดสอบครบชุด (ชุดทดสอบ, สด, Docker): การทดสอบ
-
การตรวจสอบความถูกต้องของการอัปเดตและแพ็กเกจ Plugin: การทดสอบการอัปเดตและ Plugin
-
pnpm test:force: ฆ่าโปรเซส Gateway ที่ค้างอยู่ซึ่งยึดพอร์ตควบคุมเริ่มต้นไว้ จากนั้นรันชุด Vitest ทั้งหมดด้วยพอร์ต Gateway แบบแยก เพื่อให้การทดสอบเซิร์ฟเวอร์ไม่ชนกับอินสแตนซ์ที่กำลังรันอยู่ ใช้คำสั่งนี้เมื่อการรัน Gateway ก่อนหน้าทิ้งพอร์ต 18789 ให้ถูกใช้งานอยู่ -
pnpm test:coverage: รันชุด unit พร้อม V8 coverage (ผ่านvitest.unit.config.ts) นี่เป็น coverage gate ของ default-unit-lane ไม่ใช่ coverage ทั้งรีโปสำหรับทุกไฟล์ เกณฑ์คือ 70% สำหรับ lines/functions/statements และ 55% สำหรับ branches เนื่องจากcoverage.allเป็น false และ lane เริ่มต้นจำกัด coverage includes ไว้ที่การทดสอบ unit แบบ non-fast ที่มีไฟล์ซอร์สพี่น้องกัน gate นี้จึงวัดซอร์สที่ lane นี้เป็นเจ้าของแทนที่จะวัดทุก transitive import ที่บังเอิญโหลดขึ้นมา -
pnpm test:coverage:changed: รัน unit coverage เฉพาะไฟล์ที่เปลี่ยนตั้งแต่origin/main -
pnpm test:changed: การรันทดสอบ changed แบบ smart ราคาถูก รันเป้าหมายที่แม่นยำจากการแก้ไขไฟล์ทดสอบโดยตรง ไฟล์พี่น้อง*.test.tsการแมปซอร์สที่ระบุชัดเจน และกราฟ import ภายในเครื่อง การเปลี่ยนแปลง broad/config/package จะถูกข้ามเว้นแต่จะแมปไปยังการทดสอบที่แม่นยำได้ -
OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed: การรันทดสอบ changed แบบ broad ที่ระบุชัดเจน ใช้เมื่อการแก้ไข test harness/config/package ควรถอยกลับไปใช้พฤติกรรม changed-test ที่กว้างกว่าของ Vitest -
pnpm changed:lanes: แสดง lane ทางสถาปัตยกรรมที่ถูกกระตุ้นโดย diff เทียบกับorigin/main -
pnpm check:changed: รัน smart changed check gate สำหรับ diff เทียบกับorigin/mainคำสั่งนี้รัน typecheck, lint และคำสั่ง guard สำหรับ lane ทางสถาปัตยกรรมที่ได้รับผลกระทบ แต่ไม่รันการทดสอบ Vitest ใช้pnpm test:changedหรือpnpm test <target>ที่ระบุชัดเจนเพื่อเป็นหลักฐานการทดสอบ -
pnpm test: ส่งเป้าหมายไฟล์/ไดเรกทอรีที่ระบุชัดเจนผ่าน lane Vitest ที่จำกัดขอบเขต การรันที่ไม่ระบุเป้าหมายใช้กลุ่ม shard คงที่และขยายเป็น leaf config สำหรับการรันแบบขนานภายในเครื่อง กลุ่ม extension จะขยายเป็น config shard ราย extension เสมอ แทนที่จะเป็นโปรเซสรูตโปรเจกต์ขนาดใหญ่เพียงตัวเดียว -
การรัน test wrapper จะจบด้วยสรุปสั้น ๆ รูปแบบ
[test] passed|failed|skipped ... in ...บรรทัดระยะเวลาของ Vitest เองยังคงเป็นรายละเอียดราย shard -
สถานะทดสอบร่วมของ OpenClaw: ใช้
src/test-utils/openclaw-test-state.tsจาก Vitest เมื่อการทดสอบต้องการHOME,OPENCLAW_STATE_DIR,OPENCLAW_CONFIG_PATH, fixture คอนฟิก, workspace, agent dir หรือ auth-profile store แบบแยก -
ตัวช่วย Process E2E: ใช้
test/helpers/openclaw-test-instance.tsเมื่อการทดสอบ E2E ระดับโปรเซสของ Vitest ต้องการ Gateway ที่กำลังรัน, env ของ CLI, การจับ log และการ cleanup ในที่เดียว -
ตัวช่วย Docker/Bash E2E: lane ที่ source
scripts/lib/docker-e2e-image.shสามารถส่งdocker_e2e_test_state_shell_b64 <label> <scenario>เข้าไปในคอนเทนเนอร์และถอดรหัสด้วยscripts/lib/openclaw-e2e-instance.sh; สคริปต์แบบหลาย home สามารถส่งdocker_e2e_test_state_function_b64และเรียกopenclaw_test_state_create <label> <scenario>ในแต่ละ flow ได้ caller ระดับล่างสามารถใช้scripts/lib/openclaw-test-state.mjs shell --label <name> --scenario <name>สำหรับ snippet shell ในคอนเทนเนอร์ หรือnode scripts/lib/openclaw-test-state.mjs -- create --label <name> --scenario <name> --env-file <path> --jsonสำหรับไฟล์ env ของ host ที่ source ได้ เครื่องหมาย--ก่อนcreateป้องกันไม่ให้ runtime Node รุ่นใหม่ตีความ--env-fileเป็น flag ของ Node lane Docker/Bash ที่เปิด Gateway สามารถ sourcescripts/lib/openclaw-e2e-instance.shภายในคอนเทนเนอร์สำหรับการ resolve entrypoint, การเริ่ม mock OpenAI, การเปิด Gateway แบบ foreground/background, readiness probe, การ export state env, การ dump log และการ cleanup โปรเซส -
การรัน shard แบบ full, extension และ include-pattern อัปเดตข้อมูล timing ภายในเครื่องใน
.artifacts/vitest-shard-timings.json; การรัน whole-config ภายหลังใช้ timing เหล่านั้นเพื่อถ่วงดุล shard ที่ช้าและเร็ว shard CI แบบ include-pattern จะต่อท้ายชื่อ shard เข้าในคีย์ timing ซึ่งทำให้ timing ของ shard ที่ถูกกรองยังมองเห็นได้โดยไม่แทนที่ข้อมูล timing ของ whole-config ตั้งค่าOPENCLAW_TEST_PROJECTS_TIMINGS=0เพื่อไม่ใช้ artifact timing ภายในเครื่อง -
ไฟล์ทดสอบ
plugin-sdkและcommandsที่เลือกไว้ตอนนี้ถูกส่งผ่าน lane เบาเฉพาะทางที่คงไว้เฉพาะtest/setup.tsโดยปล่อยเคสที่หนักด้าน runtime ให้อยู่บน lane เดิมของมัน -
ไฟล์ซอร์สที่มีการทดสอบพี่น้องกันจะถูกแมปไปยังไฟล์พี่น้องนั้นก่อน แล้วจึงถอยกลับไปใช้ glob ไดเรกทอรีที่กว้างกว่า การแก้ไขตัวช่วยภายใต้
src/channels/plugins/contracts/test-helpers,src/plugin-sdk/test-helpersและsrc/plugins/contractsใช้กราฟ import ภายในเครื่องเพื่อรันการทดสอบที่ import อยู่ แทนที่จะรันทุก shard แบบ broad เมื่อ path ของ dependency แม่นยำ -
ตอนนี้
auto-replyแยกออกเป็น config เฉพาะสามชุดด้วย (core,top-level,reply) เพื่อให้ reply harness ไม่ครอบงำการทดสอบสถานะ/token/helper ระดับ top-level ที่เบากว่า -
ตอนนี้ base Vitest config ตั้งค่าเริ่มต้นเป็น
pool: "threads"และisolate: falseพร้อมเปิดใช้ runner แบบ non-isolated ที่ใช้ร่วมกันข้าม config ในรีโป -
pnpm test:channelsรันvitest.channels.config.ts -
pnpm test:extensionsและpnpm test extensionsรัน shard ของ extension/Plugin ทั้งหมด Plugin ช่องทางหนัก, Plugin เบราว์เซอร์ และ OpenAI รันเป็น shard เฉพาะ ส่วนกลุ่ม Plugin อื่นยังคงถูกรวมเป็น batch ใช้pnpm test extensions/<id>สำหรับ lane ของ Plugin bundled เพียงตัวเดียว -
pnpm test:perf:imports: เปิดใช้การรายงานระยะเวลา import และ import-breakdown ของ Vitest โดยยังใช้ scoped lane routing สำหรับเป้าหมายไฟล์/ไดเรกทอรีที่ระบุชัดเจน -
pnpm test:perf:imports:changed: profiling การ import แบบเดียวกัน แต่เฉพาะไฟล์ที่เปลี่ยนตั้งแต่origin/main -
pnpm test:perf:changed:bench -- --ref <git-ref>benchmark เส้นทาง changed-mode ที่ถูก route เทียบกับการรัน root-project แบบ native สำหรับ git diff ที่ commit แล้วชุดเดียวกัน -
pnpm test:perf:changed:bench -- --worktreebenchmark ชุดการเปลี่ยนแปลงใน worktree ปัจจุบันโดยไม่ต้อง commit ก่อน -
pnpm test:perf:profile:main: เขียน CPU profile สำหรับ thread หลักของ Vitest (.artifacts/vitest-main-profile) -
pnpm test:perf:profile:runner: เขียน CPU + heap profile สำหรับ unit runner (.artifacts/vitest-runner-profile) -
pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json: รัน leaf config ของ Vitest แบบ full-suite ทั้งหมดทีละชุดและเขียนข้อมูลระยะเวลาแบบจัดกลุ่มพร้อม artifact JSON/log ราย config Test Performance Agent ใช้สิ่งนี้เป็น baseline ก่อนพยายามแก้การทดสอบที่ช้า -
pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.json: เปรียบเทียบรายงานแบบจัดกลุ่มหลังการเปลี่ยนแปลงที่มุ่งเน้น performance -
การผสานรวม Gateway: เลือกเปิดใช้ผ่าน
OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm testหรือpnpm test:gateway -
pnpm test:e2e: รัน smoke test แบบ end-to-end ของ Gateway (การจับคู่หลายอินสแตนซ์ผ่าน WS/HTTP/node) ค่าเริ่มต้นคือthreads+isolate: falseพร้อม worker แบบปรับตามสถานการณ์ในvitest.e2e.config.ts; ปรับด้วยOPENCLAW_E2E_WORKERS=<n>และตั้งOPENCLAW_E2E_VERBOSE=1สำหรับ log แบบละเอียด -
pnpm test:live: รันการทดสอบ live ของ provider (minimax/zai) ต้องมี API key และLIVE=1(หรือ*_LIVE_TEST=1เฉพาะ provider) เพื่อยกเลิกการ skip -
pnpm test:docker:all: สร้าง image live-test ที่ใช้ร่วมกัน, pack OpenClaw หนึ่งครั้งเป็น npm tarball, สร้าง/ใช้ซ้ำ image runner แบบ bare Node/Git พร้อม image เชิงฟังก์ชันที่ติดตั้ง tarball นั้นลงใน/appจากนั้นรัน lane smoke ของ Docker ด้วยOPENCLAW_SKIP_DOCKER_BUILD=1ผ่าน scheduler แบบถ่วงน้ำหนัก image แบบ bare (OPENCLAW_DOCKER_E2E_BARE_IMAGE) ใช้สำหรับ lane installer/update/plugin-dependency; lane เหล่านั้น mount tarball ที่สร้างไว้ล่วงหน้าแทนการใช้ซอร์สจากรีโปที่คัดลอกมา image เชิงฟังก์ชัน (OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE) ใช้สำหรับ lane ฟังก์ชันการทำงานปกติของแอปที่ build แล้วscripts/package-openclaw-for-docker.mjsเป็น package packer เดียวสำหรับ local/CI และตรวจสอบ tarball พร้อมdist/postinstall-inventory.jsonก่อนที่ Docker จะใช้ นิยาม lane ของ Docker อยู่ในscripts/lib/docker-e2e-scenarios.mjs; logic ของ planner อยู่ในscripts/lib/docker-e2e-plan.mjs;scripts/test-docker-all.mjsรันแผนที่เลือกnode scripts/test-docker-all.mjs --plan-jsonปล่อยแผน CI ที่ scheduler เป็นเจ้าของสำหรับ lane ที่เลือก, ชนิด image, ความต้องการ package/live-image, scenario สถานะ และการตรวจ credential โดยไม่ build หรือรัน DockerOPENCLAW_DOCKER_ALL_PARALLELISM=<n>ควบคุม slot ของโปรเซสและมีค่าเริ่มต้นเป็น 10;OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM=<n>ควบคุม tail pool ที่อ่อนไหวต่อ provider และมีค่าเริ่มต้นเป็น 10 cap ของ lane หนักมีค่าเริ่มต้นเป็นOPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=10และOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; cap ของ provider มีค่าเริ่มต้นเป็น lane หนักหนึ่ง lane ต่อ provider ผ่านOPENCLAW_DOCKER_ALL_LIVE_CLAUDE_LIMIT=4,OPENCLAW_DOCKER_ALL_LIVE_CODEX_LIMIT=4และOPENCLAW_DOCKER_ALL_LIVE_GEMINI_LIMIT=4ใช้OPENCLAW_DOCKER_ALL_WEIGHT_LIMITหรือOPENCLAW_DOCKER_ALL_DOCKER_LIMITสำหรับ host ที่ใหญ่กว่า หาก lane หนึ่งเกินน้ำหนักที่มีผลหรือ resource cap บน host ที่มี parallelism ต่ำ lane นั้นยังสามารถเริ่มจาก pool ว่างได้และจะรันเดี่ยวจนกว่าจะปล่อย capacity การเริ่ม lane ถูกหน่วงห่างกัน 2 วินาทีตามค่าเริ่มต้นเพื่อหลีกเลี่ยง create storm ของ Docker daemon ภายในเครื่อง; override ด้วยOPENCLAW_DOCKER_ALL_START_STAGGER_MS=<ms>runner จะ preflight Docker ตามค่าเริ่มต้น, ล้างคอนเทนเนอร์ OpenClaw E2E ที่ค้างอยู่, แสดงสถานะ active-lane ทุก 30 วินาที, แชร์ cache ของ provider CLI tool ระหว่าง lane ที่เข้ากันได้, retry ความล้มเหลวชั่วคราวของ live-provider หนึ่งครั้งตามค่าเริ่มต้น (OPENCLAW_DOCKER_ALL_LIVE_RETRIES=<n>) และเก็บ timing ของ lane ไว้ใน.artifacts/docker-tests/lane-timings.jsonเพื่อจัดลำดับแบบ longest-first ในการรันภายหลัง ใช้OPENCLAW_DOCKER_ALL_DRY_RUN=1เพื่อพิมพ์ manifest ของ lane โดยไม่รัน Docker,OPENCLAW_DOCKER_ALL_STATUS_INTERVAL_MS=<ms>เพื่อปรับเอาต์พุตสถานะ หรือOPENCLAW_DOCKER_ALL_TIMINGS=0เพื่อปิดการใช้ timing ซ้ำ ใช้OPENCLAW_DOCKER_ALL_LIVE_MODE=skipสำหรับ lane แบบ deterministic/local เท่านั้น หรือOPENCLAW_DOCKER_ALL_LIVE_MODE=onlyสำหรับ lane ของ live-provider เท่านั้น; alias ของ package คือpnpm test:docker:local:allและpnpm test:docker:live:allโหมด live-only รวม lane live หลักและ tail เข้าสู่ pool เดียวแบบ longest-first เพื่อให้ bucket ของ provider สามารถจัดงาน Claude, Codex และ Gemini ร่วมกันได้ runner จะหยุด schedule lane ใหม่ใน pool หลังความล้มเหลวครั้งแรก เว้นแต่ตั้งOPENCLAW_DOCKER_ALL_FAIL_FAST=0และแต่ละ lane มี timeout fallback 120 นาทีที่ override ได้ด้วยOPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS; lane live/tail ที่เลือกใช้ cap ราย lane ที่เข้มกว่า คำสั่ง setup ของ Docker สำหรับ CLI backend มี timeout ของตัวเองผ่านOPENCLAW_LIVE_CLI_BACKEND_SETUP_TIMEOUT_SECONDS(ค่าเริ่มต้น 180) log ราย lane,summary.json,failures.jsonและ phase timing จะถูกเขียนไว้ภายใต้.artifacts/docker-tests/<run-id>/; ใช้pnpm test:docker:timings <summary.json>เพื่อตรวจดู lane ที่ช้า และpnpm test:docker:rerun <run-id|summary.json|failures.json>เพื่อพิมพ์คำสั่ง rerun แบบกำหนดเป้าหมายที่ราคาถูก -
pnpm test:docker:browser-cdp-snapshot: สร้างคอนเทนเนอร์ E2E จากซอร์สที่ใช้ Chromium, เริ่ม raw CDP พร้อม Gateway แบบแยก, รันbrowser doctor --deepและตรวจสอบว่า snapshot ของ role CDP มี URL ของลิงก์, clickable ที่ถูกยกระดับจาก cursor, iframe ref และ metadata ของ frame -
probe Docker แบบ live สำหรับ CLI backend สามารถรันเป็น lane แบบ focused ได้ เช่น
pnpm test:docker:live-cli-backend:codex,pnpm test:docker:live-cli-backend:codex:resumeหรือpnpm test:docker:live-cli-backend:codex:mcpClaude และ Gemini มี alias:resumeและ:mcpที่สอดคล้องกัน -
pnpm test:docker:openwebui: เริ่ม OpenClaw + Open WebUI ใน Docker, ลงชื่อเข้าใช้ผ่าน Open WebUI, ตรวจสอบ/api/modelsจากนั้นรันแชตจริงที่ proxy ผ่าน/api/chat/completionsต้องมี key ของ live model ที่ใช้งานได้ (เช่น OpenAI ใน~/.profile), ดึง image Open WebUI ภายนอก และไม่คาดว่าจะเสถียรสำหรับ CI เท่ากับชุด unit/e2e ปกติ -
pnpm test:docker:mcp-channels: เริ่มคอนเทนเนอร์ Gateway ที่ seeded แล้ว และคอนเทนเนอร์ไคลเอนต์ตัวที่สองที่ spawnopenclaw mcp serveจากนั้นตรวจสอบการค้นพบบทสนทนาที่ถูก route, การอ่าน transcript, metadata ของ attachment, พฤติกรรมคิว live event, การ route การส่งออก และการแจ้งเตือน channel + permission แบบ Claude ผ่าน stdio bridge จริง การ assert การแจ้งเตือนของ Claude จะอ่าน raw stdio MCP frames โดยตรง เพื่อให้ smoke สะท้อนสิ่งที่ bridge ปล่อยออกมาจริง -
pnpm test:docker:upgrade-survivor: ติดตั้ง OpenClaw tarball ที่แพ็กไว้ทับ fixture ผู้ใช้เก่าแบบ dirty, รัน package update พร้อม doctor แบบ non-interactive โดยไม่มี live provider หรือ channel keys จากนั้นเริ่ม loopback Gateway และตรวจสอบว่า agents, channel config, plugin allowlists, workspace/session files, สถานะ dependency ของ legacy plugin ที่ค้างอยู่, startup และ RPC status ยังอยู่รอด -
pnpm test:docker:published-upgrade-survivor: ติดตั้งopenclaw@latestตามค่าเริ่มต้น, seed ไฟล์ผู้ใช้เดิมที่สมจริงโดยไม่มี live provider หรือ channel keys, กำหนดค่า baseline นั้นด้วยสูตรคำสั่งopenclaw config setที่ baked ไว้, อัปเดต published install นั้นเป็น OpenClaw tarball ที่แพ็กไว้, รัน doctor แบบ non-interactive, เขียน.artifacts/upgrade-survivor/summary.jsonจากนั้นเริ่ม loopback Gateway และตรวจสอบว่า configured intents, workspace/session files, plugin config ที่ค้างอยู่และสถานะ legacy dependency, startup,/healthz,/readyzและ RPC status ยังอยู่รอดหรือซ่อมแซมได้สะอาด Override baseline หนึ่งรายการด้วยOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, ขยาย exact local matrix ด้วยOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECSเช่น[email protected] [email protected] [email protected]หรือเพิ่ม scenario fixtures ด้วยOPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues; ชุด reported-issues มีconfigured-plugin-installsเพื่อตรวจสอบว่า OpenClaw plugins ภายนอกที่กำหนดค่าไว้ถูกติดตั้งอัตโนมัติระหว่างอัปเกรด และstale-source-plugin-shadowเพื่อป้องกันไม่ให้ source-only plugin shadows ทำให้ startup พัง Package Acceptance เปิดเผยค่าเหล่านั้นเป็นpublished_upgrade_survivor_baseline,published_upgrade_survivor_baselinesและpublished_upgrade_survivor_scenariosและ resolve meta baseline tokens เช่นlast-stable-4หรือall-since-2026.4.23ก่อนส่ง exact package specs ให้ Docker lanes -
pnpm test:docker:update-migration: รัน published-upgrade survivor harness ใน scenarioplugin-deps-cleanupที่เน้น cleanup หนัก โดยเริ่มที่[email protected]ตามค่าเริ่มต้น workflowUpdate Migrationแยกต่างหากจะขยาย lane นี้ด้วยbaselines=all-since-2026.4.23เพื่อให้ published package stable ทุกตัวตั้งแต่.23เป็นต้นไปอัปเดตเป็น candidate และพิสูจน์การ cleanup dependency ของ configured-plugin นอก Full Release CI -
pnpm test:docker:plugins: รัน install/update smoke สำหรับ local path,file:, npm registry packages ที่มี hoisted dependencies, git moving refs, ClawHub fixtures, marketplace updates และ Claude-bundle enable/inspect
เกต PR ภายในเครื่อง
สำหรับการตรวจสอบ land/gate ของ PR ภายในเครื่อง ให้เรียกใช้:
pnpm check:changedpnpm checkpnpm check:test-typespnpm buildpnpm testpnpm check:docs
หาก pnpm test เกิดความไม่เสถียรบนโฮสต์ที่มีโหลดสูง ให้เรียกซ้ำหนึ่งครั้งก่อนถือว่าเป็นการถดถอย จากนั้นแยกตรวจสอบด้วย pnpm test <path/to/test> สำหรับโฮสต์ที่มีหน่วยความจำจำกัด ให้ใช้:
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed
เบนช์ความหน่วงของโมเดล (คีย์ภายในเครื่อง)
สคริปต์: scripts/bench-model.ts
การใช้งาน:
source ~/.profile && pnpm tsx scripts/bench-model.ts --runs 10- env เสริม:
MINIMAX_API_KEY,MINIMAX_BASE_URL,MINIMAX_MODEL,ANTHROPIC_API_KEY - พรอมต์เริ่มต้น: "ตอบกลับด้วยคำเดียว: ok ห้ามมีเครื่องหมายวรรคตอนหรือข้อความเพิ่มเติม"
การรันล่าสุด (2025-12-31, 20 ครั้ง):
- minimax ค่ามัธยฐาน 1279ms (ต่ำสุด 1114, สูงสุด 2431)
- opus ค่ามัธยฐาน 2454ms (ต่ำสุด 1224, สูงสุด 3170)
เบนช์การเริ่มต้น CLI
สคริปต์: scripts/bench-cli-startup.ts
การใช้งาน:
pnpm test:startup:benchpnpm test:startup:bench:smokepnpm test:startup:bench:savepnpm test:startup:bench:updatepnpm test:startup:bench:checkpnpm tsx scripts/bench-cli-startup.tspnpm tsx scripts/bench-cli-startup.ts --runs 12pnpm tsx scripts/bench-cli-startup.ts --preset realpnpm tsx scripts/bench-cli-startup.ts --preset real --case status --case gatewayStatus --runs 3pnpm tsx scripts/bench-cli-startup.ts --preset real --case tasksJson --case tasksListJson --case tasksAuditJson --runs 3pnpm tsx scripts/bench-cli-startup.ts --entry openclaw.mjs --entry-secondary dist/entry.js --preset allpnpm tsx scripts/bench-cli-startup.ts --preset all --output .artifacts/cli-startup-bench-all.jsonpnpm tsx scripts/bench-cli-startup.ts --preset real --case gatewayStatusJson --output .artifacts/cli-startup-bench-smoke.jsonpnpm tsx scripts/bench-cli-startup.ts --preset real --cpu-prof-dir .artifacts/cli-cpupnpm tsx scripts/bench-cli-startup.ts --json
พรีเซ็ต:
startup:--version,--help,health,health --json,status --json,statusreal:health,status,status --json,sessions,sessions --json,tasks --json,tasks list --json,tasks audit --json,agents list --json,gateway status,gateway status --json,gateway health --json,config get gateway.portall: ทั้งสองพรีเซ็ต
เอาต์พุตประกอบด้วย sampleCount, ค่าเฉลี่ย, p50, p95, ต่ำสุด/สูงสุด, การกระจายของ exit-code/signal และสรุป RSS สูงสุดสำหรับแต่ละคำสั่ง --cpu-prof-dir / --heap-prof-dir ที่เป็นตัวเลือกเสริมจะเขียนโปรไฟล์ V8 ต่อการรัน เพื่อให้การจับเวลาและการจับโปรไฟล์ใช้ฮาร์เนสเดียวกัน
ข้อตกลงของเอาต์พุตที่บันทึกไว้:
pnpm test:startup:bench:smokeเขียนอาร์ติแฟกต์ smoke แบบเจาะจงไว้ที่.artifacts/cli-startup-bench-smoke.jsonpnpm test:startup:bench:saveเขียนอาร์ติแฟกต์ชุดเต็มไว้ที่.artifacts/cli-startup-bench-all.jsonโดยใช้runs=5และwarmup=1pnpm test:startup:bench:updateรีเฟรช fixture baseline ที่เช็กอินไว้ที่test/fixtures/cli-startup-bench.jsonโดยใช้runs=5และwarmup=1
fixture ที่เช็กอินไว้:
test/fixtures/cli-startup-bench.json- รีเฟรชด้วย
pnpm test:startup:bench:update - เปรียบเทียบผลลัพธ์ปัจจุบันกับ fixture ด้วย
pnpm test:startup:bench:check
Onboarding E2E (Docker)
Docker เป็นตัวเลือกเสริม; ต้องใช้เฉพาะสำหรับการทดสอบ smoke ของ onboarding แบบคอนเทนเนอร์เท่านั้น
โฟลว์ cold-start เต็มรูปแบบในคอนเทนเนอร์ Linux ที่สะอาด:
scripts/e2e/onboard-docker.sh
สคริปต์นี้ขับวิซาร์ดแบบโต้ตอบผ่าน pseudo-tty, ตรวจสอบไฟล์ config/workspace/session จากนั้นเริ่ม Gateway และรัน openclaw health
QR import smoke (Docker)
ตรวจสอบให้แน่ใจว่าตัวช่วย QR runtime ที่ดูแลอยู่โหลดได้ภายใต้ Docker Node runtimes ที่รองรับ (ค่าเริ่มต้น Node 24, เข้ากันได้กับ Node 22):
pnpm test:docker:qr