تعلم لغة Python الفصل 11 : اختبار الكود الخاص بك الجزء 2 والأخير

sparrow
0

 



 



الفصل : 11 والأخير

الجزء : 2 والأخير

العنوان : اختبار الكود الخاص بك




اختبار فئة


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


مجموعة متنوعة من التأكيدات


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


هذه مجرد أمثلة قليلة؛ أي شيء يمكن التعبير عنه كبيان شرطي يمكن تضمينه في اختبار.


فئة لاختبارها


اختبار فئة مشابه لاختبار دالة، لأن الكثير من العمل يتضمن اختبار سلوك الدوال في الفئة. ومع ذلك، هناك بعض الاختلافات، لذا دعونا نكتب فئة للاختبار. ضع في اعتبارك فئة تساعد في إدارة الاستبيانات المجهولة:



تبدأ هذه الفئة بسؤال استبيان تقدمه أنت ❶ وتشمل قائمة فارغة لتخزين الإجابات. تحتوي الفئة على دوال لطباعة سؤال الاستبيان ❷، وإضافة إجابة جديدة إلى قائمة الإجابات ❸، وطباعة جميع الإجابات المخزنة في القائمة ❹. لإنشاء مثيل من هذه الفئة، كل ما عليك تقديمه هو سؤال. بمجرد أن يكون لديك مثيل يمثل استبيان معين، يمكنك عرض سؤال الاستبيان باستخدام `show_question()`, وتخزين إجابة باستخدام `store_response()`, وعرض النتائج باستخدام `show_results()`.


لإظهار أن فئة `AnonymousSurvey` تعمل، دعونا نكتب برنامجًا يستخدم الفئة:


هذا البرنامج يحدد سؤالاً ("What language did you first learn to speak?") وينشئ كائن `AnonymousSurvey` بهذا السؤال. يستدعي البرنامج `show_question()` لعرض السؤال ثم يطلب الإجابات. يتم تخزين كل إجابة عند استقبالها. عندما يتم إدخال جميع الإجابات (يُدخل المستخدم q للخروج)، يقوم `show_results()` بطباعة نتائج الاستبيان:


تعمل هذه الفئة لاستبيان مجهول بسيط، ولكن لنقل أننا نريد تحسين `AnonymousSurvey` والوحدة التي هي فيها، `survey`. يمكننا السماح لكل مستخدم بإدخال أكثر من إجابة، يمكننا كتابة دالة لتعداد الإجابات الفريدة فقط وتقرير عدد المرات التي تم تقديم كل إجابة فيها، أو يمكننا حتى كتابة فئة أخرى لإدارة الاستبيانات غير المجهولة.


تنفيذ هذه التغييرات يمكن أن يعرض السلوك الحالي لفئة `AnonymousSurvey` للخطر. على سبيل المثال، من الممكن أثناء محاولة السماح لكل مستخدم بإدخال إجابات متعددة أن نغير بالخطأ كيفية التعامل مع الإجابات الفردية. للتأكد من أننا لا نكسر السلوك الحالي أثناء تطوير هذه الوحدة، يمكننا كتابة اختبارات للفئة.


اختبار فئة AnonymousSurvey


لنكتب اختبارًا للتحقق من جانب واحد من طريقة عمل `AnonymousSurvey`. سنكتب اختبارًا للتحقق من أن إجابة واحدة لسؤال الاستبيان يتم تخزينها بشكل صحيح:



نبدأ باستيراد الفئة التي نريد اختبارها، `AnonymousSurvey`. الدالة الاختبارية الأولى ستتحقق من أنه عندما نخزن إجابة على سؤال الاستبيان، ستنتهي الإجابة في قائمة الإجابات الخاصة بالاستبيان. اسم وصفي جيد لهذه الدالة هو `test_store_single_response()` ❶. إذا فشل هذا الاختبار، سنعرف من اسم الدالة في ملخص الاختبار أن هناك مشكلة في تخزين إجابة واحدة للاستبيان.


لاختبار سلوك الفئة، نحتاج إلى إنشاء مثيل من الفئة. نخلق مثيلاً يسمى `language_survey` ❷ مع السؤال "What language did you first learn to speak?" نخزن إجابة واحدة، `English`, باستخدام الدالة `store_response()`. ثم نتحقق من أن الإجابة تم تخزينها بشكل صحيح من خلال التأكيد على أن `English` موجودة في قائمة `language_survey.responses` ❸.


بشكل افتراضي، تشغيل الأمر `pytest` بدون أي معطيات سيشغل جميع الاختبارات التي يكتشفها `pytest` في الدليل الحالي. للتركيز على الاختبارات في ملف واحد، مرر اسم الملف الاختباري الذي تريد تشغيله. هنا سنشغل فقط الاختبار الذي كتبناه لـ `AnonymousSurvey`:


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



نسمي الدالة الجديدة `test_store_three_responses()`. ننشئ كائن استبيان تمامًا كما فعلنا في `test_store_single_response()`. نحدد قائمة تحتوي على ثلاث إجابات مختلفة ❶، ثم نستدعي `store_response()` لكل من هذه الإجابات. بمجرد تخزين الإجابات، نكتب حلقة أخرى ونتأكد من أن كل إجابة الآن في قائمة `language_survey.responses` ❷.


عند تشغيل ملف الاختبار مرة أخرى، تمر جميع الاختبارات (لإجابة واحدة ولثلاث إجابات):


هذا يعمل بشكل مثالي. ومع ذلك، هذه الاختبارات مكررة بعض الشيء، لذا سنستخدم ميزة أخرى في `pytest` لجعلها أكثر كفاءة.


استخدام Fixtures


في `test_survey.py`, أنشأنا مثيلًا جديدًا من `AnonymousSurvey` في كل دالة اختبار. هذا جيد في المثال القصير الذي نعمل عليه، ولكن في مشروع واقعي يحتوي على عشرات أو مئات الاختبارات، سيكون ذلك مشكلة. في الاختبار، يساعد الـfixture في إعداد بيئة الاختبار. غالبًا، هذا يعني إنشاء مورد يُستخدم بواسطة أكثر من اختبار واحد. ننشئ fixture في `pytest` عن طريق كتابة دالة مع المزخرف `@pytest.fixture`. المزخرف هو توجيه يوضع قبل تعريف الدالة؛ يقوم Python بتطبيق هذا التوجيه على الدالة قبل تشغيلها، لتعديل كيفية عمل كود الدالة. لا تقلق إذا كان هذا يبدو معقدًا؛ يمكنك البدء في استخدام المزخرفات من الحزم الخارجية قبل تعلم كيفية كتابتها بنفسك.


لنستخدم fixture لإنشاء مثيل استبيان واحد يمكن استخدامه في كلا دالتي الاختبار في `test_survey.py`:


نحتاج إلى استيراد `pytest` الآن، لأننا نستخدم مزخرفًا معرفًا في `pytest`. نطبق المزخرف `@pytest.fixture` ❶ على الدالة الجديدة `language_survey()` ❷. هذه الدالة تبني كائن `AnonymousSurvey` وتعيد الاستبيان الجديد.


لاحظ أن تعريفات كلا دالتي الاختبار قد تغيرت ❸ ❺؛ تحتوي كل دالة اختبار الآن على معلمة تسمى `language_survey`. عندما تتطابق معلمة في دالة اختبار مع اسم دالة تحتوي على المزخرف `@pytest.fixture`, سيتم تشغيل الـfixture تلقائيًا وسيتم تمرير القيمة المرجعة إلى دالة الاختبار. في هذا المثال، تقوم الدالة `language_survey()` بتزويد كلا من `test_store_single_response()` و`test_store_three_responses()` بمثيل `language_survey`.


لا يوجد كود جديد في أي من دالتي الاختبار، ولكن لاحظ أنه تم إزالة سطرين من كل دالة ❹ ❻: السطر الذي يحدد سؤالًا والسطر الذي ينشئ كائن `AnonymousSurvey`.


عند تشغيل ملف الاختبار مرة أخرى، تمر جميع الاختبارات. هذه الاختبارات ستكون مفيدة بشكل خاص عند محاولة توسيع `AnonymousSurvey` للتعامل مع إجابات متعددة لكل شخص. بعد تعديل الكود لقبول إجابات متعددة، يمكنك تشغيل هذه الاختبارات والتأكد من أنك لم تؤثر على القدرة على تخزين إجابة واحدة أو سلسلة من الإجابات الفردية.


البنية أعلاه ستبدو معقدة بالتأكيد؛ تحتوي على بعض الأكواد الأكثر تجريدًا التي رأيتها حتى الآن. لا تحتاج إلى استخدام الـfixtures على الفور؛ من الأفضل كتابة اختبارات تحتوي على الكثير من الأكواد المكررة بدلاً من عدم كتابة اختبارات على الإطلاق. فقط اعلم أنه عندما تكون قد كتبت ما يكفي من الاختبارات بحيث أن التكرار أصبح عائقًا، هناك طريقة معروفة للتعامل مع التكرار. أيضًا، لا تجعل الـfixtures في الأمثلة البسيطة مثل هذا تجعل الكود أقصر أو أسهل في المتابعة. ولكن في المشاريع التي تحتوي على العديد من الاختبارات، أو في الحالات التي يستغرق فيها بناء مورد يُستخدم في اختبارات متعددة العديد من الأسطر، يمكن أن تحسن الـfixtures بشكل كبير كود الاختبار الخاص بك.


عندما تريد كتابة fixture، اكتب دالة تولد المورد الذي يُستخدم بواسطة دوال الاختبار المتعددة. أضف المزخرف `@pytest.fixture` إلى الدالة الجديدة، وأضف اسم هذه الدالة كمعلمة لكل دالة اختبار تستخدم هذا المورد. ستكون اختباراتك أقصر وأسهل في الكتابة والصيانة من تلك النقطة فصاعدًا.


جرب بنفسك


تمرين11-3. موظف: اكتب فئة تسمى `Employee`. يجب أن تأخذ دالة `__init__()` اسمًا أول، اسم عائلة، وراتب سنوي، وتخزن كلًا من هذه كسمات. اكتب دالة تسمى `give_raise()` التي تضيف 5000 دولار للراتب السنوي بشكل افتراضي، ولكنها تقبل أيضًا مبلغ زيادة مختلف.


اكتب ملف اختبار لـ `Employee` يحتوي على دالتي اختبار، `test_give_default_raise()` و`test_give_custom_raise()`. اكتب اختباراتك مرة واحدة دون استخدام fixture، وتأكد من أنها جميعها تمر. ثم اكتب fixture بحيث لا تضطر إلى إنشاء مثيل جديد للموظف في كل دالة اختبار. شغل الاختبارات مرة أخرى، وتأكد من أن كلا الاختبارين لا يزالان يمران.

 


الملخص


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


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


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


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


انتهى الجزء الأول من المنهج , بحيث انت اصبح لديك الأساس في لغة بايثون وتعرف كل شئ لتقوم بكتابة برنامج كامل , في الجزء الثاني سيكون عبارة عن ثلاث مشاريع نقوم بيتطبيق كل شئ تعلمناه بشكل عملي وحقيقي يساعدك في التطور والاستعداد لسوق العمل , لكن سنتوقف لهنا لفترة طويلة بحيث كاتب المنهج (اللي هو انا sparrow) سادخل في مرحلة تعليمية جديدة وهي 3 ث لذلك لن يكون لدي وقت , ولكن ستكون رجعتي من هذه المرحلة بتكملة الجزء الثاني علطول بشكل مباشر , لذلك اتمنى ان تدعو لي بالتوفيق والنجاح


النهاية


نكون هنا انتهينا من منهج تعلم Python من كتاب python crash course بالعربية الجزء الأول حسنا 


واذا واجهتك اي مشكلة في الفهم او ما شابه , يمكنك على الفور الذهاب الى المجتمع الخاص بنا في Telegram للمناقشة والتواصل معنا من هنا  


او اذا واجهتك مشكلة في الموقع او تريد اجابة سريعة يمكنك الذهاب الى اخر صفحة في الموقع ستجد صفحة اتصل بنا موجودة يمكنك ارسالة لنا مشكلتك , وسيتم الرد عليها بسرعة جدا ان شاء الله 


ويمكنك الأنضمام الى المجتمع Hidden Lock بالكامل مع جميع قنواته للأستفادة في اخر الأخبار في عالم التقنية وايضا الكتب بالمجان والكورسات والمقالات من خلال الرابط التالي لمجموعة القنوات من     هنا 


يمكنك ايضا متابعتنا في منصات X او Twitter سابقا , لمشاهدة الاخبار والمقالات السريعة والمهمة من  

هنا


وفقط كان معكم sparrow مقدم هذه الشهادة من فريق Hidden Lock 


Tags

إرسال تعليق

0تعليقات

إرسال تعليق (0)

#buttons=(موافق!) #days=(20)

يستخدم موقعنا ملفات تعريف الارتباط لتحسين تجربتك. تاكد الان
Ok, Go it!