تخطَّ إلى المحتوى

cargo-nextest - عداء الاختبار الصدئ من الجيل التالي

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 nextestcargo test
نموذج العمليةواحد لكل اختبارواحد لكل ملف ثنائي
العزلةقويةمشتركة في ملف ثنائي
السرعة2–3 مرات أسرع عادةالخط الأساسي
كشف Flakyمدمجلا أحد
تجزئة CIمدمجيدوي
Doctestsلانعم

الموارد