اختبار في Rust: الأطر والأدوات

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

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

ابدأ الدورة

اختبار في Rust: الأطر والأدوات



Rust هي لغة برمجة أنظمة تولي اهتمامًا كبيرًا بالموثوقية وأمان الكود. يتيح نظام الاختبار المدمج للمطورين كتابة اختبارات الوحدات واختبارات التكامل واختبارات التوثيق دون الحاجة إلى تثبيت مكتبات إضافية. ومع ذلك، بالنسبة للسيناريوهات المعقدة - مثل تحديد المعاملات، أو توليد بيانات عشوائية، أو إنشاء كائنات وهمية (mocking) - أنشأ مجتمع Rust أطر عمل قوية. في هذه المقالة، سنستعرض الأدوات الرئيسية للاختبار في Rust.



الوحدة المدمجة test



تأتي Rust مع وحدة مدمجة test يتم تفعيلها عبر الخاصية #[test]. لتشغيل الاختبارات، يُستخدم الأمر cargo test. مثال على اختبار وحدة بسيط:



// src/lib.rspub fn add(a: i32, b: i32) -> i32 {    a + b}

#[cfg(test)]mod tests { use super::*;

#[test] fn test_add() { assert_eq!(add(2, 2), 4); }

#[test] fn test_add_negative() { assert_eq!(add(-1, 1), 0); }}


الإمكانيات الرئيسية للوحدة المدمجة:

  • الخصائص: #[test]، #[ignore]، #[should_panic].
  • ماكروات التأكيد: assert!، assert_eq!، assert_ne!.
  • اختبارات التكامل: توضع في مجلد tests/ وتختبر واجهة برمجة التطبيقات العامة (public API).
  • اختبارات التوثيق: أمثلة الكود في تعليقات التوثيق (doc-comments) التي يتم التحقق منها عبر cargo test.


بالنسبة لمعظم المشاريع، هذا يكفي. ولكن عندما تكون هناك حاجة إلى تحديد المعاملات، أو توليد بيانات عشوائية، أو إنشاء كائنات وهمية، تأتي الأطر المتخصصة للمساعدة.



إطار العمل rstest — اختبارات ذات معاملات



توفر المكتبة rstest آلية قوية لتحديد معاملات الاختبارات، مماثلة لـ pytest في Python. تتيح تحديد مجموعات متعددة من بيانات الإدخال والنتائج المتوقعة دون تكرار الكود.



التثبيت:

[dev-dependencies]rstest = "0.22"


مثال على اختبار ذي معاملات:



use rstest::rstest;

#[rstest]#[case(1, 2, 3)]#[case(0, 0, 0)]#[case(-1, 1, 0)]fn test_add(#[case] a: i32, #[case] b: i32, #[case] expected: i32) { assert_eq!(add(a, b), expected);}


إمكانيات rstest:

  • تحديد المعاملات عبر #[case].
  • توليد بيانات عشوائية عبر #[random].
  • إعدادات سياقية (fixtures) عبر #[fixture].
  • دعم الاختبارات غير المتزامنة.


هذا الإطار مفيد بشكل خاص عند اختبار الدوال الرياضية، أو المحللات (parsers)، أو الخوارزميات التي تتطلب التحقق من العديد من الحالات الحدودية.



الاختبار القائم على الخصائص مع proptest



الاختبار القائم على الخصائص (Property-based testing) هو أسلوب تصف فيه الثوابت (الخصائص) التي يجب أن تتحقق لجميع بيانات الإدخال الممكنة. تقوم مكتبة proptest بتوليد بيانات إدخال عشوائية والتحقق من هذه الخصائص.



التثبيت:

[dev-dependencies]proptest = "1.5"


مثال: التحقق من أن عملية الفرز تحافظ على الطول وجميع العناصر:



use proptest::prelude::*;

proptest! { #[test] fn test_sort_keeps_elements(mut vec: Vec<i32>) { let original_len = vec.len(); let mut sorted = vec.clone(); sorted.sort(); assert_eq!(sorted.len(), original_len); for item in &vec { assert!(sorted.contains(item)); } }}


مزايا proptest:

  • توليد تلقائي لآلاف السيناريوهات العشوائية.
  • التصغير (shrink) — عند فشل الاختبار، يتم تقليل بيانات الإدخال إلى أصغر حالة تسبب الفشل.

توصيات