لماذا اختبار Rust ليس مخيفًا بل ممتعًا؟
\n\nعندما تبدأ في تعلم Rust، قد تشعر أن المترجم (Compiler) يقوم بكل العمل الشاق نيابةً عنك. فهو يتحقق من الذاكرة، يراقب الاقتراض (borrowing)، ويمنعك من ارتكاب الأخطاء. لكن حتى أقسى مترجم لا يستطيع التحقق من منطق البرنامج. وهنا يأتي دور الاختبارات.
\n\nكثير من المبتدئين يخافون من الاختبارات. يعتقدون أنها مضيعة للوقت وتتطلب كتابة كود ممل. لكن في الحقيقة، الاختبارات هي شبكة الأمان الخاصة بك. فهي تساعدك على اكتشاف الأخطاء بسرعة، وإعادة هيكلة الكود بثقة، والنوم براحة بعد إطلاق التطبيق.
\n\nفي هذا المقال، سنشرح من أين تبدأ اختبار Rust إذا كنت مبتدئًا. لا نظرية زائدة — فقط تطبيق عملي، أمثلة حية، ونصائح مفيدة للمشاريع الحقيقية.
\n\nماذا تحتاج قبل البدء؟
\n\nقبل كتابة الاختبارات، تأكد من تثبيت Rust. إذا لم يكن مثبتًا، افتح الطرفية (Terminal) ونفّذ:
\n\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n\nكل ما نحتاجه موجود بالفعل في النظام البيئي لـ Rust. لا حاجة لتثبيت أطر عمل إضافية. يوفر Rust مشغل اختبارات مدمجًا قويًا يمكن تشغيله بأمر واحد.
\n\nلننشئ مشروعًا جديدًا للتجربة:
\n\ncargo new rust_test_guide\ncd rust_test_guide\n\nممتاز! الآن لدينا مشروع نظيف سنتعلم فيه كتابة الاختبارات.
\n\nالاختبار الأول: فهم الأساسيات بمثال
\n\nافتح ملف src/lib.rs. افتراضيًا، هو فارغ، لكننا سنضيف إليه دالة بسيطة واختبارًا لها.
لنكتب دالة تتحقق مما إذا كان الرقم زوجيًا:
\n\npub fn is_even(num: i32) -> bool {\n num % 2 == 0\n}\n\n#[cfg(test)]\nmod tests {\n use super::*;\n\n #[test]\n fn test_is_even() {\n assert_eq!(is_even(4), true);\n assert_eq!(is_even(7), false);\n }\n}\n\nلنحلل الكود جزءًا جزءًا:
\n\n- \n
#[cfg(test)]— هذا الوسم يخبر المترجم: "قم بتجميع هذه الوحدة فقط عند تشغيل الاختبارات". لن يتم تضمينها في البناء النهائي. \n mod tests— ننشئ وحدة للاختبارات. هذه ممارسة قياسية. \n use super::*;— نستورد كل ما هو مُعلن أعلاه، لنتمكن من رؤية الدالةis_even. \n #[test]— علامة تحول الدالة العادية إلى اختبار. \n assert_eq!— ماكرو يتحقق من تساوي قيمتين. إذا لم تكونا متساويتين، يفشل الاختبار. \n
شغّل الاختبار بالأمر:
\n\ncargo test\n\nإذا تم كل شيء بشكل صحيح، سترى مخرجات خضراء:
\n\nrunning 1 test\ntest tests::test_is_even ... ok\n\ntest result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out\n\nأهنئك، لقد كتبت أول اختبار لك في Rust! الآن دعنا نفهم كيفية كتابة تحققات أكثر فائدة.
\n\nالماكروهات الأساسية للاختبار
\n\nفي الاختبارات، ستستخدم باستمرار ثلاثة ماكروهات. احفظها:
\n\n- \n
assert!(expression)— يتحقق من أن التعبير صحيح. إذا كان خاطئًا، يفشل الاختبار. \n assert_eq!(left, right)— يتحقق من تساوي قيمتين. مفيد لمقارنة النتائج. \n assert_ne!(left, right)— يتحقق من أن القيمتين غير متساويتين. \n
مثال على استخدام الماكروهات الثلاثة:
\n\npub fn add_two(x: i32) -> i32 {\n x + 2\n}\n\n#[cfg(test)]\nmod tests {\n use super::*;\n\n #[test]\n fn test_add_two() {\n assert!(add_two(3) == 5);\n assert_eq!(add_two(0), 2);\n assert_ne!(add_two(10), 13);\n }\n}\n\nلاحظ أن assert! يقبل تعبيرًا منطقيًا (boolean)، بينما