الاختبارات
- عدة الاختبار الكاملة (الأجنحة، وlive، وDocker): الاختبار
-
pnpm test:force: يقتل أي عملية gateway متبقية تحتجز منفذ التحكم الافتراضي، ثم يشغّل جناح Vitest الكامل بمنفذ gateway معزول حتى لا تتعارض اختبارات الخادم مع مثيل قيد التشغيل. استخدم هذا عندما يترك تشغيل gateway سابق المنفذ 18789 مشغولًا. -
pnpm test:coverage: يشغّل جناح unit مع تغطية V8 (عبرvitest.unit.config.ts). الحدود العامة هي 70% للأسطر/الفروع/الدوال/التعليمات. تستثني التغطية نقاط الدخول الثقيلة على مستوى integration (توصيلات CLI، وجسور gateway/telegram، وخادم webchat الثابت) للإبقاء على الهدف مركزًا على المنطق القابل للاختبار بوحدة. -
pnpm test:coverage:changed: يشغّل تغطية unit فقط للملفات المتغيرة منذorigin/main. -
pnpm test:changed: يوسّع مسارات git المتغيرة إلى مسارات Vitest محددة عندما يمس الفرق فقط ملفات المصدر/الاختبار القابلة للتوجيه. أما تغييرات config/setup فتعود إلى تشغيل root projects الأصلي بحيث تعيد تعديلات التوصيل التشغيل على نطاق واسع عند الحاجة. -
pnpm test: يوجّه أهداف الملفات/الأدلة الصريحة عبر مسارات Vitest محددة. أما التشغيلات غير المستهدفة فتنفذ الآن إحدى عشرة إعدادات shard متتابعة (vitest.full-core-unit-src.config.tsوvitest.full-core-unit-security.config.tsوvitest.full-core-unit-ui.config.tsوvitest.full-core-unit-support.config.tsوvitest.full-core-support-boundary.config.tsوvitest.full-core-contracts.config.tsوvitest.full-core-bundled.config.tsوvitest.full-core-runtime.config.tsوvitest.full-agentic.config.tsوvitest.full-auto-reply.config.tsوvitest.full-extensions.config.ts) بدلًا من عملية root-project ضخمة واحدة. -
تُوجَّه الآن ملفات الاختبار المحددة في
plugin-sdkوcommandsعبر مسارات خفيفة مخصصة تُبقي فقطtest/setup.ts، بينما تبقى الحالات الثقيلة على مستوى runtime في مساراتها الحالية. -
كما تربط ملفات المصدر المساعدة المحددة في
plugin-sdkوcommandsبينpnpm test:changedواختبارات شقيقة صريحة في تلك المسارات الخفيفة، بحيث تتجنب تعديلات المساعدات الصغيرة إعادة تشغيل الأجنحة الثقيلة المدعومة بـ runtime. -
ينقسم
auto-replyالآن أيضًا إلى ثلاثة إعدادات مخصصة (coreوtop-levelوreply) حتى لا تهيمن حاضنة reply على اختبارات الحالة/الرمز/المساعدات الأخف في المستوى الأعلى. -
أصبح إعداد Vitest الأساسي يستخدم افتراضيًا
pool: "threads"وisolate: false، مع تفعيل المشغّل المشترك غير المعزول عبر إعدادات المستودع. -
pnpm test:channelsيشغّلvitest.channels.config.ts. -
pnpm test:extensionsيشغّلvitest.extensions.config.ts. -
pnpm test:extensions: يشغّل أجنحة extension/plugin. -
pnpm test:perf:imports: يفعّل تقارير مدة الاستيراد + تفصيل الاستيراد في Vitest، مع الاستمرار في استخدام توجيه المسارات المحددة لأهداف الملفات/الأدلة الصريحة. -
pnpm test:perf:imports:changed: profiling الاستيراد نفسه، ولكن فقط للملفات المتغيرة منذorigin/main. -
pnpm test:perf:changed:bench -- --ref <git-ref>يقيس مسار الوضع المتغير الموجّه مقابل تشغيل root-project الأصلي للفرق نفسه في git بعد الالتزام. -
pnpm test:perf:changed:bench -- --worktreeيقيس مجموعة تغييرات worktree الحالية من دون الالتزام أولًا. -
pnpm test:perf:profile:main: يكتب ملف CPU profile لخيط Vitest الرئيسي (.artifacts/vitest-main-profile). -
pnpm test:perf:profile:runner: يكتب ملفات CPU + heap profiles لمشغّل unit (.artifacts/vitest-runner-profile). -
Gateway integration: تفعيل اختياري عبر
OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm testأوpnpm test:gateway. -
pnpm test:e2e: يشغّل اختبارات الفحص الأساسية end-to-end لـ gateway (تعدد المثيلات، وWS/HTTP، واقتران العقد). يستخدم افتراضيًاthreads+isolate: falseمع عمال تكيفيين فيvitest.e2e.config.ts؛ اضبطه عبرOPENCLAW_E2E_WORKERS=<n>واضبطOPENCLAW_E2E_VERBOSE=1للحصول على سجلات تفصيلية. -
pnpm test:live: يشغّل اختبارات الموفّرين الحية (minimax/zai). يتطلب مفاتيح API وLIVE=1(أو*_LIVE_TEST=1الخاص بكل موفّر) لإلغاء التخطي. -
pnpm test:docker:openwebui: يبدأ OpenClaw + Open WebUI داخل Docker، ويسجل الدخول عبر Open WebUI، ويفحص/api/models، ثم يشغّل دردشة حقيقية عبر proxy من خلال/api/chat/completions. ويتطلب مفتاح نموذج حي صالحًا (مثل OpenAI في~/.profile)، ويجلب صورة Open WebUI خارجية، ولا يُتوقع أن يكون مستقرًا في CI مثل أجنحة unit/e2e العادية. -
pnpm test:docker:mcp-channels: يبدأ حاوية Gateway مهيأة مسبقًا وحاوية عميل ثانية تشغّلopenclaw mcp serve، ثم يتحقق من اكتشاف المحادثات الموجّهة، وقراءة transcript، وmetadata الخاصة بالمرفقات، وسلوك قائمة الأحداث الحية، وتوجيه الإرسال الصادر، وإشعارات القنوات + الأذونات بأسلوب Claude عبر جسر stdio الحقيقي. ويقرأ تحقق إشعارات Claude إطارات stdio MCP الخام مباشرة بحيث يعكس الفحص ما يصدره الجسر فعليًا.
بوابة PR المحلية
لإجراء فحوصات بوابة/الهبوط الخاصة بـ PR محليًا، شغّل:pnpm checkpnpm buildpnpm testpnpm check:docs
pnpm test بشكل متقطع على مضيف محمّل، فأعد تشغيله مرة واحدة قبل اعتباره تراجعًا، ثم اعزله باستخدام pnpm test <path/to/test>. وبالنسبة للمضيفين ذوي الذاكرة المحدودة، استخدم:
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed
قياس زمن استجابة النموذج (مفاتيح محلية)
السكربت:scripts/bench-model.ts
الاستخدام:
source ~/.profile && pnpm tsx scripts/bench-model.ts --runs 10- متغيرات بيئة اختيارية:
MINIMAX_API_KEYوMINIMAX_BASE_URLوMINIMAX_MODELوANTHROPIC_API_KEY - المطالبة الافتراضية: “Reply with a single word: ok. No punctuation or extra text.”
- median لـ minimax هو 1279ms (الحد الأدنى 1114، والحد الأقصى 2431)
- median لـ opus هو 2454ms (الحد الأدنى 1224، والحد الأقصى 3170)
قياس بدء تشغيل CLI
السكربت:scripts/bench-cli-startup.ts
الاستخدام:
pnpm test:startup:benchpnpm test:startup:bench:smokepnpm test:startup:bench:savepnpm test:startup:bench:updatepnpm test:startup:bench:checkpnpm tsx scripts/bench-cli-startup.tspnpm tsx scripts/bench-cli-startup.ts --runs 12pnpm tsx scripts/bench-cli-startup.ts --preset realpnpm tsx scripts/bench-cli-startup.ts --preset real --case status --case gatewayStatus --runs 3pnpm tsx scripts/bench-cli-startup.ts --entry openclaw.mjs --entry-secondary dist/entry.js --preset allpnpm tsx scripts/bench-cli-startup.ts --preset all --output .artifacts/cli-startup-bench-all.jsonpnpm tsx scripts/bench-cli-startup.ts --preset real --case gatewayStatusJson --output .artifacts/cli-startup-bench-smoke.jsonpnpm tsx scripts/bench-cli-startup.ts --preset real --cpu-prof-dir .artifacts/cli-cpupnpm tsx scripts/bench-cli-startup.ts --json
startup: --versionو--helpوhealthوhealth --jsonوstatus --jsonوstatusreal: healthوstatusوstatus --jsonوsessionsوsessions --jsonوagents list --jsonوgateway statusوgateway status --jsonوgateway health --jsonوconfig get gateway.portall: كلتا المجموعتين المسبقتين
sampleCount، وavg، وp50، وp95، وmin/max، وتوزيع exit-code/signal، وملخصات max RSS لكل أمر. وتكتب الخيارات --cpu-prof-dir / --heap-prof-dir ملفات V8 profile لكل تشغيل بحيث يستخدم الالتقاط الزمني وprofile الحاضنة نفسها.
اصطلاحات الإخراج المحفوظ:
- يكتب
pnpm test:startup:bench:smokeملف smoke المستهدف في.artifacts/cli-startup-bench-smoke.json - يكتب
pnpm test:startup:bench:saveملف الجناح الكامل في.artifacts/cli-startup-bench-all.jsonباستخدامruns=5وwarmup=1 - يحدّث
pnpm test:startup:bench:updatebaseline fixture الملتزم فيtest/fixtures/cli-startup-bench.jsonباستخدامruns=5وwarmup=1
test/fixtures/cli-startup-bench.json- حدّثه عبر
pnpm test:startup:bench:update - قارن النتائج الحالية مع الـ fixture عبر
pnpm test:startup:bench:check
Onboarding E2E (Docker)
Docker اختياري؛ وهذا مطلوب فقط لاختبارات onboarding الأساسية المعتمدة على الحاويات. تدفق البدء البارد الكامل داخل حاوية Linux نظيفة:openclaw health.
فحص QR import الأساسي (Docker)
يضمن تحميلqrcode-terminal تحت بيئات Node المدعومة في Docker (Node 24 افتراضي، وNode 22 متوافق):