Bash / المتوسط: بيانات ومسارات فشل موثوقة / الدرس 12
جعل البرامج قابلة للمراجعة والاختبار
ابن حد واجهة صغيراً وافصل التحويل عن الآثار وتحقق من النجاح والفشل بحاضنة معزولة.
في هذه الصفحة
أهداف الدرس
- تحديد عقود الإدخال والخرج والخطأ والاعتماد.
- تمييز فحص القواعد من السلوك.
- اختبار المخرجات والحالات دون عمليات حقيقية.
للبرنامج القابل للصيانة واجهة عامة ضيقة
حدد الوسائط والإدخال والخرج والحالات والأدوات. افصل التشخيص عن الآلي وتحقق عند الدخول ومرر المطبع. اختبر تحويل النص دون خارج واجعل الآثار بحد. لا تقرأ إعداداً شخصياً أو ملف الحالية خفية. ابدأ الحاضنة ببيئة معلنة كي لا تغير الأسماء والخيارات والمحلية وخطافات البدء النتيجة.
صحة القواعد لازمة لا كافية
يفحص bash -n القواعد دون التنفيذ العادي ويكشف أخطاء كثيرة لا المتغير والأنبوب والبيانات. يضيف التحليل الساكن الموثوق تحذيرات تحتاج تفسيراً وإصداراً، ولا تثبت أدوات عشوائية للمثال. تختبر السلوك بمدخل مصطنع واعتماد مضبوط مع المشوه والفشل الموثق.
التحقق من الخرج والحالة منفصلين
احفظ حالة العملية قبل رسائل التحقق وقارن الخرج. ينجح اختبار الفشل المتوقع عند تحقق العقد. يحذف الاستبدال الأسطر النهائية فقد تحتاج ملفات للمقارنة البايتية. افصل الخطأ وليعد فشل الحاضنة غير صفر؛ لا تكفي FAIL مع صفر. استخدم المحدود ولا تستدع إدارياً حقيقياً عرضاً.
normalize() {
case $1 in
draft) printf 'DRAFT\n' ;;
ready) printf 'READY\n' ;;
*) return 2 ;;
esac
}
actual=$(normalize draft)
status=$?
if [[ $status == 0 && $actual == DRAFT ]]; then
printf 'PASS valid mode\n'
else
exit 1
fi
if normalize unknown; then
exit 1
else
status=$?
[[ $status == 2 ]] || exit 1
printf 'PASS rejected mode\n'
fi
PASS valid mode
PASS rejected mode
ينجح فقط بصحة الخرج والحالة المرفوضة ولا ينفذ المساعد ملفات أو خدمات.
تحفظ المثبتات الخاصة قابلية التكرار
استخدم مجلداً مؤقتاً جديداً لا مسار مضيف ثابتاً ومحتوى صغيراً مصطنعاً. سجل الملكية ونظف بعمر الحاضنة لا مسار خارجي غير محقق. يمكن بديل صريح لدالة أو أمر يحفظ العقد. لا يتحقق بديل ناجح دائماً من الفشل والرجوع. قارن السلوك عند الواجهة.
اختيار حالات تحمي حدوداً حقيقية
تشمل الحالات الفارغ والمسافات والنجمة والمنتج الجزئي والسجل غير المنتهي ودالة الشرط. اختبر الإصدارات المدعومة لا افتراض أحدث دليل. لا تثبت التنسيق العرضي إلا بالعقد. ركز القرار والقيم والحالات. يختبر المثال حدود الوسائط لا أسماء داخلية.
accept_two() {
[[ $# == 2 && $1 == 'red apple' && -z $2 ]]
}
args=('red apple' '')
if accept_two "${args[@]}"; then
printf 'PASS argument boundaries\n'
else
printf 'FAIL argument boundaries\n'
exit 1
fi
PASS argument boundaries
تتحقق الدالة من اثنين بما فيه الفارغ ويكسر الجمع أو غير المقتبس العقد.
الأخطاء الشائعة وإصلاحها
اعتبار bash -n اختباراً كاملاً
- لماذا يحدث؟
- اختلط التحليل بالسلوك.
- كيف تصلحه؟
- أضف حالات نجاح وفشل للعقد.
- كيف تتجنب تكراره؟
- أبلغ الفحصين منفصلين.
طباعة FAIL مع صفر
- لماذا يحدث؟
- لم تنقل الحاضنة فشل التحقق.
- كيف تصلحه؟
- أعد غير صفر لكل فشل.
- كيف تتجنب تكراره؟
- اختبر الحاضنة بتحقق فاشل مقصود.
تجاوز البديل عقد الفشل
- لماذا يحدث؟
- ينجح البديل دائماً.
- كيف تصلحه؟
- قدم فشلاً وخرجاً جزئياً مضبوطين.
- كيف تتجنب تكراره؟
- مثل الواجهة المعنية بدقة.
اختبر فهمك
1. لماذا لا يكفي النص الملتقط لاختبار الأسطر النهائية؟
اعرض الحل المشروح
يحذف الاستبدال الأسطر النهائية. استخدم ملفات مضبوطة أو واجهة تحفظ البايتات إذا كانت بالعقد وافصل الحالة.
2. يتعلق تراجع بتمرير مصفوفة دون اقتباس. ما التحقق؟
اعرض الحل المشروح
ليتحقق المتلقي من العدد والقيم لعنصر متباعد وفارغ. يفشل فقد الحدود مستقلاً عن أسماء وترتيب الداخل.
أهم ما تعلمته
- اختبر السلوك والحالات بمثبتات معزولة.
- احم العقود والإصدارات المدعومة.