كيفية إعداد وتشغيل أول اختبار لكود Python باستخدام Pytest

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

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

كيفية إعداد وتشغيل أول اختبار لكود Python باستخدام Pytest - شروحات

إعداد Pytest

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

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

python -m venv tests

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

source tests/bin/activate

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

tests\\Scripts\\activate

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

pip install pytest

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

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

pytest — version

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

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

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

def add_numbers(a, b):

 return a + b

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

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

def test_add_numbers():
 assert add_numbers(2, 3) == 5
 assert add_numbers(-1, 1) == 0
 assert add_numbers(0, 10) == 10

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

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

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

pytest

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

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

def test_add_numbers():
 assert add_numbers(2, 3) == 6
 assert add_numbers(-1, 1) == 0
 assert add_numbers(0, 0) == 0

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

كيفية إعداد وتشغيل أول اختبار لكود Python باستخدام Pytest - شروحات

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

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

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

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

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

import pytest

def test_add_numbers_with_invalid_inputs():
 with pytest.raises(TypeError):
 add_numbers(None, 2)

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

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

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

def test_add_numbers_with_invalid_inputs():
 with pytest.raises(TypeError) as exc_info:
 add_numbers(None, 2)

assert exc_info.value.args[0] == “unsupported operand type(s) for +: ‘NoneType’ and ‘int’”

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

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

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

def test_add_numbers():
 assert add_numbers(2, 3) == 6
 assert add_numbers(-1, 1) == 0
 assert add_numbers(0, 0) == 0

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

import pytest

@pytest.mark.parametrize(“a,b,expected”, [
 (2, 3, 5),
 (-1, 1, 0),
 (0, 0, 0)
])
def test_add_numbers(a, b, expected):
 assert add_numbers(a, b) == expected

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

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

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

class TestAddFunction:
 @pytest.mark.parametrize(“a, b, expected”, [
 (2, 3, 5),
 (-1, 1, 0),
 (0, 0, 0),
 ])
 def test_addition_with_numbers(self, a, b, expected):
 assert add_numbers(a, b) == expected

def test_add_numbers_with_invalid_inputs(self):
 with pytest.raises(TypeError) as exc_info:
 add_numbers(None, 2)
 assert exc_info.value.args[0] == “unsupported operand type(s) for +: ‘NoneType’ and ‘int’”

لاحظ أنك تحتاج إلى بدء اسم الفئة بـ “Test” حتى يتمكن Pytest من تحديدها كفئة اختبار وتشغيلها. تحقق من مُستودعات GitHub العملية التي ستُعلمك لغة Python.

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

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

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

زر الذهاب إلى الأعلى