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

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

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

إعداد Pytest

قبل تثبيت Pytest ، من الأفضل خلق بيئة افتراضية لعزل بيئة الاختبار الخاصة بك ، حتى تتمكن من تجنب التعارضات مع الحزم والتبعيات الأخرى.

لإنشاء بيئة افتراضية ، قم بتشغيل الأمر التالي قبل تثبيت Pytest.

اختبارات python -m venv

سيؤدي هذا إلى إنشاء بيئة افتراضية جديدة تسمى الاختبارات في دليلك الحالي. لتنشيط البيئة ، قم بتشغيل هذا الأمر إذا كنت تستخدم نظام التشغيل Linux أو Mac:

مصدر الاختبارات / بن / التنشيط

بالنسبة لنظام التشغيل Windows ، قم بتشغيل هذا الأمر:

الاختبارات \\ Scripts \\ activated

لتثبيت Pytest ، يمكنك استخدام pip ، مدير حزمة Python ، بهذا الأمر في جهازك الطرفي:

نقطة تثبيت pytest
instagram viewer

إذا لم يكن لديك Pip ، فلا داعي للقلق ؛ أنت تستطيع قم بتثبيت Pip على أنظمة التشغيل Windows و Mac و Linux.

قم بتشغيل الأمر التالي للتحقق مما إذا كنت قد قمت بتثبيت Pytest بشكل صحيح.

pytest - الإصدار

يجب أن يعيد هذا رقم الإصدار المثبت.

إنشاء الاختبار الأول الخاص بك

ضع في اعتبارك الوظيفة التالية التي تضيف رقمين وتعيد النتيجة.

defadd_numbers(أ ، ب):
يعود أ + ب

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

يجب أن يتحقق أحد الاختبارات الأولى التي تكتبها مما إذا كانت الدالة تُرجع النتيجة المتوقعة. للقيام بذلك ، يمكنك استخدام الكلمة الأساسية التأكيد لمقارنة الإخراج الفعلي للدالة بالمخرجات المتوقعة. في حالة وظيفة add_numbers ، قد تبدو وظيفة الاختبار كما يلي:

deftest_add_numbers():
يجزم add_numbers (2, 3) == 5
يجزم add_numbers (-1, 1) == 0
يجزم add_numbers (0, 0) == 0

تتضمن وظيفة الاختبار هذه ثلاث عبارات تأكيد ، كل منها يقارن إخراج الدالة add_numbers بالقيمة المتوقعة. يتحقق الاختبار الأول من أن إضافة 2 و 3 تُرجع 5 ، ويتحقق الاختبار الثاني من أن إضافة -1 و 1 تُرجع 0 ، ويتحقق الاختبار الثالث من أن إضافة 0 و 0 تُرجع 0.

كيفية إجراء الاختبارات باستخدام Pytest

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

بيتيست

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

على سبيل المثال ، لنفترض أنك قمت بتشغيل وظيفة الاختبار التالية لوظيفة add_numbers:

deftest_add_numbers():
يجزم add_numbers (2, 3) == 6
يجزم add_numbers (-1, 1) == 0
يجزم add_numbers (0, 0) == 0

سيفشل التأكيد الأول لأن القيمة المتوقعة كانت 6 ، لكن القيمة الفعلية كانت 5 (مجموع 2 و 3). سيعيد Pytest الرسالة التالية:

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

استخدام Pytest.raises لتأكيد الاستثناءات

الآن ، دعنا نكتب اختبارًا لتغطية إحدى حالات الحافة للدالة add_numbers. عندما تمرر وسيطة غير رقمية مثل بلا إلى الدالة ، يجب أن تثير Python استثناء TypeError.

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

للقيام بذلك ، انسخ وظيفة الاختبار التالية في ملفك. يستخدم مدير السياق pytest.raises للتحقق مما إذا كان استدعاء الوظيفة add_number مع "None" يثير استثناء TypeError.

يستورد بيتيست

deftest_add_numbers_ with_invalid_inputs():
مع pytest.raises (خطأ في النوع):
add_numbers (لا أحد, 2)

ثم قم بتشغيل Pytest من سطر الأوامر. إذا لم يظهر الاستثناء ، فسيفشل الاختبار.

يمكنك الذهاب أبعد من ذلك والتحقق من تفاصيل رسالة الاستثناء. ينتج مدير السياق كائن ExceptionInfo بالتفاصيل.

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

deftest_add_numbers_ with_invalid_inputs():
مع الزبيب pytest (خطأ مطبعي) مثل exc_info:
add_numbers (لا أحد, 2)

يجزم exc_info.value.args [0] == "نوع (أنواع) المعامل غير المدعوم لـ +: 'NoneType' و 'int'"

إذا كانت الرسالة لا تتطابق مع الرسالة الموجودة في الاختبار ، فسيشير Pytest إلى وجود فشل.

كيفية استخدام الاختبار المعتمد لاختبار المدخلات المتعددة مرة واحدة

بدلاً من استدعاء دالة ذات مدخلات متعددة يدويًا مثل هذا:

deftest_add_numbers():
يجزم add_numbers (2, 3) == 6
يجزم add_numbers (-1, 1) == 0
يجزم add_numbers (0, 0) == 0

يوفر Pytest ميزة اختبار ذات معلمات تتيح لك القيام بنفس الشيء بسهولة أكبر. إليك كيفية إعادة كتابة وظيفة الاختبار أعلاه:

يستورد بيتيست

تضمين التغريدة.mark.parametrize ("أ ، ب ، متوقع", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
deftest_add_numbers(أ ، ب ، متوقع):
يجزمadd_numbers(أ ، ب)== متوقع

كيفية إجراء اختبارات متعددة

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

على سبيل المثال ، إليك كيفية إنشاء فئة اختبار لوظيفة الإضافة.

فصلاختبار الوظيفة:
@ pytest.mark.parametrize ("أ ، ب ، متوقع" ، [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
deftest_addition_with_numbers(النفس ، أ ، ب ، متوقع):
يجزم add_numbers (أ ، ب) == متوقع

deftest_add_numbers_ with_invalid_inputs(الذات):
مع pytest.raises (TypeError) مثل exc_info:
add_numbers (لا أحد, 2)
يجزم exc_info.value.args [0] == "نوع (أنواع) المعامل غير المدعوم لـ +: 'NoneType' و 'int'"

لاحظ أنك تحتاج إلى بدء اسم الفصل بـ "Test" حتى يتمكن Pytest من تحديده كفئة اختبار وتشغيله.

لدى Pytest العديد من الميزات

باستخدام Pytest ، يمكنك التحقق تلقائيًا من عمل الكود الخاص بك كما تتوقع. يقدم Pytest العديد من الميزات الأخرى مثل التركيبات التي تسمح لك بإعداد بيانات الاختبار والعلامات الخاصة بإعداد البيانات الوصفية على وظائف الاختبار الخاصة بك وتمزيقها.

بالإضافة إلى ذلك ، يمكنك دمج Pytest في خط أنابيب CI الخاص بك والبدء في إجراء الاختبارات تلقائيًا وباستمرار عند تغيير الكود الخاص بك.