Release and CI
Pengujian
-
Paket pengujian lengkap (rangkaian, langsung, Docker): Pengujian
-
Validasi pembaruan dan paket Plugin: Menguji pembaruan dan Plugin
-
pnpm test:force: Menghentikan setiap proses gateway yang tertinggal dan menahan port kontrol default, lalu menjalankan suite Vitest lengkap dengan port gateway terisolasi agar pengujian server tidak bertabrakan dengan instance yang sedang berjalan. Gunakan ini ketika proses gateway sebelumnya membuat port 18789 tetap terpakai. -
pnpm test:coverage: Menjalankan suite unit dengan cakupan V8 (melaluivitest.unit.config.ts). Ini adalah gate cakupan lane unit default, bukan cakupan seluruh file di seluruh repo. Ambangnya adalah 70% baris/fungsi/pernyataan dan 55% cabang. Karenacoverage.allbernilai false dan lane default membatasi cakupan mencakup pengujian unit non-fast dengan file sumber sibling, gate ini mengukur sumber yang dimiliki oleh lane ini, bukan setiap impor transitif yang kebetulan dimuatnya. -
pnpm test:coverage:changed: Menjalankan cakupan unit hanya untuk file yang berubah sejakorigin/main. -
pnpm test:changed: proses pengujian changed yang murah dan cerdas. Ini menjalankan target presisi dari edit pengujian langsung, file sibling*.test.ts, pemetaan sumber eksplisit, dan grafik impor lokal. Perubahan luas/konfigurasi/paket dilewati kecuali dipetakan ke pengujian presisi. -
OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed: proses pengujian changed luas yang eksplisit. Gunakan ini ketika edit harness/konfigurasi/paket pengujian harus jatuh kembali ke perilaku pengujian changed Vitest yang lebih luas. -
pnpm changed:lanes: menampilkan lane arsitektural yang dipicu oleh diff terhadaporigin/main. -
pnpm check:changed: menjalankan gate pemeriksaan changed cerdas untuk diff terhadaporigin/main. Ini menjalankan typecheck, lint, dan perintah guard untuk lane arsitektural yang terdampak, tetapi tidak menjalankan pengujian Vitest. Gunakanpnpm test:changedataupnpm test <target>eksplisit untuk bukti pengujian. -
pnpm test: merutekan target file/direktori eksplisit melalui lane Vitest yang tercakup. Proses tanpa target menggunakan grup shard tetap dan diperluas ke konfigurasi leaf untuk eksekusi paralel lokal; grup ekstensi selalu diperluas ke konfigurasi shard per ekstensi, bukan satu proses proyek root raksasa. -
Proses wrapper pengujian diakhiri dengan ringkasan singkat
[test] passed|failed|skipped ... in .... Baris durasi milik Vitest tetap menjadi detail per-shard. -
Status pengujian OpenClaw bersama: gunakan
src/test-utils/openclaw-test-state.tsdari Vitest ketika sebuah pengujian memerlukanHOME,OPENCLAW_STATE_DIR,OPENCLAW_CONFIG_PATH, fixture konfigurasi, workspace, direktori agen, atau penyimpanan auth-profile yang terisolasi. -
Helper E2E proses: gunakan
test/helpers/openclaw-test-instance.tsketika pengujian E2E tingkat proses Vitest memerlukan Gateway yang berjalan, env CLI, penangkapan log, dan pembersihan di satu tempat. -
Helper E2E Docker/Bash: lane yang melakukan source
scripts/lib/docker-e2e-image.shdapat meneruskandocker_e2e_test_state_shell_b64 <label> <scenario>ke dalam container dan mendekodenya denganscripts/lib/openclaw-e2e-instance.sh; skrip multi-home dapat meneruskandocker_e2e_test_state_function_b64dan memanggilopenclaw_test_state_create <label> <scenario>di setiap alur. Pemanggil tingkat lebih rendah dapat menggunakanscripts/lib/openclaw-test-state.mjs shell --label <name> --scenario <name>untuk snippet shell dalam container, ataunode scripts/lib/openclaw-test-state.mjs -- create --label <name> --scenario <name> --env-file <path> --jsonuntuk file env host yang dapat di-source.--sebelumcreatemencegah runtime Node yang lebih baru memperlakukan--env-filesebagai flag Node. Lane Docker/Bash yang meluncurkan Gateway dapat melakukan sourcescripts/lib/openclaw-e2e-instance.shdi dalam container untuk resolusi entrypoint, startup OpenAI tiruan, peluncuran Gateway foreground/background, probe kesiapan, ekspor env status, dump log, dan pembersihan proses. -
Proses shard full, ekstensi, dan include-pattern memperbarui data timing lokal di
.artifacts/vitest-shard-timings.json; proses whole-config berikutnya menggunakan timing tersebut untuk menyeimbangkan shard lambat dan cepat. Shard CI include-pattern menambahkan nama shard ke kunci timing, sehingga timing shard terfilter tetap terlihat tanpa mengganti data timing whole-config. SetelOPENCLAW_TEST_PROJECTS_TIMINGS=0untuk mengabaikan artefak timing lokal. -
File pengujian
plugin-sdkdancommandsterpilih kini dirutekan melalui lane ringan khusus yang hanya mempertahankantest/setup.ts, sementara kasus yang berat runtime tetap berada di lane yang sudah ada. -
File sumber dengan pengujian sibling dipetakan ke sibling tersebut sebelum jatuh kembali ke glob direktori yang lebih luas. Edit helper di bawah
src/channels/plugins/contracts/test-helpers,src/plugin-sdk/test-helpers, dansrc/plugins/contractsmenggunakan grafik impor lokal untuk menjalankan pengujian yang mengimpor, bukan menjalankan luas setiap shard ketika path dependensi presisi. -
auto-replykini juga dibagi menjadi tiga konfigurasi khusus (core,top-level,reply) sehingga harness balasan tidak mendominasi pengujian status/token/helper top-level yang lebih ringan. -
Konfigurasi dasar Vitest kini default ke
pool: "threads"danisolate: false, dengan runner non-terisolasi bersama diaktifkan di seluruh konfigurasi repo. -
pnpm test:channelsmenjalankanvitest.channels.config.ts. -
pnpm test:extensionsdanpnpm test extensionsmenjalankan semua shard ekstensi/Plugin. Plugin channel berat, Plugin browser, dan OpenAI berjalan sebagai shard khusus; grup Plugin lain tetap dibatch. Gunakanpnpm test extensions/<id>untuk satu lane Plugin bundled. -
pnpm test:perf:imports: mengaktifkan pelaporan durasi impor + breakdown impor Vitest, sambil tetap menggunakan perutean lane tercakup untuk target file/direktori eksplisit. -
pnpm test:perf:imports:changed: profiling impor yang sama, tetapi hanya untuk file yang berubah sejakorigin/main. -
pnpm test:perf:changed:bench -- --ref <git-ref>membenchmark path changed-mode yang dirutekan terhadap proses proyek root native untuk diff git yang sudah di-commit yang sama. -
pnpm test:perf:changed:bench -- --worktreemembenchmark set perubahan worktree saat ini tanpa harus commit terlebih dahulu. -
pnpm test:perf:profile:main: menulis profil CPU untuk thread utama Vitest (.artifacts/vitest-main-profile). -
pnpm test:perf:profile:runner: menulis profil CPU + heap untuk runner unit (.artifacts/vitest-runner-profile). -
pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json: menjalankan setiap konfigurasi leaf Vitest full-suite secara serial dan menulis data durasi terkelompok beserta artefak JSON/log per konfigurasi. Test Performance Agent menggunakan ini sebagai baseline sebelum mencoba perbaikan pengujian lambat. -
pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.json: membandingkan laporan terkelompok setelah perubahan yang berfokus pada performa. -
Integrasi Gateway: ikut serta melalui
OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm testataupnpm test:gateway. -
pnpm test:e2e: Menjalankan smoke test end-to-end gateway (pairing multi-instance WS/HTTP/node). Default kethreads+isolate: falsedengan worker adaptif divitest.e2e.config.ts; sesuaikan denganOPENCLAW_E2E_WORKERS=<n>dan setelOPENCLAW_E2E_VERBOSE=1untuk log verbose. -
pnpm test:live: Menjalankan pengujian live provider (minimax/zai). Memerlukan kunci API danLIVE=1(atau*_LIVE_TEST=1khusus provider) agar tidak dilewati. -
pnpm test:docker:all: Membangun image live-test bersama, mengemas OpenClaw sekali sebagai tarball npm, membangun/menggunakan ulang image runner Node/Git bare plus image fungsional yang menginstal tarball tersebut ke/app, lalu menjalankan lane smoke Docker denganOPENCLAW_SKIP_DOCKER_BUILD=1melalui scheduler berbobot. Image bare (OPENCLAW_DOCKER_E2E_BARE_IMAGE) digunakan untuk lane installer/update/plugin-dependency; lane tersebut memasang tarball prabangun, bukan menggunakan sumber repo yang disalin. Image fungsional (OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE) digunakan untuk lane fungsionalitas aplikasi terbangun normal.scripts/package-openclaw-for-docker.mjsadalah pengemas paket lokal/CI tunggal dan memvalidasi tarball besertadist/postinstall-inventory.jsonsebelum Docker mengonsumsinya. Definisi lane Docker berada discripts/lib/docker-e2e-scenarios.mjs; logika planner berada discripts/lib/docker-e2e-plan.mjs;scripts/test-docker-all.mjsmengeksekusi plan yang dipilih.node scripts/test-docker-all.mjs --plan-jsonmemancarkan plan CI milik scheduler untuk lane terpilih, jenis image, kebutuhan paket/live-image, skenario status, dan pemeriksaan kredensial tanpa membangun atau menjalankan Docker.OPENCLAW_DOCKER_ALL_PARALLELISM=<n>mengontrol slot proses dan default ke 10;OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM=<n>mengontrol pool tail yang sensitif provider dan default ke 10. Batas lane berat default keOPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=10, danOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; batas provider default ke satu lane berat per provider melaluiOPENCLAW_DOCKER_ALL_LIVE_CLAUDE_LIMIT=4,OPENCLAW_DOCKER_ALL_LIVE_CODEX_LIMIT=4, danOPENCLAW_DOCKER_ALL_LIVE_GEMINI_LIMIT=4. GunakanOPENCLAW_DOCKER_ALL_WEIGHT_LIMITatauOPENCLAW_DOCKER_ALL_DOCKER_LIMITuntuk host yang lebih besar. Jika satu lane melampaui bobot efektif atau batas resource pada host dengan paralelisme rendah, lane itu tetap dapat mulai dari pool kosong dan akan berjalan sendiri sampai melepas kapasitas. Start lane diberi jeda 2 detik secara default untuk menghindari badai create daemon Docker lokal; override denganOPENCLAW_DOCKER_ALL_START_STAGGER_MS=<ms>. Runner melakukan preflight Docker secara default, membersihkan container E2E OpenClaw yang usang, memancarkan status lane aktif setiap 30 detik, berbagi cache tool CLI provider antar-lane yang kompatibel, mencoba ulang kegagalan live-provider sementara sekali secara default (OPENCLAW_DOCKER_ALL_LIVE_RETRIES=<n>), dan menyimpan timing lane di.artifacts/docker-tests/lane-timings.jsonuntuk pengurutan terlama-terlebih-dulu pada proses berikutnya. GunakanOPENCLAW_DOCKER_ALL_DRY_RUN=1untuk mencetak manifes lane tanpa menjalankan Docker,OPENCLAW_DOCKER_ALL_STATUS_INTERVAL_MS=<ms>untuk menyesuaikan output status, atauOPENCLAW_DOCKER_ALL_TIMINGS=0untuk menonaktifkan penggunaan ulang timing. GunakanOPENCLAW_DOCKER_ALL_LIVE_MODE=skiphanya untuk lane deterministik/lokal atauOPENCLAW_DOCKER_ALL_LIVE_MODE=onlyhanya untuk lane live-provider; alias paketnya adalahpnpm test:docker:local:alldanpnpm test:docker:live:all. Mode live-only menggabungkan lane live utama dan tail menjadi satu pool terlama-terlebih-dulu sehingga bucket provider dapat mengemas pekerjaan Claude, Codex, dan Gemini bersama-sama. Runner berhenti menjadwalkan lane pooled baru setelah kegagalan pertama kecualiOPENCLAW_DOCKER_ALL_FAIL_FAST=0disetel, dan setiap lane memiliki fallback timeout 120 menit yang dapat dioverride denganOPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS; lane live/tail terpilih menggunakan batas per-lane yang lebih ketat. Perintah setup Docker backend CLI memiliki timeout sendiri melaluiOPENCLAW_LIVE_CLI_BACKEND_SETUP_TIMEOUT_SECONDS(default 180). Log per-lane,summary.json,failures.json, dan timing fase ditulis di bawah.artifacts/docker-tests/<run-id>/; gunakanpnpm test:docker:timings <summary.json>untuk memeriksa lane lambat danpnpm test:docker:rerun <run-id|summary.json|failures.json>untuk mencetak perintah rerun tertarget yang murah. -
pnpm test:docker:browser-cdp-snapshot: Membangun container E2E sumber berbasis Chromium, memulai CDP mentah plus Gateway terisolasi, menjalankanbrowser doctor --deep, dan memverifikasi snapshot peran CDP menyertakan URL tautan, clickable yang dipromosikan kursor, referensi iframe, dan metadata frame. -
Probe Docker live backend CLI dapat dijalankan sebagai lane terfokus, misalnya
pnpm test:docker:live-cli-backend:codex,pnpm test:docker:live-cli-backend:codex:resume, ataupnpm test:docker:live-cli-backend:codex:mcp. Claude dan Gemini memiliki alias:resumedan:mcpyang sepadan. -
pnpm test:docker:openwebui: Memulai OpenClaw + Open WebUI dalam Docker, masuk melalui Open WebUI, memeriksa/api/models, lalu menjalankan chat terproksi nyata melalui/api/chat/completions. Memerlukan kunci model live yang dapat digunakan (misalnya OpenAI di~/.profile), menarik image Open WebUI eksternal, dan tidak diharapkan stabil di CI seperti suite unit/e2e normal. -
pnpm test:docker:mcp-channels: Memulai container Gateway yang sudah diberi seed dan container klien kedua yang menjalankanopenclaw mcp serve, lalu memverifikasi penemuan percakapan yang dirutekan, pembacaan transkrip, metadata lampiran, perilaku antrean event live, perutean pengiriman keluar, serta notifikasi saluran + izin bergaya Claude melalui bridge stdio nyata. Assertion notifikasi Claude membaca frame MCP stdio mentah secara langsung sehingga smoke test mencerminkan apa yang benar-benar dipancarkan bridge. -
pnpm test:docker:upgrade-survivor: Menginstal tarball OpenClaw yang sudah dipaketkan di atas fixture pengguna lama yang kotor, menjalankan pembaruan package plus doctor noninteraktif tanpa kunci provider atau saluran live, lalu memulai Gateway loopback dan memeriksa bahwa agen, konfigurasi saluran, allowlist Plugin, file workspace/sesi, status dependensi Plugin legacy yang usang, startup, dan status RPC tetap bertahan. -
pnpm test:docker:published-upgrade-survivor: Menginstalopenclaw@latestsecara default, men-seed file pengguna yang sudah ada secara realistis tanpa kunci provider atau saluran live, mengonfigurasi baseline tersebut dengan resep perintahopenclaw config setyang sudah dibaked, memperbarui instalasi terpublikasi tersebut ke tarball OpenClaw yang sudah dipaketkan, menjalankan doctor noninteraktif, menulis.artifacts/upgrade-survivor/summary.json, lalu memulai Gateway loopback dan memeriksa bahwa intent yang dikonfigurasi, file workspace/sesi, konfigurasi Plugin yang usang dan status dependensi legacy, startup,/healthz,/readyz, serta status RPC bertahan atau diperbaiki dengan bersih. Timpa satu baseline denganOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, perluas matriks lokal eksak denganOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECSseperti[email protected] [email protected] [email protected], atau tambahkan fixture skenario denganOPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues; set reported-issues menyertakanconfigured-plugin-installsuntuk memverifikasi bahwa Plugin OpenClaw eksternal yang dikonfigurasi terinstal otomatis selama upgrade danstale-source-plugin-shadowuntuk mencegah shadow Plugin khusus sumber merusak startup. Package Acceptance mengeksposnya sebagaipublished_upgrade_survivor_baseline,published_upgrade_survivor_baselines, danpublished_upgrade_survivor_scenarios, serta menyelesaikan token baseline meta sepertilast-stable-4atauall-since-2026.4.23sebelum menyerahkan spesifikasi package eksak ke lane Docker. -
pnpm test:docker:update-migration: Menjalankan harness survivor published-upgrade dalam skenarioplugin-deps-cleanupyang banyak melakukan cleanup, dimulai dari[email protected]secara default. WorkflowUpdate Migrationyang terpisah memperluas lane ini denganbaselines=all-since-2026.4.23sehingga setiap package stabil terpublikasi dari.23dan seterusnya diperbarui ke kandidat serta membuktikan cleanup dependensi Plugin yang dikonfigurasi di luar Full Release CI. -
pnpm test:docker:plugins: Menjalankan smoke test instal/pembaruan untuk path lokal,file:, package registry npm dengan dependensi yang di-hoist, ref git yang bergerak, fixture ClawHub, pembaruan marketplace, serta enable/inspect bundle Claude.
Gerbang PR lokal
Untuk pemeriksaan land/gate PR lokal, jalankan:
pnpm check:changedpnpm checkpnpm check:test-typespnpm buildpnpm testpnpm check:docs
Jika pnpm test flaky pada host yang sedang terbebani, jalankan ulang sekali sebelum menganggapnya sebagai regresi, lalu isolasi dengan pnpm test <path/to/test>. Untuk host dengan memori terbatas, gunakan:
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed
Tolok ukur latensi model (kunci lokal)
Skrip: scripts/bench-model.ts
Penggunaan:
source ~/.profile && pnpm tsx scripts/bench-model.ts --runs 10- Env opsional:
MINIMAX_API_KEY,MINIMAX_BASE_URL,MINIMAX_MODEL,ANTHROPIC_API_KEY - Prompt bawaan: "Balas dengan satu kata: ok. Tanpa tanda baca atau teks tambahan."
Jalankan terakhir (2025-12-31, 20 kali jalan):
- minimax median 1279ms (min 1114, maks 2431)
- opus median 2454ms (min 1224, maks 3170)
Tolok ukur startup CLI
Skrip: scripts/bench-cli-startup.ts
Penggunaan:
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
Preset:
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: kedua preset
Output mencakup sampleCount, rata-rata, p50, p95, min/maks, distribusi kode keluar/sinyal, dan ringkasan RSS maksimum untuk setiap perintah. --cpu-prof-dir / --heap-prof-dir opsional menulis profil V8 per run sehingga pengukuran waktu dan pengambilan profil memakai harness yang sama.
Konvensi output tersimpan:
pnpm test:startup:bench:smokemenulis artefak smoke tertarget di.artifacts/cli-startup-bench-smoke.jsonpnpm test:startup:bench:savemenulis artefak suite penuh di.artifacts/cli-startup-bench-all.jsonmenggunakanruns=5danwarmup=1pnpm test:startup:bench:updatemenyegarkan fixture baseline yang disimpan di repo padatest/fixtures/cli-startup-bench.jsonmenggunakanruns=5danwarmup=1
Fixture yang disimpan di repo:
test/fixtures/cli-startup-bench.json- Segarkan dengan
pnpm test:startup:bench:update - Bandingkan hasil saat ini dengan fixture menggunakan
pnpm test:startup:bench:check
Onboarding E2E (Docker)
Docker bersifat opsional; ini hanya diperlukan untuk uji smoke onboarding dalam container.
Alur cold-start penuh dalam container Linux yang bersih:
scripts/e2e/onboard-docker.sh
Skrip ini menjalankan wizard interaktif melalui pseudo-tty, memverifikasi file config/workspace/session, lalu memulai Gateway dan menjalankan openclaw health.
Smoke impor QR (Docker)
Memastikan helper runtime QR yang dipelihara dimuat pada runtime Docker Node yang didukung (Node 24 bawaan, Node 22 kompatibel):
pnpm test:docker:qr