Testing
Pengujian
OpenClaw memiliki tiga rangkaian Vitest (unit/integrasi, e2e, live) ditambah runner Docker. Halaman ini membahas cakupan setiap rangkaian, perintah yang harus dijalankan untuk alur kerja tertentu, cara pengujian live menemukan kredensial, serta cara menambahkan regresi untuk bug penyedia/model di dunia nyata.
Mulai cepat
Pada sebagian besar hari:
- Gate lengkap (diharapkan sebelum push):
pnpm build && pnpm check && pnpm check:test-types && pnpm test - Menjalankan rangkaian lengkap secara lokal dengan lebih cepat pada mesin berkapasitas besar:
pnpm test:max - Loop watch Vitest langsung:
pnpm test:watch - Penargetan file langsung juga merutekan path plugin/channel:
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - Saat melakukan iterasi pada satu kegagalan, utamakan proses yang ditargetkan terlebih dahulu.
- Situs QA berbasis Docker:
pnpm qa:lab:up - Jalur QA berbasis VM Linux:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
Saat Anda menyentuh pengujian atau menginginkan keyakinan tambahan:
- Laporan cakupan V8 informasional:
pnpm test:coverage - Rangkaian E2E:
pnpm test:e2e
Direktori Sementara Pengujian
Gunakan helper bersama di test/helpers/temp-dir.ts untuk direktori sementara milik pengujian agar kepemilikan bersifat eksplisit dan pembersihan tetap berada dalam siklus hidup pengujian:
const tempDirs = useAutoCleanupTempDirTracker(afterEach); it("menggunakan ruang kerja sementara", () => { const workspace = tempDirs.make("openclaw-example-"); // gunakan ruang kerja});useAutoCleanupTempDirTracker(afterEach) sengaja tidak menyediakan metode pembersihan manual - Vitest memiliki pembersihan setelah setiap pengujian. Helper tingkat rendah yang lebih lama (makeTempDir, cleanupTempDirs, createTempDirTracker) masih tersedia untuk pengujian yang belum dimigrasikan; hindari penggunaan baru helper tersebut dan hindari pemanggilan fs.mkdtemp* baru secara langsung, kecuali pengujian secara eksplisit memverifikasi perilaku direktori sementara mentah. Jika direktori sementara langsung benar-benar diperlukan, tambahkan komentar izin yang dapat diaudit beserta alasannya:
// openclaw-temp-dir: allow memverifikasi perilaku pembersihan fs mentahconst workspace = fs.mkdtempSync(prefix);node scripts/report-test-temp-creations.mjs melaporkan pembuatan direktori sementara langsung yang baru dan penggunaan manual helper bersama yang baru dalam baris diff yang ditambahkan, tanpa memblokir gaya pembersihan yang sudah ada. Ini mengikuti klasifikasi path pengujian yang sama dengan scripts/changed-lanes.mjs dan melewati implementasi helper bersama itu sendiri. check:changed menjalankan laporan ini untuk path pengujian yang berubah sebagai sinyal CI khusus peringatan (anotasi peringatan GitHub, bukan kegagalan).
Alur kerja live dan Docker/Parallels
Saat men-debug penyedia/model nyata (memerlukan kredensial nyata):
- Rangkaian live (model + probe alat/gambar Gateway):
pnpm test:live - Targetkan satu file live secara senyap:
pnpm test:live -- src/agents/models.profiles.live.test.ts - Laporan performa runtime: dispatch
OpenClaw Performancedenganlive_openai_candidate=trueuntuk giliran agenopenai/gpt-5.6-lunanyata ataudeep_profile=trueuntuk artefak CPU/heap/trace Kova. Proses terjadwal harian menerbitkan laporan jalur penyedia tiruan, profil mendalam, dan GPT-5.6 Luna keopenclaw/clawgrit-reportsdari job penerbit terpisah yang menggunakan artefak; autentikasi penerbit yang hilang atau tidak valid menyebabkan proses terjadwal danprofile=releasegagal. Dispatch manual non-rilis mempertahankan artefak GitHub dan memperlakukan penerbitan laporan sebagai saran. Laporan penyedia tiruan juga menyertakan angka boot Gateway tingkat sumber, memori, tekanan plugin, loop hello model palsu berulang, dan startup CLI. - Penyisiran model live Docker:
pnpm test:docker:live-models- Setiap model yang dipilih menjalankan satu giliran teks ditambah probe kecil bergaya pembacaan file.
Model yang metadatanya mengiklankan input
imagejuga menjalankan satu giliran gambar kecil. Nonaktifkan probe tambahan denganOPENCLAW_LIVE_MODEL_FILE_PROBE=0atauOPENCLAW_LIVE_MODEL_IMAGE_PROBE=0saat mengisolasi kegagalan penyedia. - Cakupan CI:
OpenClaw Scheduled Live And E2E Checksharian danOpenClaw Release Checksmanual sama-sama memanggil alur kerja live/E2E yang dapat digunakan kembali denganinclude_live_suites: true, yang mencakup job matriks model live Docker yang dibagi menurut penyedia. - Untuk menjalankan ulang CI secara terfokus, dispatch
OpenClaw Live And E2E Checks (Reusable)denganinclude_live_suites: truedanlive_models_only: true. - Tambahkan secret penyedia baru dengan sinyal tinggi ke
scripts/ci-hydrate-live-auth.shserta.github/workflows/openclaw-live-and-e2e-checks-reusable.ymldan pemanggil terjadwal/rilisnya.
- Setiap model yang dipilih menjalankan satu giliran teks ditambah probe kecil bergaya pembacaan file.
Model yang metadatanya mengiklankan input
- Smoke bound-chat Codex native:
pnpm test:docker:live-codex-bind- Menjalankan jalur live Docker terhadap path app-server Codex, mengikat
DM Slack sintetis dengan
/codex bind, menjalankan/codex fastdan/codex permissions, lalu memverifikasi balasan biasa dan lampiran gambar dirutekan melalui binding plugin native, bukan ACP.
- Menjalankan jalur live Docker terhadap path app-server Codex, mengikat
DM Slack sintetis dengan
- Smoke harness app-server Codex:
pnpm test:docker:live-codex-harness- Menjalankan giliran agen Gateway melalui harness app-server Codex
milik plugin, memverifikasi
/codex statusdan/codex models, serta secara default menjalankan probe gambar, cron MCP, subagen, dan Guardian. Nonaktifkan probe subagen denganOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0saat mengisolasi kegagalan lain. Untuk pemeriksaan subagen yang terfokus, nonaktifkan probe lainnya:OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=1 pnpm test:docker:live-codex-harness. Proses ini keluar setelah probe subagen kecualiOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0ditetapkan.
- Menjalankan giliran agen Gateway melalui harness app-server Codex
milik plugin, memverifikasi
- Smoke penginstalan Codex sesuai permintaan:
pnpm test:docker:codex-on-demand- Menginstal tarball OpenClaw yang dikemas di Docker, menjalankan onboarding
dengan kunci API OpenAI, dan memverifikasi plugin Codex beserta dependensi
@openai/codexdiunduh sesuai permintaan ke root proyek npm terkelola.
- Menginstal tarball OpenClaw yang dikemas di Docker, menjalankan onboarding
dengan kunci API OpenAI, dan memverifikasi plugin Codex beserta dependensi
- Smoke paket live plugin npm Codex:
pnpm test:docker:live-codex-npm-plugin- Menginstal paket kandidat OpenClaw dan plugin Codex yang persis ke Docker, lalu menggunakan kunci OpenAI nyata untuk preflight CLI dan giliran dalam sesi yang sama.
- Giliran tindak lanjutnya dengan pemikiran sedang tanpa percobaan ulang harus mengirim progres, terus bekerja melalui pembacaan ruang kerja acak dan penulisan artefak yang persis, lalu mengirim penyelesaian. Giliran terminal yang hanya berisi progres menyebabkan jalur gagal.
- Smoke dependensi alat plugin live:
pnpm test:docker:live-plugin-tool- Mengemas plugin fixture dengan dependensi
slugifynyata, menginstalnya melaluinpm-pack:, memverifikasi dependensi di bawah root proyek npm terkelola, lalu meminta model OpenAI live untuk memanggil alat plugin dan mengembalikan slug tersembunyi.
- Mengemas plugin fixture dengan dependensi
- Smoke perintah penyelamatan OpenClaw:
pnpm test:live:system-agent-rescue-channel- Pemeriksaan berlapis opsional untuk permukaan perintah penyelamatan channel pesan.
Menjalankan
/openclaw status, mengantrekan perubahan model persisten, membalas/openclaw yes, dan memverifikasi path penulisan audit/konfigurasi.
- Pemeriksaan berlapis opsional untuk permukaan perintah penyelamatan channel pesan.
Menjalankan
- Smoke Docker saat pertama kali menjalankan OpenClaw:
pnpm test:docker:system-agent-first-run- Dimulai dari direktori status OpenClaw yang kosong dan terlebih dahulu membuktikan CLI
openclaw setupyang dikemas gagal secara tertutup tanpa inferensi. Kemudian menguji dan mengaktifkan Claude palsu melalui modul aktivasi yang dikemas. Hanya setelah itu permintaan CLI terpaket yang samar mencapai perencana dan ditetapkan menjadi penyiapan bertipe, diikuti operasi model sekali jalan, agen, konfigurasi Discord, dan SecretRef. Proses ini memvalidasi konfigurasi dan entri audit. Ini merupakan bukti pendukung gate/operasi, bukan bukti onboarding interaktif atau agen/alat/persetujuan OpenClaw. Jalur yang sama disediakan di QA Lab olehpnpm openclaw qa suite --scenario system-agent-ring-zero-setup.
- Dimulai dari direktori status OpenClaw yang kosong dan terlebih dahulu membuktikan CLI
- Smoke biaya Moonshot/Kimi: dengan
MOONSHOT_API_KEYditetapkan, jalankanopenclaw models list --provider moonshot --json, lalu jalankanopenclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --jsonyang terisolasi terhadapmoonshot/kimi-k2.6. Verifikasi bahwa JSON melaporkan Moonshot/K2.6 dan transkrip asisten menyimpanusage.costyang dinormalisasi.
Runner khusus QA
Perintah ini tersedia bersama rangkaian pengujian utama saat Anda memerlukan realisme QA-lab.
CI menjalankan QA Lab dalam alur kerja khusus. Paritas agentik disarangkan di bawah
QA-Lab - All Lanes dan validasi rilis, bukan sebagai alur kerja PR mandiri.
Validasi luas harus menggunakan Full Release Validation dengan
rerun_group=qa-parity atau grup QA pemeriksaan rilis. Pemeriksaan rilis stabil/default
mempertahankan soak live/Docker menyeluruh di balik run_release_soak=true; profil
full memaksa soak aktif. QA-Lab - All Lanes berjalan setiap malam pada main dan
dari dispatch manual dengan jalur paritas tiruan, jalur Matrix live,
jalur Telegram live yang dikelola Convex, dan jalur Discord live yang dikelola Convex sebagai
job paralel. QA terjadwal dan pemeriksaan rilis menjalankan profil rilis Matrix
melalui adaptor live bersama. Default CLI Matrix dan input alur kerja manual
tetap all; dispatch all manual menyebar ke profil transportasi, media, dan
E2EE, sedangkan dispatch terfokus dapat memilih fast, release, atau
transport. OpenClaw Release Checks menjalankan paritas ditambah profil adaptor live Matrix
yang dapat digunakan kembali dan jalur Telegram sebelum persetujuan rilis. Pemeriksaan
transportasi rilis menggunakan mock-openai/gpt-5.6-luna agar tetap deterministik dan
menghindari startup plugin penyedia normal. Gateway transportasi live ini
menonaktifkan pencarian memori; perilaku memori tetap dicakup oleh rangkaian paritas QA.
Shard media live rilis lengkap menggunakan
ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04, yang sudah memiliki
ffmpeg dan ffprobe. Shard model/backend live Docker menggunakan image bersama
ghcr.io/openclaw/openclaw-live-test:<sha> yang dibuat sekali untuk setiap commit yang dipilih,
lalu mengambilnya dengan OPENCLAW_SKIP_DOCKER_BUILD=1, alih-alih membuatnya ulang
di dalam setiap shard.
pnpm openclaw qa suite- Menjalankan skenario QA berbasis repo secara langsung pada host.
- Menulis artefak tingkat teratas
qa-evidence.json,qa-suite-summary.json, danqa-suite-report.mduntuk kumpulan skenario yang dipilih, termasuk pilihan skenario alur campuran, Vitest, dan Playwright. - Saat dipicu oleh
pnpm openclaw qa run --qa-profile <profile>, menyematkan kartu skor profil taksonomi yang dipilih dalamqa-evidence.jsonyang sama.smoke-cimenulis bukti ringkas (evidenceMode: "slim", tanpaexecutionper entri).releasemencakup bagian kesiapan rilis yang dikurasi;allmemilih setiap kategori kematangan aktif dan menargetkan pemicuan alur kerja Bukti Profil QA secara eksplisit saat artefak kartu skor lengkap diperlukan. - Menjalankan beberapa skenario terpilih secara paralel secara default dengan worker
Gateway yang terisolasi.
qa-channelsecara default menggunakan konkurensi 4 (dibatasi oleh jumlah skenario yang dipilih). Gunakan--concurrency <count>untuk menyesuaikan jumlah worker, atau--concurrency 1untuk jalur serial lama. - Keluar dengan nilai bukan nol ketika skenario apa pun gagal. Gunakan
--allow-failuresuntuk menghasilkan artefak tanpa kode keluar kegagalan. - Mendukung mode penyedia
live-frontier,mock-openai, danaimock.aimockmemulai server penyedia lokal yang didukung AIMock untuk cakupan eksperimental fixture dan mock protokol tanpa menggantikan jalurmock-openaiyang mempertimbangkan skenario.
pnpm openclaw qa coverage --match <query>- Mencari ID skenario, judul, permukaan, ID cakupan, referensi dokumentasi, referensi kode, plugin, dan persyaratan penyedia, lalu mencetak target suite yang cocok.
- Gunakan ini sebelum menjalankan QA Lab saat Anda mengetahui perilaku atau jalur file yang tersentuh tetapi tidak mengetahui skenario terkecil. Hanya sebagai saran—tetap pilih bukti mock, live, Multipass, Matrix, atau transportasi berdasarkan perilaku yang diubah.
pnpm test:plugins:kitchen-sink-live- Menjalankan rangkaian pengujian Plugin OpenAI Kitchen Sink live melalui QA Lab.
Menginstal paket Kitchen Sink eksternal, memverifikasi inventaris permukaan
SDK plugin, memeriksa
/healthzdan/readyz, merekam bukti CPU/RSS Gateway, menjalankan satu giliran OpenAI live, dan memeriksa diagnostik adversarial. Memerlukan autentikasi OpenAI live sepertiOPENAI_API_KEY. Dalam sesi Testbox yang telah dihidrasi, profil autentikasi live Testbox otomatis dimuat saat pembantuopenclaw-testbox-envtersedia.
- Menjalankan rangkaian pengujian Plugin OpenAI Kitchen Sink live melalui QA Lab.
Menginstal paket Kitchen Sink eksternal, memverifikasi inventaris permukaan
SDK plugin, memeriksa
pnpm test:gateway:cpu-scenarios- Menjalankan tolok ukur startup Gateway beserta paket kecil skenario mock QA Lab
(
channel-chat-baseline,memory-failure-fallback,gateway-restart-inflight-run) dan menulis ringkasan gabungan pengamatan CPU di bawah.artifacts/gateway-cpu-scenarios/. - Secara default hanya menandai pengamatan CPU panas yang berkelanjutan (
--cpu-core-warn, default0.9;--hot-wall-warn-ms, default30000), sehingga lonjakan singkat saat startup dicatat sebagai metrik tanpa tampak seperti regresi penggunaan penuh CPU Gateway yang berlangsung selama beberapa menit. - Berjalan terhadap artefak
disthasil build; jalankan build terlebih dahulu saat checkout belum memiliki keluaran runtime terbaru.
- Menjalankan tolok ukur startup Gateway beserta paket kecil skenario mock QA Lab
(
pnpm openclaw qa suite --runner multipass- Menjalankan suite QA yang sama di dalam VM Linux Multipass sekali pakai, dengan tetap
menggunakan flag pemilihan skenario dan penyedia/model yang sama seperti
qa suite. - Proses live meneruskan input autentikasi QA yang praktis untuk guest:
kunci penyedia berbasis env, jalur konfigurasi penyedia live QA, dan
CODEX_HOMEjika tersedia. - Direktori keluaran harus tetap berada di bawah root repo agar guest dapat menulis kembali melalui ruang kerja yang dipasang.
- Menulis laporan + ringkasan QA normal beserta log Multipass di bawah
.artifacts/qa-e2e/....
- Menjalankan suite QA yang sama di dalam VM Linux Multipass sekali pakai, dengan tetap
menggunakan flag pemilihan skenario dan penyedia/model yang sama seperti
pnpm qa:lab:up- Memulai situs QA berbasis Docker untuk pekerjaan QA bergaya operator.
pnpm test:docker:npm-onboard-channel-agent- Membuat tarball npm dari checkout saat ini, menginstalnya secara global di Docker, menjalankan onboarding kunci API OpenAI noninteraktif, mengonfigurasi Telegram secara default, memverifikasi runtime Plugin terpaket dimuat tanpa perbaikan dependensi startup, menjalankan doctor, dan menjalankan satu giliran agen lokal terhadap endpoint OpenAI yang di-mock.
- Gunakan
OPENCLAW_NPM_ONBOARD_CHANNEL=discorduntuk menjalankan jalur instalasi terpaket yang sama dengan Discord.
pnpm test:docker:session-runtime-context- Menjalankan smoke Docker aplikasi hasil build yang deterministik untuk transkrip konteks runtime
tertanam. Memverifikasi bahwa konteks runtime OpenClaw tersembunyi dipertahankan sebagai
pesan khusus yang tidak ditampilkan alih-alih bocor ke giliran pengguna yang
terlihat, lalu mengisi JSONL sesi rusak yang terdampak dan memverifikasi
openclaw doctor --fixmenulis ulang sesi tersebut ke cabang aktif dengan cadangan.
- Menjalankan smoke Docker aplikasi hasil build yang deterministik untuk transkrip konteks runtime
tertanam. Memverifikasi bahwa konteks runtime OpenClaw tersembunyi dipertahankan sebagai
pesan khusus yang tidak ditampilkan alih-alih bocor ke giliran pengguna yang
terlihat, lalu mengisi JSONL sesi rusak yang terdampak dan memverifikasi
pnpm test:docker:npm-telegram-live- Menginstal kandidat paket OpenClaw di Docker, menjalankan onboarding paket yang telah diinstal, mengonfigurasi Telegram melalui CLI terinstal, lalu menggunakan kembali jalur QA Telegram live dengan paket terinstal tersebut sebagai Gateway SUT.
- Wrapper hanya memasang sumber harness
qa-labdari checkout; paket terinstal memilikidist,openclaw/plugin-sdk, dan runtime Plugin bawaan, sehingga jalur ini tidak mencampurkan Plugin checkout saat ini ke dalam paket yang diuji. - Secara default menggunakan
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta; tetapkanOPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgzatauOPENCLAW_CURRENT_PACKAGE_TGZuntuk menguji tarball lokal yang telah diresolusi alih-alih menginstal dari registry. - Secara default memancarkan pengukuran waktu RTT berulang dalam
qa-evidence.jsondenganOPENCLAW_NPM_TELEGRAM_RTT_SAMPLES=20. TimpaOPENCLAW_NPM_TELEGRAM_RTT_SAMPLES,OPENCLAW_NPM_TELEGRAM_RTT_TIMEOUT_MS, atauOPENCLAW_NPM_TELEGRAM_RTT_MAX_FAILURESuntuk menyesuaikan proses.OPENCLAW_NPM_TELEGRAM_RTT_CHECKSmemilih skenario QA Telegram yang akan disampel; target RTT yang didukung adalahchannel-canary. - Menggunakan kredensial env Telegram atau sumber kredensial Convex yang sama seperti
pnpm openclaw qa telegram. Untuk otomatisasi CI/rilis, tetapkanOPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convexbesertaOPENCLAW_QA_CONVEX_SITE_URLdan secret peran. JikaOPENCLAW_QA_CONVEX_SITE_URLdan secret peran Convex tersedia di CI, wrapper Docker memilih Convex secara otomatis. - Wrapper memvalidasi env kredensial Telegram atau Convex pada host
sebelum pekerjaan build/instalasi Docker. Tetapkan
OPENCLAW_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1hanya saat secara sengaja men-debug penyiapan prakredensial. OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainermenimpaOPENCLAW_QA_CREDENTIAL_ROLEbersama hanya untuk jalur ini. Saat kredensial Convex dipilih dan tidak ada peran yang ditetapkan, wrapper menggunakancidi CI danmaintainerdi luar CI.- GitHub Actions menyediakan jalur ini sebagai alur kerja maintainer manual
NPM Telegram Beta E2E. Jalur ini tidak berjalan saat penggabungan. Alur kerja menggunakan environmentqa-live-shareddan lease kredensial CI Convex.
- GitHub Actions juga menyediakan
Package Acceptanceuntuk bukti produk proses sampingan terhadap satu paket kandidat. Alur ini menerima referensi Git, spesifikasi npm yang dipublikasikan, URL tarball HTTPS beserta SHA-256, kebijakan URL tepercaya, atau artefak tarball dari proses lain (source=ref|npm|url|trusted-url|artifact), mengunggahopenclaw-current.tgzyang dinormalisasi sebagaipackage-under-test, lalu menjalankan penjadwal E2E Docker yang ada dengan profil jalursmoke,package,product,full, ataucustom. Tetapkantelegram_mode=mock-openaiataulive-frontieruntuk menjalankan alur kerja QA Telegram terhadap artefakpackage-under-testyang sama.- Bukti produk beta terbaru:
gh workflow run package-acceptance.yml --ref main \ -f source=npm \ -f package_spec=openclaw@beta \ -f suite_profile=product \ -f telegram_mode=mock-openai- Bukti URL tarball yang persis memerlukan digest dan menggunakan kebijakan keamanan URL publik:
gh workflow run package-acceptance.yml --ref main \ -f source=url \ -f package_url=https://registry.npmjs.org/openclaw/-/openclaw-VERSION.tgz \ -f package_sha256=<sha256> \ -f suite_profile=package- Mirror tarball enterprise/privat menggunakan kebijakan sumber tepercaya yang eksplisit:
gh workflow run package-acceptance.yml --ref main \ -f source=trusted-url \ -f trusted_source_id=enterprise-artifactory \ -f package_url=https://packages.example.internal:8443/artifactory/openclaw/openclaw-VERSION.tgz \ -f package_sha256=<sha256> \ -f suite_profile=packagesource=trusted-url membaca .github/package-trusted-sources.json dari referensi alur kerja tepercaya dan tidak menerima kredensial URL atau bypass jaringan privat melalui input alur kerja. Jika kebijakan bernama tersebut mendeklarasikan autentikasi bearer, konfigurasikan secret tetap OPENCLAW_TRUSTED_PACKAGE_TOKEN.
- Bukti artefak mengunduh artefak tarball dari proses Actions lain:
gh workflow run package-acceptance.yml --ref main \ -f source=artifact \ -f artifact_run_id=<run-id> \ -f artifact_name=<artifact-name> \ -f suite_profile=smoke-
pnpm test:docker:plugins- Mengemas dan menginstal build OpenClaw saat ini di Docker, memulai Gateway dengan OpenAI yang dikonfigurasi, lalu mengaktifkan channel/Plugin bawaan melalui pengeditan konfigurasi.
- Memverifikasi bahwa penemuan penyiapan membiarkan Plugin yang dapat diunduh tetapi belum dikonfigurasi tetap tidak ada, perbaikan doctor terkonfigurasi pertama menginstal setiap Plugin unduhan yang hilang secara eksplisit, dan restart kedua tidak menjalankan perbaikan dependensi tersembunyi.
- Juga menginstal baseline npm lama yang diketahui, mengaktifkan Telegram sebelum
menjalankan
openclaw update --tag <candidate>, dan memverifikasi bahwa doctor pascapembaruan kandidat membersihkan sisa dependensi Plugin lama tanpa perbaikan postinstall dari sisi harness.
-
pnpm test:parallels:npm-update-
Menjalankan smoke pembaruan instalasi paket native di seluruh guest Parallels. Setiap platform yang dipilih terlebih dahulu menginstal paket baseline yang diminta, kemudian menjalankan perintah
openclaw updateyang telah diinstal di guest yang sama dan memverifikasi versi yang terinstal, status pembaruan, kesiapan Gateway, serta satu giliran agen lokal. -
Gunakan
--platform macos,--platform windows, atau--platform linuxsaat melakukan iterasi pada satu guest. Gunakan--jsonuntuk jalur artefak ringkasan dan status per jalur. -
Jalur OpenAI secara default menggunakan
openai/gpt-5.6-lunauntuk bukti giliran agen live. Teruskan--model <provider/model>atau tetapkanOPENCLAW_PARALLELS_OPENAI_MODELuntuk memvalidasi model OpenAI lain. -
Bungkus proses lokal yang panjang dengan batas waktu host agar macetnya transportasi Parallels tidak menghabiskan sisa jendela pengujian:
bash timeout --foreground 150m pnpm test:parallels:npm-update -- --jsontimeout --foreground 90m pnpm test:parallels:npm-update -- --platform windows --json -
Skrip menulis log jalur bertingkat di bawah
/tmp/openclaw-parallels-npm-update.*. Periksawindows-update.log,macos-update.log, ataulinux-update.logsebelum menganggap wrapper luar macet. -
Pembaruan Windows dapat menghabiskan 10 hingga 15 menit untuk pekerjaan doctor pascapembaruan dan pembaruan paket pada guest dingin; kondisi tersebut masih sehat selama log debug npm bertingkat terus bertambah.
-
Jangan jalankan wrapper agregat ini secara paralel dengan masing-masing jalur smoke Parallels macOS, Windows, atau Linux. Jalur-jalur tersebut berbagi status VM dan dapat bertabrakan saat pemulihan snapshot, penyajian paket, atau status Gateway guest.
-
Bukti pascapembaruan menjalankan permukaan Plugin bawaan normal karena facade kapabilitas seperti ucapan, pembuatan gambar, dan pemahaman media dimuat melalui API runtime bawaan meskipun giliran agen itu sendiri hanya memeriksa respons teks sederhana.
-
-
pnpm openclaw qa aimock- Hanya memulai server penyedia AIMock lokal untuk pengujian smoke protokol langsung.
-
pnpm openclaw qa matrix- Menjalankan jalur QA live Matrix terhadap homeserver Tuwunel sekali pakai
yang didukung Docker. Hanya untuk checkout sumber - instalasi terpaket tidak menyertakan
qa-lab. - CLI lengkap, katalog profil/skenario, variabel lingkungan, dan tata letak artefak: Jalur smoke Matrix.
- Menjalankan jalur QA live Matrix terhadap homeserver Tuwunel sekali pakai
yang didukung Docker. Hanya untuk checkout sumber - instalasi terpaket tidak menyertakan
-
pnpm openclaw qa telegram- Menjalankan jalur QA live Telegram terhadap grup privat nyata menggunakan token bot driver dan SUT dari lingkungan.
- Memerlukan
OPENCLAW_QA_TELEGRAM_GROUP_ID,OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN, danOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN. ID grup harus berupa ID chat Telegram numerik. - Mendukung
--credential-source convexuntuk kredensial kumpulan bersama. Gunakan mode lingkungan secara default, atau aturOPENCLAW_QA_CREDENTIAL_SOURCE=convexuntuk memilih menggunakan penyewaan kumpulan. - Pengaturan default mencakup canary, pembatasan penyebutan, pengalamatan perintah,
/status, balasan antarbot yang disebutkan, dan balasan perintah native inti. Pengaturan defaultmock-openaijuga mencakup regresi rantai balasan deterministik dan streaming pesan akhir Telegram. Gunakan--list-scenariosuntuk probe opsional sepertisession_status. - Keluar dengan nilai bukan nol saat ada skenario yang gagal. Gunakan
--allow-failuresuntuk menghasilkan artefak tanpa kode keluar kegagalan. - Memerlukan dua bot berbeda dalam grup privat yang sama, dengan bot SUT mengekspos nama pengguna Telegram.
- Untuk pengamatan antarbot yang stabil, aktifkan Bot-to-Bot Communication Mode
di
@BotFatheruntuk kedua bot dan pastikan bot driver dapat mengamati lalu lintas bot grup. - Menulis laporan QA Telegram, ringkasan, dan
qa-evidence.jsondi bawah.artifacts/qa-e2e/.... Skenario balasan mencakup RTT dari permintaan pengiriman driver hingga balasan SUT yang diamati.
Mantis Telegram Live adalah pembungkus bukti PR untuk jalur ini. Pembungkus ini menjalankan
ref kandidat dengan kredensial Telegram yang disewa melalui Convex, merender
bundel laporan/bukti QA yang disunting di browser desktop Crabbox, merekam bukti
MP4, menghasilkan GIF yang dipangkas berdasarkan gerakan, mengunggah bundel artefak, dan
memposting bukti PR sebaris melalui Mantis GitHub App saat pr_number
ditetapkan. Pengelola dapat memulainya dari UI Actions melalui Mantis Scenario
(scenario_id: telegram-live) atau langsung dari komentar pull request:
@openclaw-mantis telegram@openclaw-mantis telegram scenario=telegram-status-command@openclaw-mantis telegram scenarios=telegram-status-command,channel-canaryMantis Telegram Desktop Proof adalah pembungkus sebelum/sesudah Telegram Desktop
native yang bersifat agentik untuk bukti visual PR. Mulai dari UI Actions dengan
instructions bebas, melalui Mantis Scenario (scenario_id: telegram-desktop-proof), atau dari komentar PR:
@openclaw-mantis telegram desktop proofAgen Mantis membaca PR, menentukan perilaku yang terlihat di Telegram untuk membuktikan
perubahan, menjalankan jalur bukti Telegram Desktop Crabbox pengguna nyata pada
ref dasar dan kandidat, mengulang hingga GIF native berguna,
menulis manifes motionPreview berpasangan, dan memposting tabel GIF
2 kolom yang sama melalui Mantis GitHub App saat pr_number ditetapkan.
pnpm openclaw qa mantis telegram-desktop-builder- Menyewa atau menggunakan kembali desktop Linux Crabbox, menginstal Telegram Desktop native, mengonfigurasi OpenClaw dengan token bot SUT Telegram yang disewa, memulai Gateway, dan merekam bukti tangkapan layar/MP4 dari desktop VNC yang terlihat.
- Secara default menggunakan
--credential-source convexsehingga alur kerja hanya memerlukan rahasia broker Convex. Gunakan--credential-source envdengan variabelOPENCLAW_QA_TELEGRAM_*yang sama sepertipnpm openclaw qa telegram. - Telegram Desktop tetap memerlukan login/profil pengguna. Token bot
hanya mengonfigurasi OpenClaw. Gunakan
--telegram-profile-archive-env <name>untuk arsip profil.tgzbase64, atau gunakan--keep-leasedan lakukan login secara manual melalui VNC satu kali. - Menulis
mantis-telegram-desktop-builder-report.md,mantis-telegram-desktop-builder-summary.json,telegram-desktop-builder.png, dantelegram-desktop-builder.mp4di bawah direktori keluaran.
Jalur transport live berbagi satu kontrak standar agar transport baru tidak
menyimpang; matriks cakupan per jalur tersedia di
Ikhtisar QA - Cakupan transport live.
qa-channel adalah rangkaian sintetis luas dan bukan bagian dari matriks tersebut.
Kredensial Telegram bersama melalui Convex (v1)
Saat --credential-source convex (atau OPENCLAW_QA_CREDENTIAL_SOURCE=convex)
diaktifkan untuk QA transport live, lab QA memperoleh penyewaan eksklusif dari
kumpulan yang didukung Convex, mengirim Heartbeat untuk penyewaan tersebut selama jalur berjalan, dan
melepaskan penyewaan saat dimatikan. Nama bagian ini sudah ada sebelum dukungan Discord, Slack, dan
WhatsApp; kontrak penyewaan digunakan bersama lintas jenis.
Perancah proyek Convex referensi: qa/convex-credential-broker/
Variabel lingkungan wajib:
OPENCLAW_QA_CONVEX_SITE_URL(misalnyahttps://your-deployment.convex.site)- Satu rahasia untuk peran yang dipilih:
OPENCLAW_QA_CONVEX_SECRET_MAINTAINERuntukmaintainerOPENCLAW_QA_CONVEX_SECRET_CIuntukci
- Pemilihan peran kredensial:
- CLI:
--credential-role maintainer|ci - Default lingkungan:
OPENCLAW_QA_CREDENTIAL_ROLE(secara defaultcidi CI,maintainerjika tidak)
- CLI:
Variabel lingkungan opsional:
OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS(default1200000)OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS(default30000)OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS(default90000)OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS(default15000)OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX(default/qa-credentials/v1)OPENCLAW_QA_CREDENTIAL_OWNER_ID(ID pelacakan opsional)OPENCLAW_QA_ALLOW_INSECURE_HTTP=1mengizinkan URL Convexhttp://loopback untuk pengembangan khusus lokal.
OPENCLAW_QA_CONVEX_SITE_URL seharusnya menggunakan https:// dalam operasi normal.
Perintah admin pengelola (tambah/hapus/daftar kumpulan) secara khusus memerlukan
OPENCLAW_QA_CONVEX_SECRET_MAINTAINER.
Pembantu CLI untuk pengelola:
pnpm openclaw qa credentials doctorpnpm openclaw qa credentials add --kind telegram --payload-file qa/telegram-credential.jsonpnpm openclaw qa credentials list --kind telegrampnpm openclaw qa credentials remove --credential-id <credential-id>Gunakan doctor sebelum proses live untuk memeriksa URL situs Convex, rahasia broker,
prefiks endpoint, batas waktu HTTP, dan keterjangkauan admin/daftar tanpa mencetak
nilai rahasia. Gunakan --json untuk keluaran yang dapat dibaca mesin dalam skrip dan utilitas
CI.
Kontrak endpoint default (OPENCLAW_QA_CONVEX_SITE_URL + /qa-credentials/v1).
Permintaan diautentikasi dengan header Authorization: Bearer <role secret>;
isi di bawah menghilangkan header tersebut:
POST /acquire- Permintaan:
{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs } - Berhasil:
{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? } - Habis/dapat dicoba ulang:
{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }
- Permintaan:
POST /payload-chunk- Permintaan:
{ kind, ownerId, actorRole, credentialId, leaseToken, index } - Berhasil:
{ status: "ok", index, data }
- Permintaan:
POST /heartbeat- Permintaan:
{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs } - Berhasil:
{ status: "ok" }(atau2xxkosong)
- Permintaan:
POST /release- Permintaan:
{ kind, ownerId, actorRole, credentialId, leaseToken } - Berhasil:
{ status: "ok" }(atau2xxkosong)
- Permintaan:
POST /admin/add(khusus rahasia pengelola)- Permintaan:
{ kind, actorId, payload, note?, status? } - Berhasil:
{ status: "ok", credential }
- Permintaan:
POST /admin/remove(khusus rahasia pengelola)- Permintaan:
{ credentialId, actorId } - Berhasil:
{ status: "ok", changed, credential } - Pelindung penyewaan aktif:
{ status: "error", code: "LEASE_ACTIVE", ... }
- Permintaan:
POST /admin/list(khusus rahasia pengelola)- Permintaan:
{ kind?, status?, includePayload?, limit? } - Berhasil:
{ status: "ok", credentials, count }
- Permintaan:
Bentuk payload untuk jenis Telegram:
{ groupId: string, driverToken: string, sutToken: string }groupIdharus berupa string ID chat Telegram numerik.admin/addmemvalidasi bentuk ini untukkind: "telegram"dan menolak payload yang salah format.
Bentuk payload untuk jenis pengguna nyata Telegram:
{ groupId: string, sutToken: string, testerUserId: string, testerUsername: string, telegramApiId: string, telegramApiHash: string, tdlibDatabaseEncryptionKey: string, tdlibArchiveBase64: string, tdlibArchiveSha256: string, desktopTdataArchiveBase64: string, desktopTdataArchiveSha256: string }groupId,testerUserId, dantelegramApiIdharus berupa string numerik.tdlibArchiveSha256dandesktopTdataArchiveSha256harus berupa string heksadesimal SHA-256.kind: "telegram-user"dicadangkan untuk alur kerja bukti Telegram Desktop Mantis. Jalur QA Lab generik tidak boleh memperolehnya.
Payload multisaluran yang divalidasi broker:
- Discord:
{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string, voiceChannelId?: string } - WhatsApp:
{ driverPhoneE164: string, sutPhoneE164: string, driverAuthArchiveBase64: string, sutAuthArchiveBase64: string, groupJid?: string }
Jalur Slack juga dapat menyewa dari kumpulan, tetapi validasi payload Slack
saat ini berada di runner QA Slack, bukan di broker. Gunakan
{ channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string }
untuk baris Slack.
Menambahkan saluran ke QA
Arsitektur dan nama pembantu skenario untuk adaptor saluran baru tersedia di
Ikhtisar QA - Menambahkan saluran.
Batas minimum: implementasikan runner transport pada seam host qa-lab bersama,
tambahkan adapterFactory untuk skenario bersama, deklarasikan qaRunners dalam
manifes plugin, pasang sebagai openclaw qa <runner>, dan tulis skenario di bawah
qa/scenarios/.
Rangkaian pengujian (apa yang berjalan di mana)
Anggap rangkaian ini sebagai "realisme yang meningkat" (serta ketidakstabilan/biaya yang meningkat).
Unit / integrasi (default)
- Perintah:
pnpm test - Konfigurasi: proses tanpa target menggunakan kumpulan shard
vitest.full-*.config.tsdan dapat memperluas shard multiproyek menjadi konfigurasi per proyek untuk penjadwalan paralel - Berkas: inventaris inti/unit di bawah
src/**/*.test.ts,packages/**/*.test.ts, dantest/**/*.test.ts; pengujian unit UI berjalan di shard khususunit-ui - Cakupan:
- Pengujian unit murni
- Pengujian integrasi dalam proses (autentikasi Gateway, perutean, peralatan, penguraian, konfigurasi)
- Regresi deterministik untuk bug yang diketahui
- Ekspektasi:
- Berjalan di CI
- Tidak memerlukan kunci nyata
- Harus cepat dan stabil
- Pengujian resolver dan pemuat permukaan publik harus membuktikan perilaku fallback
api.jsdanruntime-api.jsyang luas dengan fixture plugin kecil yang dihasilkan, bukan API sumber plugin bawaan nyata. Pemuatan API plugin nyata termasuk dalam rangkaian kontrak/integrasi milik plugin.
Kebijakan dependensi native:
- Instalasi pengujian default melewati build opus Discord native opsional. Suara
Discord menggunakan
libopus-wasmbawaan, dan@discordjs/opustetap dinonaktifkan diallowBuildsagar pengujian lokal dan jalur Testbox tidak mengompilasi addon native. - Bandingkan performa opus native di repo benchmark
libopus-wasm, bukan dalam loop instalasi/pengujian OpenClaw default. Jangan atur@discordjs/opusmenjaditruedalamallowBuildsdefault; hal itu membuat loop instalasi/pengujian yang tidak terkait mengompilasi kode native.
Proyek, shard, dan jalur bercakupan
- Proses
pnpm testtanpa target menjalankan tiga belas konfigurasi shard yang lebih kecil (core-unit-fast,core-unit-src,core-unit-security,core-unit-ui,core-unit-support,core-support-boundary,core-tooling,core-contracts,core-bundled,core-runtime,agentic,auto-reply,extensions), bukan satu proses native proyek root yang sangat besar. Ini mengurangi RSS puncak pada mesin dengan beban tinggi dan mencegah pekerjaan balasan otomatis/plugin membuat rangkaian pengujian yang tidak terkait kekurangan sumber daya. pnpm test --watchtetap menggunakan graf proyekvitest.config.tsnative root karena perulangan pemantauan multi-shard tidak praktis.pnpm test,pnpm test:watch, danpnpm test:perf:importsterlebih dahulu merutekan target file/direktori eksplisit melalui jalur terbatas, sehinggapnpm test extensions/discord/src/monitor/message-handler.preflight.test.tstidak perlu menanggung seluruh biaya awal proyek root.pnpm test:changedsecara default memperluas path Git yang berubah menjadi jalur terbatas berbiaya rendah: pengeditan pengujian langsung, file*.test.tssaudara, pemetaan sumber eksplisit, dan dependensi lokal dalam graf impor. Pengeditan konfigurasi/penyiapan/paket tidak menjalankan pengujian secara luas, kecuali Anda secara eksplisit menggunakanOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed.pnpm check:changedadalah gerbang pemeriksaan lokal cerdas yang lazim untuk pekerjaan berskala sempit. Gerbang ini mengklasifikasikan diff menjadi inti, pengujian inti, ekstensi, pengujian ekstensi, aplikasi, dokumentasi, metadata rilis, peralatan Docker live, dan peralatan lainnya, lalu menjalankan perintah pemeriksaan tipe, lint, dan guard yang sesuai. Gerbang ini tidak menjalankan pengujian Vitest; panggilpnpm test:changedataupnpm test <target>secara eksplisit sebagai bukti pengujian. Peningkatan versi yang hanya menyentuh metadata rilis menjalankan pemeriksaan versi/konfigurasi/dependensi root yang ditargetkan, dengan guard yang menolak perubahan paket di luar bidang versi tingkat atas.- Pengeditan harness ACP Docker live menjalankan pemeriksaan terfokus: sintaksis shell untuk skrip autentikasi Docker live dan uji coba kering penjadwal Docker live. Perubahan
package.jsonhanya disertakan ketika diff terbatas padascripts["test:docker:live-*"]; pengeditan dependensi, ekspor, versi, dan permukaan paket lainnya tetap menggunakan guard yang lebih luas. - Pengujian unit dengan impor ringan dari agen, perintah, plugin, pembantu balasan otomatis,
plugin-sdk, dan area utilitas murni serupa dirutekan melalui jalurunit-fast, yang melewatitest/setup-openclaw-runtime.ts; file yang sarat status/runtime tetap menggunakan jalur yang ada. - File sumber pembantu
plugin-sdkdancommandstertentu juga memetakan eksekusi mode perubahan ke pengujian saudara eksplisit dalam jalur ringan tersebut, sehingga pengeditan pembantu tidak menjalankan ulang seluruh rangkaian berat untuk direktori itu. auto-replymemiliki kelompok khusus untuk pembantu inti tingkat atas, pengujian integrasireply.*tingkat atas, dan subtreesrc/auto-reply/reply/**. CI selanjutnya membagi subtree balasan menjadi shard pelaksana agen, dispatch, serta perintah/perutean status agar satu kelompok yang sarat impor tidak menguasai seluruh ekor proses Node.- CI PR/main normal sengaja melewati penyisiran batch plugin bawaan dan shard
agentic-pluginskhusus rilis. Validasi Rilis Lengkap menjalankan workflow turunanPlugin Prereleaseterpisah untuk rangkaian yang sarat plugin tersebut pada kandidat rilis.
Cakupan pelaksana tertanam
- Saat mengubah input penemuan alat pesan atau konteks runtime Compaction, pertahankan kedua tingkat cakupan.
- Tambahkan regresi pembantu terfokus untuk batas perutean dan normalisasi murni.
- Pastikan rangkaian integrasi pelaksana tertanam tetap sehat:
src/agents/embedded-agent-runner/compact.hooks.test.ts,src/agents/embedded-agent-runner/run.overflow-compaction.test.ts, dansrc/agents/embedded-agent-runner/run.overflow-compaction.loop.test.ts. - Rangkaian tersebut memverifikasi bahwa ID terbatas dan perilaku Compaction tetap mengalir
melalui path
run.ts/compact.tsyang sebenarnya; pengujian khusus pembantu bukan pengganti yang memadai untuk path integrasi tersebut.
Default pool dan isolasi Vitest
- Konfigurasi dasar Vitest menggunakan
threadssecara default. - Konfigurasi Vitest bersama menetapkan
isolate: falsedan menggunakan pelaksana nonterisolasi di seluruh proyek root serta konfigurasi e2e dan live. - Jalur UI root mempertahankan penyiapan dan pengoptimal
jsdom, tetapi juga berjalan pada pelaksana nonterisolasi bersama. - Setiap shard
pnpm testmewarisi defaultthreads+isolate: falseyang sama dari konfigurasi Vitest bersama. scripts/run-vitest.mjsmenambahkan--no-maglevuntuk proses Node turunan Vitest secara default guna mengurangi pekerjaan kompilasi V8 berulang selama eksekusi lokal besar. TetapkanOPENCLAW_VITEST_ENABLE_MAGLEV=1untuk membandingkannya dengan perilaku V8 standar.scripts/run-vitest.mjsmenghentikan eksekusi Vitest non-pemantauan eksplisit setelah 5 menit tanpa keluaran stdout atau stderr. TetapkanOPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=0untuk menonaktifkan pengawas bagi investigasi yang sengaja tidak menghasilkan keluaran.
Iterasi lokal cepat
pnpm changed:lanesmenunjukkan jalur arsitektural yang dipicu oleh sebuah diff.- Hook pra-commit hanya melakukan pemformatan. Hook ini memasukkan kembali file yang telah diformat ke staging dan tidak menjalankan lint, pemeriksaan tipe, atau pengujian.
- Jalankan
pnpm check:changedsecara eksplisit sebelum serah terima atau push ketika Anda memerlukan gerbang pemeriksaan lokal cerdas. pnpm test:changedsecara default merutekan melalui jalur terbatas berbiaya rendah. GunakanOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changedhanya ketika agen memutuskan bahwa pengeditan harness, konfigurasi, paket, atau kontrak benar-benar memerlukan cakupan Vitest yang lebih luas.pnpm test:maxdanpnpm test:changed:maxmempertahankan perilaku perutean yang sama, hanya dengan batas pekerja yang lebih tinggi.- Penskalaan otomatis pekerja lokal sengaja dibuat konservatif dan dikurangi ketika rata-rata beban host sudah tinggi, sehingga beberapa eksekusi Vitest serentak secara default menimbulkan dampak yang lebih kecil.
- Konfigurasi dasar Vitest menandai file proyek/konfigurasi sebagai
forceRerunTriggersagar eksekusi ulang mode perubahan tetap tepat ketika pengkabelan pengujian berubah. - Konfigurasi mempertahankan
OPENCLAW_VITEST_FS_MODULE_CACHEagar tetap aktif pada host yang didukung; tetapkanOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/pathuntuk satu lokasi cache eksplisit bagi pembuatan profil langsung.
Debug performa
pnpm test:perf:importsmengaktifkan pelaporan durasi impor Vitest beserta keluaran perincian impor.pnpm test:perf:imports:changedmembatasi tampilan pembuatan profil yang sama pada file yang berubah sejakorigin/main.- Data waktu shard ditulis ke
.artifacts/vitest-shard-timings.json. Eksekusi seluruh konfigurasi menggunakan path konfigurasi sebagai kunci; shard CI dengan pola penyertaan menambahkan nama shard agar shard yang difilter dapat dilacak secara terpisah. - Ketika satu pengujian berat masih menghabiskan sebagian besar waktunya pada impor awal,
pertahankan dependensi berat di balik batas lokal
*.runtime.tsyang sempit dan tirukan batas tersebut secara langsung, alih-alih melakukan deep import pembantu runtime hanya untuk meneruskannya melaluivi.mock(...). pnpm test:perf:changed:bench -- --ref <git-ref>membandingkantest:changedyang dirutekan dengan path proyek root native untuk diff yang telah di-commit tersebut dan menampilkan waktu nyata beserta RSS maksimum macOS.pnpm test:perf:changed:bench -- --worktreemelakukan benchmark pada working tree kotor saat ini dengan merutekan daftar file yang berubah melaluiscripts/test-projects.mjsdan konfigurasi root Vitest.pnpm test:perf:profile:mainmenulis profil CPU thread utama untuk overhead startup dan transformasi Vitest/Vite.pnpm test:perf:profile:runnermenulis profil CPU+heap pelaksana untuk rangkaian unit dengan paralelisme file dinonaktifkan.
Stabilitas (gateway)
- Perintah:
pnpm test:stability:gateway - Konfigurasi:
test/vitest/vitest.gateway.config.ts,test/vitest/vitest.logging.config.ts, dantest/vitest/vitest.infra.config.ts, masing-masing dipaksa menggunakan satu pekerja - Cakupan:
- Memulai Gateway loopback nyata dengan diagnostik yang diaktifkan secara default
- Menggerakkan perputaran pesan gateway, memori, dan muatan besar sintetis melalui path peristiwa diagnostik
- Mengueri
diagnostics.stabilitymelalui RPC WS Gateway - Mencakup pembantu persistensi bundel stabilitas diagnostik
- Memastikan perekam tetap terbatas, sampel RSS sintetis tetap di bawah anggaran tekanan, dan kedalaman antrean per sesi kembali terkuras hingga nol
- Ekspektasi:
- Aman untuk CI dan tanpa kunci
- Jalur sempit untuk tindak lanjut regresi stabilitas, bukan pengganti rangkaian Gateway lengkap
E2E (agregat repo)
- Perintah:
pnpm test:e2e - Cakupan:
- Menjalankan jalur E2E smoke Gateway
- Menjalankan jalur E2E browser Control UI dengan mock
- Ekspektasi:
- Aman untuk CI dan tanpa kunci
- Memerlukan Playwright Chromium terinstal
E2E (smoke Gateway)
- Perintah:
pnpm test:e2e:gateway - Konfigurasi:
test/vitest/vitest.e2e.config.ts - File:
src/**/*.e2e.test.ts,test/**/*.e2e.test.ts, dan pengujian E2E plugin bawaan di bawahextensions/ - Default runtime:
- Menggunakan
threadsVitest denganisolate: false, selaras dengan bagian repo lainnya. - Menggunakan pekerja adaptif (CI: hingga 2, lokal: 1 secara default).
- Berjalan dalam mode senyap secara default untuk mengurangi overhead I/O konsol.
- Menggunakan
- Pengesampingan yang berguna:
OPENCLAW_E2E_WORKERS=<n>untuk memaksa jumlah pekerja (dibatasi hingga 16).OPENCLAW_E2E_VERBOSE=1untuk mengaktifkan kembali keluaran konsol mendetail.
- Cakupan:
- Perilaku end-to-end Gateway multi-instans
- Permukaan WebSocket/HTTP, pemasangan Node, dan jaringan yang lebih berat
- Ekspektasi:
- Berjalan di CI (ketika diaktifkan dalam pipeline)
- Tidak memerlukan kunci nyata
- Memiliki lebih banyak komponen bergerak daripada pengujian unit (dapat berjalan lebih lambat)
E2E (browser Control UI dengan mock)
- Perintah:
pnpm test:ui:e2e - Konfigurasi:
test/vitest/vitest.ui-e2e.config.ts - File:
ui/src/**/*.e2e.test.ts - Cakupan:
- Memulai Control UI Vite
- Mengendalikan halaman Chromium nyata melalui Playwright
- Mengganti WebSocket Gateway dengan mock deterministik dalam browser
- Ekspektasi:
- Berjalan di CI sebagai bagian dari
pnpm test:e2e - Tidak memerlukan Gateway, agen, atau kunci penyedia nyata
- Dependensi browser harus tersedia (
pnpm --dir ui exec playwright install chromium)
- Berjalan di CI sebagai bagian dari
E2E: smoke backend OpenShell
- Perintah:
pnpm test:e2e:openshell - File:
extensions/openshell/src/backend.e2e.test.ts - Cakupan:
- Menggunakan kembali gateway OpenShell lokal yang aktif
- Membuat sandbox dari Dockerfile lokal sementara
- Menguji backend OpenShell OpenClaw melalui
sandbox ssh-confignyata + eksekusi SSH - Memverifikasi perilaku sistem file kanonis-jarak-jauh melalui bridge fs sandbox
- Ekspektasi:
- Hanya berdasarkan pilihan; bukan bagian dari eksekusi default
pnpm test:e2e - Memerlukan CLI
openshelllokal serta daemon Docker yang berfungsi - Memerlukan gateway OpenShell lokal yang aktif beserta sumber konfigurasinya
- Menggunakan
HOME/XDG_CONFIG_HOMEyang terisolasi, lalu menghancurkan sandbox pengujian
- Hanya berdasarkan pilihan; bukan bagian dari eksekusi default
- Pengesampingan yang berguna:
OPENCLAW_E2E_OPENSHELL=1untuk mengaktifkan pengujian ketika menjalankan rangkaian e2e yang lebih luas secara manualOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshelluntuk menunjuk ke biner CLI atau skrip pembungkus non-defaultOPENCLAW_E2E_OPENSHELL_CONFIG_HOME=/path/to/configuntuk mengekspos konfigurasi gateway terdaftar ke pengujian terisolasiOPENCLAW_E2E_OPENSHELL_HOST_IP=172.18.0.1untuk mengganti IP gateway Docker yang digunakan oleh fixture kebijakan host
Live (penyedia nyata + model nyata)
- Perintah:
pnpm test:live - Konfigurasi:
test/vitest/vitest.live.config.ts - File:
src/**/*.live.test.ts,test/**/*.live.test.ts, dan pengujian langsung plugin bawaan di bawahextensions/ - Bawaan: diaktifkan oleh
pnpm test:live(menetapkanOPENCLAW_LIVE_TEST=1) - Cakupan:
- "Apakah penyedia/model ini benar-benar berfungsi saat ini dengan kredensial nyata?"
- Mendeteksi perubahan format penyedia, kekhasan pemanggilan alat, masalah autentikasi, dan perilaku batas laju
- Ekspektasi:
- Sengaja tidak stabil untuk CI (jaringan nyata, kebijakan penyedia nyata, kuota, gangguan layanan)
- Memerlukan biaya / menggunakan batas laju
- Utamakan menjalankan subset yang dipersempit daripada "semuanya"
- Proses langsung menggunakan kunci API yang telah diekspor dan profil autentikasi yang telah disiapkan.
- Secara bawaan, proses langsung tetap mengisolasi
HOMEdan menyalin materi konfigurasi/autentikasi ke direktori utama pengujian sementara agar fixture unit tidak dapat mengubah~/.openclawAnda yang sebenarnya. - Tetapkan
OPENCLAW_LIVE_USE_REAL_HOME=1hanya ketika Anda memang perlu agar pengujian langsung menggunakan direktori utama Anda yang sebenarnya. pnpm test:livesecara bawaan menggunakan mode yang lebih senyap: mode ini mempertahankan keluaran progres[live] ...dan membisukan log bootstrap Gateway/percakapan Bonjour. TetapkanOPENCLAW_LIVE_TEST_QUIET=0jika Anda ingin menampilkan kembali log startup lengkap.- Rotasi kunci API (khusus penyedia): tetapkan
*_API_KEYSdengan format koma/titik koma atau*_API_KEY_1,*_API_KEY_2(misalnyaOPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS) atau penimpaan per proses langsung melaluiOPENCLAW_LIVE_*_KEY; pengujian mencoba kembali saat menerima respons batas laju. - Keluaran progres/heartbeat:
- Rangkaian pengujian langsung menampilkan baris progres ke stderr agar panggilan penyedia yang lama tetap terlihat aktif meskipun penangkapan konsol Vitest tidak menampilkan keluaran.
test/vitest/vitest.live.config.tsmenonaktifkan intersepsi konsol Vitest agar baris progres penyedia/Gateway langsung mengalir selama proses langsung.- Sesuaikan heartbeat model langsung dengan
OPENCLAW_LIVE_HEARTBEAT_MS. - Sesuaikan heartbeat Gateway/probe dengan
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS.
Rangkaian pengujian mana yang harus saya jalankan?
Gunakan tabel keputusan ini:
- Mengedit logika/pengujian: jalankan
pnpm test(danpnpm test:coveragejika Anda mengubah banyak hal) - Mengubah jaringan Gateway / protokol WS / pemasangan: tambahkan
pnpm test:e2e - Men-debug "bot saya tidak aktif" / kegagalan khusus penyedia / pemanggilan alat: jalankan
pnpm test:liveyang dipersempit
Pengujian langsung (yang mengakses jaringan)
Untuk matriks model langsung, smoke backend CLI, smoke ACP, harness app-server Codex, dan semua pengujian langsung penyedia media (Deepgram, BytePlus, ComfyUI, gambar, musik, video, harness media) - serta penanganan kredensial untuk proses langsung
- lihat Menguji rangkaian pengujian langsung. Untuk daftar periksa khusus pembaruan dan validasi plugin, lihat Menguji pembaruan dan plugin.
Runner Docker (pemeriksaan opsional "berfungsi di Linux")
Runner Docker ini dibagi menjadi dua kelompok:
- Runner model langsung:
test:docker:live-modelsdantest:docker:live-gatewayhanya menjalankan file langsung kunci profil yang sesuai di dalam image Docker repo (src/agents/models.profiles.live.test.tsdansrc/gateway/gateway-models.profiles.live.test.ts), dengan memasang direktori konfigurasi lokal, ruang kerja, dan file env profil opsional Anda. Titik masuk lokal yang sesuai adalahtest:live:models-profilesdantest:live:gateway-profiles. - Runner langsung Docker mempertahankan batas praktisnya sendiri jika diperlukan:
test:docker:live-modelssecara bawaan menggunakan kumpulan terkurasi yang didukung dan menghasilkan sinyal tinggi, dantest:docker:live-gatewaysecara bawaan menggunakanOPENCLAW_LIVE_GATEWAY_SMOKE=1,OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8,OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000, danOPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. TetapkanOPENCLAW_LIVE_MAX_MODELSatau variabel env Gateway ketika Anda secara eksplisit menginginkan batas yang lebih kecil atau pemindaian yang lebih besar. test:docker:allmembangun image Docker langsung satu kali melaluitest:docker:live-build, mengemas OpenClaw satu kali sebagai tarball npm melaluiscripts/package-openclaw-for-docker.mjs, lalu membangun/menggunakan kembali dua imagescripts/e2e/Dockerfile. Image dasar hanya merupakan runner Node/Git untuk jalur instalasi/pembaruan/dependensi plugin; jalur tersebut memasang tarball yang telah dibangun. Image fungsional menginstal tarball yang sama ke/appuntuk jalur fungsionalitas aplikasi hasil build. Definisi jalur Docker berada discripts/lib/docker-e2e-scenarios.mjs; logika perencana berada discripts/lib/docker-e2e-plan.mjs;scripts/test-docker-all.mjsmengeksekusi rencana yang dipilih. Agregat menggunakan penjadwal lokal berbobot:OPENCLAW_DOCKER_ALL_PARALLELISMmengontrol slot proses, sedangkan batas sumber daya mencegah jalur langsung berat, instalasi npm, dan multi-layanan dimulai secara bersamaan. Jika satu jalur lebih berat daripada batas aktif, penjadwal tetap dapat memulainya ketika kumpulan kosong, lalu menjalankannya sendiri hingga kapasitas kembali tersedia. Nilai bawaan adalah 10 slot,OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=5, danOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; sesuaikanOPENCLAW_DOCKER_ALL_WEIGHT_LIMITatauOPENCLAW_DOCKER_ALL_DOCKER_LIMIT(serta penimpaanOPENCLAW_DOCKER_ALL_<RESOURCE>_LIMITlainnya) hanya ketika host Docker memiliki kapasitas lebih besar. Runner melakukan pemeriksaan awal Docker secara bawaan, menghapus container E2E OpenClaw yang usang, menampilkan status setiap 30 detik, menyimpan waktu jalur yang berhasil di.artifacts/docker-tests/lane-timings.json, dan menggunakan waktu tersebut untuk memulai jalur yang lebih lama terlebih dahulu pada proses berikutnya. GunakanOPENCLAW_DOCKER_ALL_DRY_RUN=1untuk menampilkan manifes jalur berbobot tanpa membangun atau menjalankan Docker, ataunode scripts/test-docker-all.mjs --plan-jsonuntuk menampilkan rencana CI bagi jalur yang dipilih, kebutuhan paket/image, dan kredensial.Package Acceptanceadalah gerbang paket bawaan GitHub untuk "apakah tarball yang dapat diinstal ini berfungsi sebagai produk?" Gerbang ini menentukan satu paket kandidat darisource=npm,source=ref,source=url,source=trusted-url, atausource=artifact, mengunggahnya sebagaipackage-under-test, lalu menjalankan jalur E2E Docker yang dapat digunakan kembali terhadap tarball tersebut alih-alih mengemas ulang ref yang dipilih. Profil diurutkan berdasarkan luas cakupan:smoke,package,product, danfull(sertacustomuntuk daftar jalur eksplisit). Lihat Menguji pembaruan dan plugin untuk kontrak paket/pembaruan/plugin, matriks keberlangsungan pemutakhiran terbitan, nilai bawaan rilis, dan triase kegagalan.- Pemeriksaan build dan rilis menjalankan
scripts/check-cli-bootstrap-imports.mjssetelah tsdown. Pengaman ini menelusuri graf build statis daridist/entry.jsdandist/cli/run-main.jsdan gagal jika graf bootstrap pra-dispatch tersebut mengimpor secara statis paket eksternal apa pun (Commander, UI prompt, undici, logging, dan dependensi berat saat startup yang serupa semuanya dihitung) sebelum dispatch perintah; pengaman ini juga membatasi chunk proses Gateway yang dibundel pada 70 KB dan menolak impor statis jalur Gateway dingin yang diketahui (control-ui-assets,diagnostic-stability-bundle,onboard-helpers,process-respawn,restart-sentinel,server-close,server-reload-handlers) dari chunk tersebut.scripts/release-check.tssecara terpisah melakukan smoke test pada CLI yang dikemas dengan--help,onboard --help,doctor --help,status --json --timeout 1,config schema, danmodels list --provider openai. - Kompatibilitas lama Package Acceptance dibatasi hingga
2026.4.25(2026.4.25-beta.*disertakan). Hingga batas tersebut, harness hanya menoleransi kekurangan metadata paket yang telah dirilis: entri inventaris QA privat yang dihilangkan,gateway install --wrapperyang hilang, file patch yang hilang dalam fixture git turunan tarball,update.channeltersimpan yang hilang, lokasi lama catatan instalasi plugin, persistensi catatan instalasi marketplace yang hilang, dan migrasi metadata konfigurasi selamaplugins update. Untuk paket setelah2026.4.25, jalur tersebut merupakan kegagalan ketat. - Runner smoke container:
test:docker:openwebui,test:docker:onboard,test:docker:npm-onboard-channel-agent,test:docker:release-user-journey,test:docker:release-typed-onboarding,test:docker:release-media-memory,test:docker:release-upgrade-user-journey,test:docker:release-plugin-marketplace,test:docker:skill-install,test:docker:update-channel-switch,test:docker:upgrade-survivor,test:docker:published-upgrade-survivor,test:docker:session-runtime-context,test:docker:agents-delete-shared-workspace,test:docker:gateway-network,test:docker:browser-cdp-snapshot,test:docker:mcp-channels,test:docker:agent-bundle-mcp-tools,test:docker:cron-mcp-cleanup,test:docker:plugins,test:docker:plugin-update,test:docker:plugin-lifecycle-matrix, dantest:docker:config-reloadmenjalankan satu atau beberapa container nyata dan memverifikasi jalur integrasi tingkat tinggi. - Jalur E2E Docker/Bash yang menginstal tarball OpenClaw yang dikemas melalui
scripts/lib/openclaw-e2e-instance.shmembatasinpm installpadaOPENCLAW_E2E_NPM_INSTALL_TIMEOUT(bawaan600s; tetapkan0untuk menonaktifkan wrapper guna men-debug).
Runner Docker model langsung juga hanya melakukan bind-mount pada direktori utama autentikasi CLI yang diperlukan (atau semua yang didukung ketika proses tidak dipersempit), lalu menyalinnya ke direktori utama container sebelum proses dijalankan agar OAuth CLI eksternal dapat memperbarui token tanpa mengubah penyimpanan autentikasi host:
-
Model langsung:
pnpm test:docker:live-models(skrip:scripts/test-live-models-docker.sh) -
Smoke bind ACP:
pnpm test:docker:live-acp-bind(skrip:scripts/test-live-acp-bind-docker.sh; mencakup Claude, Codex, dan Gemini secara bawaan, dengan cakupan ketat Droid/OpenCode melaluipnpm test:docker:live-acp-bind:droiddanpnpm test:docker:live-acp-bind:opencode) -
Smoke backend CLI:
pnpm test:docker:live-cli-backend(skrip:scripts/test-live-cli-backend-docker.sh) -
Smoke harness app-server Codex:
pnpm test:docker:live-codex-harness(skrip:scripts/test-live-codex-harness-docker.sh) -
Gateway + agen pengembangan:
pnpm test:docker:live-gateway(skrip:scripts/test-live-gateway-models-docker.sh) -
Smoke observabilitas:
pnpm qa:otel:smoke,pnpm qa:prometheus:smoke, danpnpm qa:observability:smokemerupakan jalur checkout sumber QA privat. Jalur tersebut sengaja tidak menjadi bagian dari jalur rilis Docker paket karena tarball npm tidak menyertakan QA Lab. -
Smoke langsung Open WebUI:
pnpm test:docker:openwebui(skrip:scripts/e2e/openwebui-docker.sh) -
Wizard onboarding (TTY, scaffolding lengkap):
pnpm test:docker:onboard(skrip:scripts/e2e/onboard-docker.sh) -
Smoke onboarding/saluran/agen tarball npm:
pnpm test:docker:npm-onboard-channel-agentmenginstal tarball OpenClaw yang dikemas secara global di Docker, mengonfigurasi OpenAI melalui onboarding referensi env beserta Telegram secara bawaan, menjalankan doctor, dan menjalankan satu giliran agen OpenAI tiruan. Gunakan kembali tarball yang telah dibangun denganOPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz, lewati build ulang host denganOPENCLAW_NPM_ONBOARD_HOST_BUILD=0, atau ganti saluran denganOPENCLAW_NPM_ONBOARD_CHANNEL=discordatauOPENCLAW_NPM_ONBOARD_CHANNEL=slack. -
Smoke perjalanan pengguna rilis:
pnpm test:docker:release-user-journeymenginstal tarball OpenClaw yang telah dikemas secara global di direktori home Docker yang bersih, menjalankan onboarding, mengonfigurasi penyedia OpenAI tiruan, menjalankan satu giliran agen, menginstal/menghapus instalan plugin eksternal, mengonfigurasi ClickClack terhadap fixture lokal, memverifikasi perpesanan keluar/masuk, memulai ulang Gateway, dan menjalankan doctor. -
Smoke onboarding bertipe untuk rilis:
pnpm test:docker:release-typed-onboardingmenginstal tarball yang telah dikemas, mengoperasikanopenclaw onboardmelalui TTY nyata, mengonfigurasi OpenAI sebagai penyedia env-ref, memverifikasi bahwa kunci mentah tidak dipersistenkan, dan menjalankan satu giliran agen tiruan. -
Smoke media/memori rilis:
pnpm test:docker:release-media-memorymenginstal tarball yang telah dikemas, memverifikasi pemahaman gambar dari lampiran PNG, keluaran pembuatan gambar yang kompatibel dengan OpenAI, pemanggilan kembali melalui pencarian memori, dan bertahannya pemanggilan kembali setelah Gateway dimulai ulang. -
Smoke perjalanan pengguna peningkatan versi rilis:
pnpm test:docker:release-upgrade-user-journeysecara default menginstal baseline terbaru yang telah dipublikasikan dan lebih lama daripada tarball kandidat, mengonfigurasi status penyedia/plugin/ClickClack pada paket yang dipublikasikan, meningkatkan versi ke tarball kandidat, lalu menjalankan ulang perjalanan inti agen/plugin/channel. Jika tidak ada baseline lama yang telah dipublikasikan, versi kandidat digunakan kembali. Ganti baseline denganOPENCLAW_RELEASE_UPGRADE_BASELINE_SPEC=openclaw@<version>. -
Smoke marketplace plugin rilis:
pnpm test:docker:release-plugin-marketplacemenginstal dari marketplace fixture lokal, memperbarui plugin yang terinstal, menghapus instalannya, dan memverifikasi bahwa CLI plugin menghilang serta metadata instalasi dipangkas. -
Smoke instalasi skill:
pnpm test:docker:skill-installmenginstal tarball OpenClaw yang telah dikemas secara global di Docker, menonaktifkan instalasi arsip yang diunggah dalam konfigurasi, menemukan slug skill ClawHub aktif saat ini dari pencarian, menginstalnya denganopenclaw skills install, dan memverifikasi skill yang terinstal beserta metadata asal/kunci.clawhub. -
Smoke peralihan channel pembaruan:
pnpm test:docker:update-channel-switchmenginstal tarball OpenClaw yang telah dikemas secara global di Docker, beralih dari paketstableke gitdev, memverifikasi channel yang dipersistenkan dan berfungsinya plugin setelah pembaruan, lalu beralih kembali ke paketstabledan memeriksa status pembaruan. -
Smoke ketahanan setelah peningkatan versi:
pnpm test:docker:upgrade-survivormenginstal tarball OpenClaw yang telah dikemas di atas fixture pengguna lama yang tidak bersih, dengan agen, konfigurasi channel, daftar izin plugin, status dependensi plugin yang usang, serta file ruang kerja/sesi yang sudah ada. Ini menjalankan pembaruan paket dan doctor noninteraktif tanpa penyedia aktif atau kunci channel, lalu memulai Gateway loopback dan memeriksa pemeliharaan konfigurasi/status beserta batas waktu startup/status. -
Smoke ketahanan setelah peningkatan versi yang dipublikasikan:
pnpm test:docker:published-upgrade-survivorsecara default menginstalopenclaw@latest, mengisi file pengguna yang sudah ada secara realistis, mengonfigurasi baseline tersebut dengan resep perintah bawaan, memvalidasi konfigurasi yang dihasilkan, memperbarui instalasi yang dipublikasikan tersebut ke tarball kandidat, menjalankan doctor noninteraktif, menulis.artifacts/upgrade-survivor/summary.json, lalu memulai Gateway loopback dan memeriksa intent yang dikonfigurasi, pemeliharaan status, startup,/healthz,/readyz, serta batas waktu status RPC. Ganti satu baseline denganOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, minta penjadwal agregat memperluas baseline lokal persis denganOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECSseperti[email protected] [email protected] [email protected], dan perluas fixture berbentuk isu denganOPENCLAW_UPGRADE_SURVIVOR_SCENARIOSsepertireported-issues; kumpulan isu yang dilaporkan mencakupconfigured-plugin-installsuntuk perbaikan otomatis instalasi plugin OpenClaw eksternal. Package Acceptance mengeksposnya sebagaipublished_upgrade_survivor_baseline,published_upgrade_survivor_baselines, danpublished_upgrade_survivor_scenarios, menyelesaikan token baseline meta sepertilast-stable-4atauall-since-2026.4.23, dan Full Release Validation memperluas gerbang paket pengujian rilis berkepanjangan menjadilast-stable-4 2026.4.23 2026.5.2 2026.4.15besertareported-issues. -
Smoke konteks runtime sesi:
pnpm test:docker:session-runtime-contextmemverifikasi persistensi transkrip konteks runtime tersembunyi beserta perbaikan oleh doctor terhadap cabang penulisan ulang prompt terduplikasi yang terdampak. -
Smoke instalasi global Bun:
bash scripts/e2e/bun-global-install-smoke.shmengemas pohon saat ini, menginstalnya denganbun install -gdi direktori home terisolasi, dan memverifikasi bahwaopenclaw infer image providers --jsonmengembalikan penyedia gambar bawaan alih-alih berhenti merespons. Gunakan kembali tarball yang telah dibuat denganOPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz, lewati build host denganOPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0, atau salindist/dari image Docker yang telah dibuat denganOPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local. -
Smoke Docker penginstal:
bash scripts/test-install-sh-docker.shberbagi satu cache npm di antara container root, pembaruan, dan direct-npm. Smoke pembaruan secara default menggunakan npmlatestsebagai baseline stabil sebelum meningkatkan versi ke tarball kandidat. Ganti secara lokal denganOPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22, atau dengan inputupdate_baseline_versionalur kerja Install Smoke di GitHub. Pemeriksaan penginstal non-root mempertahankan cache npm terisolasi agar entri cache milik root tidak menyamarkan perilaku instalasi lokal pengguna. AturOPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cacheuntuk menggunakan kembali cache root/pembaruan/direct-npm pada pengulangan lokal. -
Pipeline CI Install Smoke melewati pembaruan global direct-npm duplikat dengan
OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1; jalankan skrip secara lokal tanpa env tersebut ketika cakupan langsungnpm install -gdiperlukan. -
Smoke CLI penghapusan ruang kerja bersama agen:
pnpm test:docker:agents-delete-shared-workspace(skrip:scripts/e2e/agents-delete-shared-workspace-docker.sh) secara default membuat image Dockerfile root, mengisi dua agen dengan satu ruang kerja dalam direktori home container terisolasi, menjalankanagents delete --json, dan memverifikasi JSON yang valid beserta perilaku ruang kerja yang dipertahankan. Gunakan kembali image install-smoke denganOPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1. -
Jaringan Gateway dan siklus hidup host:
pnpm test:docker:gateway-network(skrip:scripts/e2e/gateway-network-docker.sh) mempertahankan smoke autentikasi/kesehatan WebSocket LAN dua container, lalu menggunakan Admin HTTP loopback untuk membuktikan pemagaran persiapan, akses kontrol yang dipertahankan, pemulihan resume, dan penghentian/pemulaian dalam container yang sama setelah dipersiapkan. Pemeriksaan mulai ulang harus selesai sebelum lease awal kedaluwarsa, memverifikasi bahwa status penangguhan bersifat lokal bagi proses sementara konfigurasi Gateway yang dipersistenkan dan identitas container tetap bertahan, serta menghasilkan JSON waktu fase yang dapat dibaca mesin. -
Smoke snapshot CDP browser:
pnpm test:docker:browser-cdp-snapshot(skrip:scripts/e2e/browser-cdp-snapshot-docker.sh) membuat image E2E sumber beserta lapisan Chromium, memulai Chromium dengan CDP mentah, menjalankanbrowser doctor --deep, dan memverifikasi bahwa snapshot peran CDP mencakup URL tautan, elemen yang dapat diklik karena kursor, referensi iframe, dan metadata frame. -
Regresi penalaran minimal web_search OpenAI Responses:
pnpm test:docker:openai-web-search-minimal(skrip:scripts/e2e/openai-web-search-minimal-docker.sh) menjalankan server OpenAI tiruan melalui Gateway, memverifikasi bahwaweb_searchmenaikkanreasoning.effortdariminimalmenjadilow, lalu memaksa skema penyedia menolak dan memeriksa bahwa detail mentah muncul dalam log Gateway. -
Jembatan channel MCP (Gateway yang telah diisi + jembatan stdio + smoke frame notifikasi Claude mentah):
pnpm test:docker:mcp-channels(skrip:scripts/e2e/mcp-channels-docker.sh) -
Peralatan MCP bundle OpenClaw (server MCP stdio nyata + smoke izin/tolak profil OpenClaw tertanam):
pnpm test:docker:agent-bundle-mcp-tools(skrip:scripts/e2e/agent-bundle-mcp-tools-docker.sh) -
Pembersihan MCP Cron/subagen (Gateway nyata + penghentian proses turunan MCP stdio setelah eksekusi cron terisolasi dan subagen sekali jalan):
pnpm test:docker:cron-mcp-cleanup(skrip:scripts/e2e/cron-mcp-cleanup-docker.sh) -
Plugin (smoke instalasi/pembaruan untuk jalur lokal,
file:, registri npm dengan dependensi yang di-hoist, metadata paket npm yang cacat, referensi git yang berpindah, paket lengkap ClawHub, pembaruan marketplace, serta pengaktifan/inspeksi bundle Claude):pnpm test:docker:plugins(skrip:scripts/e2e/plugins-docker.sh) AturOPENCLAW_PLUGINS_E2E_CLAWHUB=0untuk melewati blok ClawHub, atau ganti pasangan paket/runtime lengkap default denganOPENCLAW_PLUGINS_E2E_CLAWHUB_SPECdanOPENCLAW_PLUGINS_E2E_CLAWHUB_ID. TanpaOPENCLAW_CLAWHUB_URL/CLAWHUB_URL, pengujian menggunakan server fixture ClawHub lokal yang hermetis. -
Smoke pembaruan plugin tanpa perubahan:
pnpm test:docker:plugin-update(skrip:scripts/e2e/plugin-update-unchanged-docker.sh) -
Smoke matriks siklus hidup plugin:
pnpm test:docker:plugin-lifecycle-matrixmenginstal tarball OpenClaw yang telah dikemas dalam container kosong, menginstal plugin npm, mengaktifkan/menonaktifkannya, meningkatkan dan menurunkan versinya melalui registri npm lokal, menghapus kode yang terinstal, lalu memverifikasi bahwa penghapusan instalasi tetap menghapus status usang sambil mencatat metrik RSS/CPU untuk setiap fase siklus hidup. -
Smoke metadata pemuatan ulang konfigurasi:
pnpm test:docker:config-reload(skrip:scripts/e2e/config-reload-source-docker.sh) -
Plugin:
pnpm test:docker:pluginsmencakup smoke instalasi/pembaruan untuk jalur lokal,file:, registri npm dengan dependensi yang di-hoist, referensi git yang berpindah, fixture ClawHub, pembaruan marketplace, serta pengaktifan/inspeksi bundle Claude.pnpm test:docker:plugin-updatemencakup perilaku pembaruan tanpa perubahan untuk plugin yang terinstal.pnpm test:docker:plugin-lifecycle-matrixmencakup instalasi plugin npm dengan pelacakan sumber daya, pengaktifan, penonaktifan, peningkatan versi, penurunan versi, dan penghapusan instalasi ketika kode hilang.
Untuk membuat sebelumnya dan menggunakan kembali image fungsional bersama secara manual:
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local pnpm test:docker:e2e-buildOPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:mcp-channelsPenggantian image khusus suite seperti OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE tetap diutamakan jika ditetapkan. Ketika OPENCLAW_SKIP_DOCKER_BUILD=1 menunjuk ke image bersama jarak jauh, skrip akan menariknya jika image tersebut belum tersedia secara lokal. Pengujian Docker QR dan penginstal mempertahankan Dockerfile masing-masing karena keduanya memvalidasi perilaku paket/instalasi, bukan runtime aplikasi hasil build bersama.
Runner Docker model aktif juga memasang checkout saat ini sebagai bind mount hanya-baca
dan menempatkannya ke dalam direktori kerja sementara di dalam container. Hal ini menjaga
image runtime tetap ramping sambil tetap menjalankan Vitest terhadap sumber/konfigurasi lokal
Anda secara persis. Langkah penempatan melewati cache besar yang hanya bersifat lokal dan keluaran build
aplikasi seperti .pnpm-store, .worktrees, __openclaw_vitest__, serta
direktori keluaran .build lokal aplikasi atau Gradle agar eksekusi aktif Docker tidak
menghabiskan waktu beberapa menit untuk menyalin artefak khusus mesin. Runner juga menetapkan
OPENCLAW_SKIP_CHANNELS=1 agar probe aktif Gateway tidak memulai worker channel
Telegram/Discord/dll. yang sebenarnya di dalam container.
test:docker:live-models tetap menjalankan pnpm test:live, jadi teruskan juga
OPENCLAW_LIVE_GATEWAY_* ketika Anda perlu mempersempit atau mengecualikan cakupan aktif
Gateway dari lane Docker tersebut.
test:docker:openwebui adalah smoke kompatibilitas tingkat lebih tinggi: ini memulai
container Gateway OpenClaw dengan endpoint HTTP yang kompatibel dengan OpenAI diaktifkan,
memulai container Open WebUI yang versinya dipatok terhadap Gateway tersebut, masuk melalui
Open WebUI, memverifikasi bahwa /api/models mengekspos openclaw/default, lalu mengirim
permintaan percakapan nyata melalui proksi /api/chat/completions milik Open WebUI. Tetapkan
OPENWEBUI_SMOKE_MODE=models untuk pemeriksaan Pipeline CI jalur rilis yang harus berhenti
setelah masuk ke Open WebUI dan penemuan model, tanpa menunggu penyelesaian model aktif.
Eksekusi pertama dapat terasa jauh lebih lambat karena Docker mungkin perlu
menarik image Open WebUI dan Open WebUI mungkin perlu menyelesaikan
penyiapan cold-start-nya sendiri. Lane ini mengharapkan kunci model aktif yang dapat digunakan, yang disediakan melalui
lingkungan proses, profil autentikasi yang telah ditempatkan, atau
OPENCLAW_PROFILE_FILE eksplisit. Eksekusi yang berhasil mencetak payload JSON kecil seperti
{ "ok": true, "model": "openclaw/default", ... }.
test:docker:mcp-channels sengaja dibuat deterministik dan tidak memerlukan
akun Telegram, Discord, atau iMessage nyata. Ini mem-boot container Gateway
yang telah diisi, memulai container kedua yang menjalankan openclaw mcp serve, lalu
memverifikasi penemuan percakapan yang dirutekan, pembacaan transkrip, metadata
lampiran, perilaku antrean peristiwa aktif, perutean pengiriman keluar, serta notifikasi
channel + izin bergaya Claude melalui jembatan MCP stdio nyata. Pemeriksaan
notifikasi memeriksa frame MCP stdio mentah secara langsung sehingga smoke tersebut
memvalidasi apa yang benar-benar dihasilkan jembatan, bukan sekadar apa yang kebetulan
diekspos oleh SDK klien tertentu.
test:docker:agent-bundle-mcp-tools bersifat deterministik dan tidak memerlukan
kunci model aktif. Proses ini membangun image Docker repositori, memulai server
probe MCP stdio nyata di dalam kontainer, mewujudkan server tersebut melalui
runtime MCP bundel OpenClaw tertanam, menjalankan alat, lalu memverifikasi bahwa
coding dan messaging mempertahankan alat bundle-mcp, sedangkan minimal dan
tools.deny: ["bundle-mcp"] memfilternya.
test:docker:cron-mcp-cleanup bersifat deterministik dan tidak memerlukan kunci
model aktif. Proses ini memulai Gateway berisi data awal dengan server probe MCP stdio nyata,
menjalankan giliran cron terisolasi dan giliran turunan sekali jalan sessions_spawn, lalu
memverifikasi bahwa proses turunan MCP berhenti setelah setiap proses berjalan.
Smoke test manual thread ACP dengan bahasa biasa (bukan CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- Pertahankan skrip ini untuk alur kerja regresi/debug. Skrip ini mungkin diperlukan lagi untuk validasi perutean thread ACP, jadi jangan hapus.
Variabel env yang berguna:
OPENCLAW_CONFIG_DIR=...(default:~/.openclaw) dipasang ke/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(default:~/.openclaw/workspace) dipasang ke/home/node/.openclaw/workspaceOPENCLAW_PROFILE_FILE=...dipasang dan dimuat sebelum menjalankan pengujianOPENCLAW_DOCKER_PROFILE_ENV_ONLY=1untuk memverifikasi hanya variabel env yang dimuat dariOPENCLAW_PROFILE_FILE, menggunakan direktori konfigurasi/ruang kerja sementara dan tanpa pemasangan autentikasi CLI eksternalOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(default:~/.cache/openclaw/docker-cli-tools, kecuali proses sudah menggunakan direktori bind CI/terkelola) dipasang ke/home/node/.npm-globaluntuk instalasi CLI yang di-cache di dalam Docker- Direktori/file autentikasi CLI eksternal di bawah
$HOMEdipasang hanya-baca di bawah/host-auth..., lalu disalin ke/home/node/...sebelum pengujian dimulai- Direktori default (digunakan saat proses tidak dibatasi ke penyedia tertentu):
.factory,.gemini,.minimax - File default:
~/.codex/auth.json,~/.codex/config.toml,.claude.json,~/.claude/.credentials.json,~/.claude/settings.json,~/.claude/settings.local.json - Proses penyedia yang dibatasi hanya memasang direktori/file yang diperlukan berdasarkan inferensi dari
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERS - Timpa secara manual dengan
OPENCLAW_DOCKER_AUTH_DIRS=all,OPENCLAW_DOCKER_AUTH_DIRS=none, atau daftar yang dipisahkan koma sepertiOPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
- Direktori default (digunakan saat proses tidak dibatasi ke penyedia tertentu):
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...untuk membatasi prosesOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=...untuk memfilter penyedia di dalam kontainerOPENCLAW_SKIP_DOCKER_BUILD=1untuk menggunakan kembali imageopenclaw:local-liveyang ada bagi proses ulang yang tidak memerlukan pembangunan ulangOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1untuk memastikan kredensial berasal dari penyimpanan profil (bukan env)OPENCLAW_OPENWEBUI_MODEL=...untuk memilih model yang diekspos oleh gateway bagi smoke test Open WebUIOPENCLAW_OPENWEBUI_PROMPT=...untuk menimpa prompt pemeriksaan nonce yang digunakan oleh smoke test Open WebUIOPENWEBUI_IMAGE=...untuk menimpa tag image Open WebUI yang dipatok
Pemeriksaan kewajaran dokumentasi
Jalankan pemeriksaan dokumentasi setelah mengedit dokumentasi: pnpm check:docs.
Jalankan validasi anchor Mintlify lengkap jika Anda juga memerlukan pemeriksaan judul dalam halaman: pnpm docs:check-links:anchors.
Regresi luring (aman untuk CI)
Berikut adalah regresi "pipeline nyata" tanpa penyedia nyata:
- Pemanggilan alat Gateway (OpenAI tiruan, gateway + loop agen nyata):
src/gateway/gateway.test.ts(kasus: "menjalankan pemanggilan alat OpenAI tiruan secara menyeluruh melalui loop agen gateway") - Wizard Gateway (WS
wizard.start/wizard.next, menulis konfigurasi + autentikasi diberlakukan):src/gateway/gateway.test.ts(kasus: "menjalankan wizard melalui ws dan menulis konfigurasi token autentikasi")
Evaluasi keandalan agen (Skills)
Kami sudah memiliki beberapa pengujian aman untuk CI yang berperilaku seperti "evaluasi keandalan agen":
- Pemanggilan alat tiruan melalui gateway + loop agen nyata (
src/gateway/gateway.test.ts). - Alur wizard menyeluruh yang memvalidasi pengkabelan sesi dan efek konfigurasi (
src/gateway/gateway.test.ts).
Hal yang masih belum tersedia untuk Skills (lihat Skills):
- Pengambilan keputusan: ketika Skills tercantum dalam prompt, apakah agen memilih skill yang tepat (atau menghindari yang tidak relevan)?
- Kepatuhan: apakah agen membaca
SKILL.mdsebelum digunakan dan mengikuti langkah/argumen yang diwajibkan? - Kontrak alur kerja: skenario multi-giliran yang menegaskan urutan alat, penerusan riwayat sesi, dan batas sandbox.
Evaluasi mendatang harus mengutamakan sifat deterministik:
- Runner skenario yang menggunakan penyedia tiruan untuk menegaskan pemanggilan + urutan alat, pembacaan file skill, dan pengkabelan sesi.
- Suite kecil skenario yang berfokus pada skill (gunakan vs hindari, pembatasan, injeksi prompt).
- Evaluasi aktif opsional (keikutsertaan eksplisit, dibatasi env) hanya setelah suite aman untuk CI tersedia.
Pengujian kontrak (bentuk plugin dan saluran)
Pengujian kontrak memverifikasi bahwa setiap plugin dan saluran terdaftar mematuhi
kontrak antarmukanya. Pengujian ini mengiterasi semua plugin yang ditemukan dan menjalankan
suite pernyataan bentuk dan perilaku. Jalur unit pnpm test default
secara sengaja melewati file seam bersama dan smoke test ini; jalankan perintah kontrak
secara eksplisit saat Anda menyentuh permukaan saluran atau penyedia bersama.
Perintah
- Semua kontrak:
pnpm test:contracts - Hanya kontrak saluran:
pnpm test:contracts:channels - Hanya kontrak penyedia:
pnpm test:contracts:plugins
Kontrak saluran
Terletak di src/channels/plugins/contracts/*.contract.test.ts. Kategori
tingkat atas saat ini:
- channel-catalog - metadata entri katalog saluran bawaan/registri
- plugin (didukung registri, dipecah menjadi shard) - bentuk pendaftaran plugin dasar
- surfaces-only (didukung registri, dipecah menjadi shard) - pemeriksaan bentuk per permukaan untuk
actions,setup,status,outbound,messaging,threading,directory, dangateway - session-binding (didukung registri) - perilaku pengikatan sesi
- outbound-payload - struktur dan normalisasi payload pesan
- group-policy (fallback) - pemberlakuan kebijakan grup default per saluran
- threading (didukung registri, dipecah menjadi shard) - penanganan id thread
- directory (didukung registri, dipecah menjadi shard) - API direktori/daftar anggota
- registry dan plugins-core.* - registri plugin saluran, pemuat, dan internal otorisasi penulisan konfigurasi
Helper harness penangkapan-dispatch masuk dan payload-keluar yang digunakan oleh
suite ini diekspos secara internal melalui src/plugin-sdk/channel-contract-testing.ts
(dikecualikan dari npm, bukan subpath SDK publik); tidak ada file mandiri
inbound.contract.test.ts di direktori ini.
Kontrak penyedia
Terletak di src/plugins/contracts/*.contract.test.ts. Kategori saat ini
meliputi:
- shape - bentuk manifes plugin, API, dan ekspor runtime
- plugin-registration (+ paralel) - kasus pendaftaran manifes
- package-manifest - persyaratan manifes paket
- loader - perilaku penyiapan/pembongkaran pemuat plugin
- registry - isi dan pencarian registri kontrak plugin
- providers - perilaku penyedia bersama di seluruh penyedia bawaan, serta penyedia pencarian web
- auth-choice - metadata pilihan autentikasi dan perilaku penyiapan
- provider-catalog-deprecation - metadata katalog penyedia yang tidak digunakan lagi
- wizard.choice-resolution, wizard.model-picker, wizard.setup-options - kontrak wizard penyiapan penyedia
- embedding-provider, memory-embedding-provider, web-fetch-provider, tts - kontrak penyedia khusus kapabilitas
- session-actions, session-attachments, session-entry-projection - kontrak status sesi milik plugin
- scheduled-turns - metadata giliran terjadwal plugin dan batas stempel waktu
- host-hooks, run-context-lifecycle, runtime-import-side-effects, runtime-seams - kontrak siklus hidup host/runtime plugin dan batas impor
- extension-runtime-dependencies - penempatan dependensi runtime untuk ekstensi
Kapan dijalankan
- Setelah mengubah ekspor atau subpath plugin-sdk
- Setelah menambahkan atau memodifikasi plugin saluran atau penyedia
- Setelah merefaktor pendaftaran atau penemuan plugin
Pengujian kontrak dijalankan dalam CI dan tidak memerlukan kunci API nyata.
Menambahkan regresi (panduan)
Saat Anda memperbaiki masalah penyedia/model yang ditemukan secara langsung:
- Tambahkan regresi aman untuk CI jika memungkinkan (penyedia tiruan/stub, atau tangkap transformasi bentuk permintaan yang tepat)
- Jika masalah tersebut pada dasarnya hanya dapat diuji secara langsung (batas laju, kebijakan autentikasi), pertahankan pengujian langsung agar tetap sempit dan bersifat keikutsertaan eksplisit melalui variabel env
- Utamakan penargetan lapisan terkecil yang dapat menangkap bug:
- bug konversi/pemutaran ulang permintaan penyedia -> pengujian model langsung
- bug pipeline sesi/riwayat/alat gateway -> smoke test gateway langsung atau pengujian tiruan gateway yang aman untuk CI
- Pagar pengaman penelusuran SecretRef:
src/secrets/exec-secret-ref-id-parity.test.tsmemperoleh satu target sampel per kelas SecretRef dari metadata registri (listSecretTargetRegistryEntries()), lalu menegaskan bahwa id eksekusi dengan segmen penelusuran ditolak.- Jika Anda menambahkan keluarga target SecretRef
includeInPlanbaru disrc/secrets/target-registry-data.ts, perbaruiclassifyTargetClassdalam pengujian tersebut. Pengujian ini sengaja gagal pada id target yang belum diklasifikasikan agar kelas baru tidak dapat dilewati secara diam-diam.