اختبارات Rust: الوحدة، التكامل، E2E — دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في الاختبار في 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، غالبًا ما تُستخدم لهذا الغرض

المدونات

توصيات الكتب