اختبار في Rust: الأطر والأدوات
Rust هي لغة برمجة أنظمة تولي اهتمامًا كبيرًا بالموثوقية والأمان. نظام الاختبار المدمج هو إحدى الميزات الرئيسية التي تتيح كتابة كود عالي الجودة دون الحاجة إلى تثبيت أطر خارجية. في هذه المقالة، سنستعرض بالتفصيل الأدوات الرئيسية للاختبار في Rust: من اختبارات الوحدات البسيطة إلى الاختبارات المعقدة القائمة على الخصائص ومعايير الأداء.
إطار الاختبار المدمج
في Rust، يتم تشغيل الاختبارات باستخدام الأمر cargo test. الاختبارات هي دوال عادية مُعلّمة بالسمة #[test]. يقوم الإطار تلقائيًا بجمع كل هذه الدوال في مشروعك وتشغيلها.
اختبارات الوحدات
عادةً ما توجد اختبارات الوحدات في نفس ملف الكود المختبر، داخل وحدة منفصلة tests. وهذا يسمح باختبار الدوال الخاصة.
// src/lib.rspub fn add(a: i32, b: i32) -> i32 { a + b}
fn private_helper(x: i32) -> i32 { x * 2}
#[cfg(test)]mod tests { use super::*;
#[test] fn test_add() { assert_eq!(add(2, 3), 5); }
#[test] fn test_private_helper() { assert_eq!(private_helper(5), 10); }}التشغيل: cargo test
اختبارات التكامل
توجد اختبارات التكامل في دليل tests/ على مستوى جذر المشروع. كل ملف في هذا المجلد هو crate منفصل يختبر واجهة برمجة التطبيقات العامة الخاصة بك.
// tests/integration_test.rsuse my_crate::add;
#[test]fn test_add_integration() { assert_eq!(add(10, 20), 30);}وحدات الماكرو للتحقق
توفر Rust العديد من وحدات الماكرو المدمجة لكتابة عمليات التحقق:
assert!(expression)— يحدث ذعرًا إذا كان التعبير خاطئًا.assert_eq!(left, right)— يتحقق من المساواة باستخدامPartialEq.assert_ne!(left, right)— يتحقق من عدم المساواة.debug_assert!()— يعمل فقط في بنيات التصحيح (debug builds).
#[test]fn test_with_assert() { let result = some_function(); assert!(result.is_ok(), "كان متوقعًا Ok، تم الحصول على: {:?}", result); assert_eq!(result.unwrap(), 42);}Doctests
واحدة من أقوى ميزات Rust هي إمكانية كتابة اختبارات مباشرة في التوثيق. يتم تجميع الكود داخل كتل /// أو //! وتشغيله تلقائيًا كاختبار.
/// يجمع رقمين.////// # أمثلة////// ```/// use my_crate::add;/// assert_eq!(add(1, 2), 3);/// ```pub fn add(a: i32, b: i32) -> i32 { a + b}التشغيل: cargo test — سيتم تنفيذ doctests مع الاختبارات العادية.
الاختبار القائم على الخصائص باستخدام proptest
مكتبة proptest (مشابهة لـ Hypothesis في Python أو QuickCheck في Haskell) تتيح توليد بيانات إدخال عشوائية والتحقق من الثوابت.
use proptest::prelude::*;
fn reverse_string(s: &str) -> String { s.chars().rev().collect()}
proptest! { #[test] fn test_reverse_twice(s in ".*") { let reversed = reverse_string(&s); let double_reversed = reverse_string(&reversed); assert_eq!(s, double_reversed); }}التثبيت: cargo add proptest
معايير الأداء (بينشمارك)
لقياس الأداء في Rust، هناك معايير أداء مستقرة (بدءًا من Rust 1.78) عبر cargo bench و crate criterion للسيناريوهات الأكثر تعقيدًا.
معايير الأداء المدمجة (nightly)
#![feature(test)]extern crate test;
#[bench]fn bench_add(b: &mut test::Bencher) { b.iter(|| add(1, 2));}معايير الأداء باستخدام criterion
أيضاً في المكتبة
توصيات