البرمجة

التحكم في تنفيذ اختبارات رست

التحكم بتنفيذ الاختبارات في لغة رست Rust

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


مقدمة عن نظام الاختبارات في رست

تأتي لغة رست مزودة بإطار عمل لاختبارات الوحدة (unit testing) مدمج داخل بيئة التطوير الخاصة بها. هذا الإطار يسمح بكتابة دوال خاصة بالاختبارات داخل نفس ملفات الكود المصدر أو في ملفات منفصلة. يستخدم مطورو رست الأمر cargo test لتشغيل هذه الاختبارات، حيث يقوم الأمر بتحليل الكود، تجميعه مع تفعيل وضع الاختبار، ثم تنفيذ جميع الدوال الموسومة بعلامة #[test].

تقدم رست ميزات كثيرة للتحكم في طريقة تنفيذ الاختبارات مثل: اختيار اختبارات محددة فقط للتشغيل، التحكم في ترتيب التنفيذ، التعامل مع الاختبارات التي تفشل، الاختبارات المتزامنة، تشغيل اختبارات “مهمة” فقط، وأدوات متقدمة مثل اختبارات الخصائص (property testing).


تنظيم الاختبارات في رست

يمكن كتابة الاختبارات في رست داخل وحدة اختبار (module) محددة عادةً في نهاية ملفات الكود المصدر باستخدام:

rust
#[cfg(test)] mod tests { use super::*; #[test] fn example_test() { assert_eq!(2 + 2, 4); } }
  • الوسم #[cfg(test)] يضمن تضمين الوحدة البرمجية الخاصة بالاختبارات فقط عند تشغيل الأمر cargo test وليس في بناء البرنامج العادي.

  • هذا يعزل كود الاختبارات عن الكود التنفيذي الرئيسي.

تنظيم الاختبارات بهذه الطريقة يسهل التحكم في تنفيذها، حيث يمكن استدعاء وحدات اختبار معينة فقط عبر أدوات البناء.


تشغيل اختبارات محددة فقط

أحد أهم عناصر التحكم هو القدرة على تنفيذ اختبارات محددة دون الحاجة لتشغيل جميع الاختبارات، خصوصًا عندما يكون المشروع كبيرًا.

يمكن تنفيذ اختبار محدد عبر:

bash
cargo test اسم_الاختبار

مثال:

bash
cargo test example_test

هذا الأمر يقوم بتشغيل جميع الاختبارات التي تحتوي أسماؤها على النص example_test، مما يسمح للمطورين باختبار جزء محدد من الكود بشكل سريع.


التحكم في تشغيل الاختبارات باستخدام السمات Attributes

1. الوسم #[ignore]

عند وجود اختبارات لا يرغب المطور في تشغيلها بشكل افتراضي (مثل اختبارات بطيئة أو تعتمد على شبكة الإنترنت)، يمكن استخدام:

rust
#[test] #[ignore] fn slow_test() { // كود الاختبار البطيء }

عند تشغيل cargo test بدون أي معاملات إضافية، يتم تجاهل هذا الاختبار. يمكن تشغيلها صراحة عبر:

bash
cargo test -- --ignored

هذا التحكم يسمح بمرونة كبيرة في تقسيم الاختبارات إلى اختبارات “عادية” وأخرى “مهملة” يتم تشغيلها حسب الحاجة.

2. الوسم #[should_panic]

هذا الوسم يستخدم للتحقق من أن كود معين يتسبب في وقوع خطأ أو “panic”، ويتم اختبار سلوك الخطأ المتوقع. مثال:

rust
#[test] #[should_panic(expected = "division by zero")] fn test_divide_by_zero() { let _ = 1 / 0; }

بهذا يمكن التحكم في التحقق من السلوك غير الطبيعي للكود.


التحكم في التوازي والتنفيذ المتزامن للاختبارات

بشكل افتراضي، يقوم cargo test بتشغيل الاختبارات بشكل متزامن (متوازٍ) للاستفادة من تعدد أنوية المعالج، مما يسرّع عملية الاختبار. لكن في بعض الحالات قد يرغب المطور في التحكم في هذا السلوك، خاصة إذا كانت هناك اختبارات تعتمد على حالة مشتركة أو تتداخل مع بعضها.

تعطيل التوازي:

يمكن تعطيل التنفيذ المتزامن للاختبارات عبر:

bash
cargo test -- --test-threads=1

هذا يجبر cargo test على تشغيل الاختبارات واحدة تلو الأخرى (متسلسل).

زيادة عدد الخيوط:

لزيادة عدد خيوط التنفيذ وزيادة سرعة التشغيل:

bash
cargo test -- --test-threads=8

هذا يسمح بتشغيل 8 اختبارات في آن واحد.


التحكم في إخراج نتائج الاختبارات

بشكل افتراضي، يعرض cargo test فقط نتائج الاختبارات التي فشلت، أما نجاح الاختبارات فلا يظهر تفاصيلها لتقليل التشويش في الإخراج. لكن يمكن التحكم في عرض نتائج كل اختبار عبر:

bash
cargo test -- --nocapture

هذا الأمر يعرض كل مخرجات طباعة (println!) من جميع الاختبارات، مما يفيد في تتبع مشاكل أو عرض معلومات مفصلة.


تنظيم الاختبارات في ملفات منفصلة

يستطيع المطورون في رست تنظيم اختبارات التكامل (integration tests) في مجلد منفصل tests/ بجانب مجلد src/. كل ملف داخل tests/ يمثل وحدة اختبار مستقلة يتم تجميعها وتشغيلها عند استخدام cargo test.

هذا التنظيم يسمح بفصل اختبارات الوحدة الخاصة بكل ملف عن اختبارات التكامل التي تختبر النظام ككل.


التحكم في تنفيذ الاختبارات في المشاريع الكبيرة

في المشاريع الكبيرة، قد تحتوي قاعدة الكود على آلاف الاختبارات، ولذلك يوفر رست عدة أدوات للتحكم المتقدم في تنفيذ هذه الاختبارات:

1. التجميع الشرطي (Conditional Compilation)

يمكن استخدام السمات #[cfg(feature = "feature_name")] لتمكين أو تعطيل اختبارات معينة بناءً على ميزات معينة يتم تفعيلها عند بناء المشروع.

مثال:

rust
#[cfg(feature = "slow_tests")] #[test] fn slow_test() { // اختبار بطيء يتم تشغيله فقط عند تفعيل الميزة }

تشغيل الاختبارات مع تفعيل هذه الميزة:

bash
cargo test --features slow_tests

2. استخدام بيئة المتغيرات (Environment Variables)

يمكن تمرير متغيرات بيئية لتغيير سلوك الاختبارات أو تضمين اختبارات محددة حسب ظروف معينة.


الاختبارات المخصصة (Custom Test Frameworks)

مع التقدم في إصدارات رست، بدأ دعم الإطارات الاختبارية المخصصة عبر استخدام سمات #[test_case] أو أطر اختبار مثل proptest التي تسمح بإنشاء اختبارات متقدمة تعتمد على توليد بيانات عشوائية للتحقق من صحة الخصائص العامة للكود.

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


الجدول التالي يلخص أهم أوامر التحكم في تنفيذ الاختبارات في رست:

الأمر الوظيفة
cargo test تشغيل جميع الاختبارات
cargo test تشغيل اختبار أو اختبارات تحتوي على الاسم المحدد
cargo test -- --ignored تشغيل الاختبارات الموسومة بـ #[ignore]
cargo test -- --test-threads=1 تعطيل التنفيذ المتزامن (تشغيل الاختبارات واحداً تلو الآخر)
cargo test -- --nocapture عرض مخرجات الطباعة لكل الاختبارات
cargo test --features تشغيل الاختبارات مع تفعيل ميزات معينة

الخلاصة

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

هذا التحكم المتنوع يعزز من قابلية الصيانة والتطوير المستقبلي للبرمجيات، مما يجعل رست خيارًا ممتازًا للمشاريع التي تتطلب دقة عالية وموثوقية في الأداء مع ضمان اختبار شامل قبل النشر.


المصادر والمراجع