مقدمة في الاختبار في Rust
Rust هي لغة برمجة أنظمة تشتهر بأمانها وأدائها. ومع ذلك، حتى أكثر الأكواد موثوقية تحتاج إلى التحقق. الاختبار في Rust ليس مجرد خيار، بل هو جزء لا يتجزأ من عملية التطوير. بفضل الدعم المدمج للاختبارات في Cargo، يمكنك بسهولة كتابة وتشغيل اختبارات unit و integration و e2e. في هذه المقالة، سنشرح جميع المستويات الثلاثة للاختبار بأمثلة عملية.
اختبارات Unit في Rust: أساس الموثوقية
اختبارات Unit (الاختبارات الوحدوية) تتحقق من الوظائف والطرق الفردية في عزلة. في Rust، من المعتاد وضعها مباشرة في ملف الكود، في وحدة خاصة tests.
هيكل اختبار unit
كل اختبار unit هو دالة مُعلَّمة بالسمة #[test]. بداخلها، تستخدم الماكرو assert! و assert_eq! و assert_ne! للتحقق من النتائج.
// src/math.rspub fn add(a: i32, b: i32) -> i32 { a + b}
pub fn divide(a: f64, b: f64) -> Result<f64, String> { if b == 0.0 { Err(String::from("القسمة على صفر")) } else { Ok(a / b) }}
#[cfg(test)]mod tests { use super::*;
#[test] fn test_add() { assert_eq!(add(2, 3), 5); }
#[test] fn test_divide_success() { let result = divide(10.0, 2.0); assert!(result.is_ok()); assert_eq!(result.unwrap(), 5.0); }
#[test] fn test_divide_by_zero() { let result = divide(10.0, 0.0); assert!(result.is_err()); assert_eq!(result.unwrap_err(), "القسمة على صفر"); }}لاحظ السمة #[cfg(test)]. إنها تخبر المترجم بتضمين هذه الوحدة فقط عند بناء الاختبارات. هذا يوفر وقت بناء الملف الثنائي النهائي.
تشغيل اختبارات unit
لتشغيل جميع الاختبارات في المشروع، استخدم الأمر:
cargo testيمكنك أيضًا تشغيل اختبار معين بالاسم:
cargo test test_addأو تصفية الاختبارات بكلمة مفتاحية:
cargo test divideاختبارات التكامل في Rust: التحقق من التفاعل
اختبارات التكامل تتحقق من كيفية عمل الوحدات المختلفة لتطبيقك معًا. على عكس اختبارات unit، فهي موجودة في مجلد منفصل tests/ على مستوى جذر المشروع.
هيكل اختبار التكامل
أنشئ ملف tests/integration_test.rs:
// tests/integration_test.rsuse my_project::math; // نفترض أن المكتبة تسمى my_project
#[test]fn test_add_and_divide() { let sum = math::add(10, 5); let result = math::divide(sum as f64, 3.0).unwrap(); assert_eq!(result, 5.0);}
#[test]fn test_complex_calculation() { let a = math::add(100, 200); let b = math::add(50, 50); let result = math::divide(a as f64, b as f64).unwrap(); assert_eq!(result, 3.0);}كل ملف في tests/ يتم تجميعه كـ crate منفصل. هذا يعني أنه يمكنك الحصول على عدة ملفات مع اختبارات لسيناريوهات مختلفة.
وحدة مشتركة لاختبارات التكامل
إذا كنت بحاجة إلى أدوات مساعدة مشتركة لجميع اختبارات التكامل، أنشئ مجلدًا فرعيًا tests/common/ مع ملف mod.rs:
// tests/common/mod.rspub fn setup() { // تهيئة بيئة الاختبار println!("جاري إعداد بيئة الاختبار...");}واستخدمه في الاختبارات:
// tests/integration_test.rsmod common;
#[test]fn test_with_setup() { common::setup(); // اختبارك}اختبارات E2E في Rust: الغمر الكامل
اختبارات E2E (end-to-end) تتحقق من عمل التطبيق بأكمله من البداية إلى النهاية. في Rust، غالبًا ما تُستخدم لهذا الغرض