cargo-nextest - عداء الاختبار الصدئ من الجيل التالي
cargo-nextest هو عداء اختبار من الجيل التالي لـ Rust. الاختلاف المعماري الأساسي عن cargo test هو أنه يشغّل كل اختبار في عملية خاصة به، وهذا يعطي عزلة حقيقية (اختبار واحد لا يمكنه إفساد حالة عام آخر)، توازي أفضل، والقدرة على الإبلاغ عن اختبار يحطم العملية بدلاً من فقدان التشغيل بأكمله. في الممارسة فهو عادة 2–3 مرات أسرع من cargo test على الأجنحة الكبيرة، مع مخرجات أنظف، كشف الاختبار غير المستقر، وتقسيم لتجزئة CI.
التثبيت
| الطريقة | الأمر |
|---|
| مُركَّب مسبقًا (الأسرع) | cargo install cargo-nextest --locked |
| ملف ثنائي | تحميل من إصدارات nextest |
| macOS (Homebrew) | brew install cargo-nextest |
| التحقق | cargo nextest --version |
الاستخدام الأساسي
| الأمر | الوصف |
|---|
cargo nextest run | شغّل جميع الاختبارات |
cargo nextest run -p mycrate | صندوق واحد |
cargo nextest run test_name | تصفية حسب substring |
cargo nextest list | اسرد الاختبارات بدون تشغيل |
cargo nextest run --release | ملف تعريف الإفراج |
cargo nextest run --no-fail-fast | استمر بعد الفشل |
التصفية (Filtersets)
nextest له لغة تعبير لتحديد الاختبارات.
| التعبير | يختار |
|---|
-E 'test(auth)' | الاختبارات التي يطابق اسمها auth |
-E 'package(mycrate)' | جميع الاختبارات في صندوق |
-E 'kind(lib)' | فقط اختبارات lib (الوحدة) |
-E 'binary(integration)' | ملف ثنائي اختبار معين |
-E 'test(a) + test(b)' | الاتحاد |
-E 'package(x) - test(slow)' | الفرق |
# شغّل اختبارات التكامل لصندوق واحد، استبعد الأبطأ
cargo nextest run -E 'package(api) and kind(test) - test(slow)'
كشف الاختبار غير المستقر
# أعد محاولة الفشل حتى 3 مرات؛ الاختبارات التي تمر على إعادة محاولة يتم وضع علامة عليها FLAKY
cargo nextest run --retries 3
| الإعدادات | التأثير |
|---|
--retries N | أعد محاولة الاختبارات الفاشلة N مرات |
| تم الإبلاغ عنها كـ FLAKY | مرت فقط بعد إعادة محاولة |
| التجاوزات لكل اختبار | اضبط إعادة المحاولات لاختبارات محددة في الإعدادات |
هذا الاختلاف مهم: اختبار غير مستقر هي مشكلة مختلفة عن اختبار فاشل، و nextest تسطح أنها بشكل صريح بدلاً من إخفاؤها خلف إعادة تشغيل.
الإعدادات
# .config/nextest.toml
[profile.default]
retries = 0
fail-fast = false
slow-timeout = { period = "30s", terminate-after = 2 }
[profile.ci]
retries = 2
failure-output = "immediate-final"
status-level = "skip"
[[profile.default.overrides]]
filter = 'test(integration)'
threads-required = 2
| الإعداد | الغرض |
|---|
retries | عدد إعادة المحاولة الافتراضي |
slow-timeout | ابدأ/اقتل اختبار يتجاوز المدة |
threads-required | احجز السعة للاختبارات الثقيلة |
failure-output | متى طباعة تفاصيل الفشل |
| الملفات الشخصية | cargo nextest run -P ci |
تجزئة CI
# قسّم الأجنحة عبر 4 آلات CI
cargo nextest run --partition count:1/4 # على العداء 1
cargo nextest run --partition count:2/4 # على العداء 2
| النمط | ينقسم بـ |
|---|
count:N/M | الجولة الروبن حسب عدد الاختبار |
hash:N/M | تجزئة مستقرة (نفس الاختبار → نفس الجزء) |
الإخراج والإبلاغ
| الخيار | التأثير |
|---|
--status-level all | اعرض حالة كل اختبار |
--failure-output immediate | اطبع الفشل كما يحدث |
--message-format libtest-json | إخراج قابل للآلة |
--profile ci | استخدم إعدادات مضبوطة CI |
| مخرجات JUnit | تكوين في nextest.toml لتقارير CI |
القيود
| غير مدعوم | لماذا |
|---|
| Doctests | تشغيل منفصل مع cargo test --doc |
#[bench] | استخدم criterion بدلاً من ذلك |
| بعض أعلام libtest | دلالات عداء مختلفة |
نمط CI الشائع هو cargo nextest run && cargo test --doc.
nextest مقابل cargo test
| الجانب | cargo nextest | cargo test |
|---|
| نموذج العملية | واحد لكل اختبار | واحد لكل ملف ثنائي |
| العزلة | قوية | مشتركة في ملف ثنائي |
| السرعة | 2–3 مرات أسرع عادة | الخط الأساسي |
| كشف Flaky | مدمج | لا أحد |
| تجزئة CI | مدمج | يدوي |
| Doctests | لا | نعم |
الموارد