OpenClaw 測試指南:執行單元測試與效能基準檢測
身為開發者,最讓人頭痛的莫過於在提交程式碼後,才發現測試環境與生產環境的行為不一致,或是因為依賴衝突導致測試套件頻繁崩潰。為了確保 OpenClaw 的穩定性與效能,我們建立了一套完整的測試與基準測試流程,幫助你快速驗證變更並優化開發體驗。
這份指南將帶你了解如何使用 OpenClaw 進行測試、效能基準評估以及容器化環境的驗證。
這是一套完整的測試工具組,包含測試套件、即時測試與 Docker 支援:Testing
pnpm test:force: 終止任何佔用預設控制 port 的殘留 Gateway 進程,然後以隔離的 Gateway port 執行完整的 Vitest 套件,確保伺服器測試不會與正在執行的實例衝突。當之前的 Gateway 執行導致 port 18789 被佔用時,請使用此指令。pnpm test:coverage: 使用 V8 覆蓋率執行單元測試套件(透過vitest.unit.config.ts)。這是一個已載入檔案的單元覆蓋率閘道,而非全儲存庫的檔案覆蓋率。門檻為 70% 的行數/函數/語句以及 55% 的分支。由於coverage.all為 false,此閘道測量的是由單元覆蓋率套件載入的檔案,而不是將每個拆分路徑的原始碼檔案視為未覆蓋。pnpm test:coverage:changed: 僅針對自origin/main以來變更過的檔案執行單元覆蓋率測試。pnpm test:changed: 當 diff 僅涉及可路由的原始碼/測試檔案時,將變更的 git 路徑擴展為範圍限定的 Vitest 通道。配置/設定變更仍會回退到原生的根專案執行,因此在需要時可以廣泛地重新執行佈線編輯。pnpm changed:lanes: 顯示針對origin/main的 diff 所觸發的架構通道。pnpm check:changed: 針對origin/main的 diff 執行智慧變更閘道。它使用核心測試通道執行核心工作,使用擴充功能測試通道執行擴充功能工作,使用測試型別檢查/測試執行僅測試工作,並將公開的 Plugin SDK 或插件合約變更擴展到擴充功能驗證。pnpm test: 透過範圍限定的 Vitest 通道路由明確的檔案/目錄目標。未設定目標的執行會使用固定的分片群組,並擴展到葉節點配置以進行本地平行執行;擴充功能群組總是擴展到每個擴充功能的分片配置,而不是一個巨大的根專案進程。- 完整與擴充功能分片執行會更新
.artifacts/vitest-shard-timings.json中的本地計時資料;後續執行會使用這些計時來平衡慢速與快速分片。設定OPENCLAW_TEST_PROJECTS_TIMINGS=0可忽略本地計時產物。 - 選定的
plugin-sdk和commands測試檔案現在透過專用的輕量通道路由,僅保留test/setup.ts,將執行繁重的案例留在現有的通道上。 - 選定的
plugin-sdk和commands輔助原始碼檔案也將pnpm test:changed對應到這些輕量通道中的明確兄弟測試,因此小的輔助編輯可以避免重新執行繁重的執行階段支援套件。 auto-reply現在也拆分為三個專用配置(core、top-level、reply),因此回覆工具不會佔用較輕量的頂層狀態/令牌/輔助測試。- 基礎 Vitest 配置現在預設為
pool: "threads"和isolate: false,並在儲存庫配置中啟用共享的非隔離執行器。 pnpm test:channels執行vitest.channels.config.ts。pnpm test:extensions和pnpm test extensions執行所有擴充功能/插件分片。繁重的頻道擴充功能和 OpenAI 作為專用分片執行;其他擴充功能群組保持批次處理。使用pnpm test extensions/<id>執行單一捆綁插件通道。pnpm test:perf:imports: 啟用 Vitest 匯入持續時間 + 匯入細分報告,同時仍對明確的檔案/目錄目標使用範圍限定的通道路由。pnpm test:perf:imports:changed: 相同的匯入分析,但僅針對自origin/main以來變更過的檔案。pnpm test:perf:changed:bench -- --ref <git-ref>針對相同的已提交 git diff,對路由變更模式路徑與原生根專案執行進行基準測試。pnpm test:perf:changed:bench -- --worktree在不先提交的情況下,對當前的工作樹變更集進行基準測試。pnpm test:perf:profile:main: 為 Vitest 主執行緒寫入 CPU 設定檔(.artifacts/vitest-main-profile)。pnpm test:perf:profile:runner: 為單元執行器寫入 CPU + 堆疊設定檔(.artifacts/vitest-runner-profile)。- Gateway 整合:透過
OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm test或pnpm test:gateway選擇加入。 pnpm test:e2e: 執行 Gateway 端對端冒煙測試(多實例 WS/HTTP/Node.js 配對)。預設為threads+isolate: false,並在vitest.e2e.config.ts中使用自適應工作執行緒;透過OPENCLAW_E2E_WORKERS=<n>進行調整,並設定OPENCLAW_E2E_VERBOSE=1以獲取詳細日誌。pnpm test:live: 執行提供者即時測試(minimax/zai)。需要 API 密鑰和LIVE=1(或提供者特定的*_LIVE_TEST=1)才能取消跳過。pnpm test:docker:openwebui: 啟動 Docker 化的 OpenClaw + Open WebUI,透過 Open WebUI 登入,檢查/api/models,然後透過/api/chat/completions執行真實的代理聊天。需要可用的即時模型密鑰(例如~/.profile中的 OpenAI),拉取外部 Open WebUI 映像,且預期不會像正常的單元/e2e 套件那樣在 CI 中保持穩定。pnpm test:docker:mcp-channels: 啟動一個種子 Gateway 容器和第二個客戶端容器,後者會產生openclaw mcp serve,然後驗證路由對話發現、轉錄讀取、附件元資料、即時事件佇列行為、出站傳送路由以及透過真實 stdio 橋接的 Claude 風格頻道 + 權限通知。Claude 通知斷言直接讀取原始 stdio MCP 影格,因此冒煙測試反映了橋接器實際發出的內容。
Local PR gate
Section titled “Local PR 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
Model latency bench (local keys)
Section titled “Model latency bench (local keys)”此腳本用於評估模型延遲,相關程式碼位於:scripts/bench-model.ts
使用方式如下:
source ~/.profile && pnpm tsx scripts/bench-model.ts --runs 10- 可選環境變數:
MINIMAX_API_KEY,MINIMAX_BASE_URL,MINIMAX_MODEL,ANTHROPIC_API_KEY - 預設提示詞:“Reply with a single word: ok. No punctuation or extra text.”
上次執行結果(2025-12-31, 20 次執行):
- minimax 中位數 1279ms (最小 1114, 最大 2431)
- opus 中位數 2454ms (最小 1224, 最大 3170)
CLI startup bench
Section titled “CLI startup bench”此腳本用於評估 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 --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,agents list --json,gateway status,gateway status --json,gateway health --json,config get gateway.portall: 包含上述兩個預設集
輸出包含每個指令的 sampleCount、平均值、p50、p95、最小/最大值、退出代碼/訊號分佈以及最大 RSS 摘要。可選的 --cpu-prof-dir / --heap-prof-dir 會為每次執行寫入 V8 設定檔,因此計時和設定檔擷取使用相同的工具。
已儲存輸出的慣例:
pnpm test:startup:bench:smoke將目標冒煙測試產物寫入.artifacts/cli-startup-bench-smoke.jsonpnpm test:startup:bench:save使用runs=5和warmup=1將完整套件產物寫入.artifacts/cli-startup-bench-all.jsonpnpm test:startup:bench:update使用runs=5和warmup=1更新test/fixtures/cli-startup-bench.json中的簽入基準固定裝置
簽入的固定裝置:
test/fixtures/cli-startup-bench.json- 使用
pnpm test:startup:bench:update重新整理 - 使用
pnpm test:startup:bench:check將當前結果與固定裝置進行比較
Onboarding E2E (Docker)
Section titled “Onboarding E2E (Docker)”Docker 是選用的;這僅用於容器化的開箱冒煙測試。
在乾淨的 Linux 容器中執行完整的冷啟動流程:
scripts/e2e/onboard-docker.sh此腳本透過虛擬終端機驅動互動式精靈,驗證配置/工作區/會話檔案,然後啟動 Gateway 並執行 openclaw health。
QR import smoke (Docker)
Section titled “QR import smoke (Docker)”確保 qrcode-terminal 在支援的 Docker Node.js 執行階段(預設為 Node.js 24,相容 Node.js 22)下正常載入:
pnpm test:docker:qr如果你在測試過程中遇到任何問題,歡迎隨時透過 AI Setup Assistant 尋求協助。
OpenClaw Expert
還是卡住了?
如果這篇文件沒有解決你的情境,直接問 OpenClaw Expert,拿到可執行步驟。