🔍 ما هي pytest؟
pytest هي مكتبة اختبار خارجية قوية وسهلة الاستخدام تُستخدم لاختبار وحدات البرامج في بايثون. وهي أكثر مرونة وسهولة من unittest.
🎯 مميزات pytest:
- لا تحتاج إلى كتابة كلاس للاختبار.
- رسائل خطأ واضحة وسهلة الفهم.
- دعم رائع لاختبار الاستثناءات والقيم المتعددة.
- يمكن التوسع بها باستخدام الإضافات (plugins).
- دعم لاختبارات المعلمات (parametrize).
📦 أولاً: التثبيت
pip install pytest
✍️ مثال بسيط
math_utils.py
def add(x, y):
return x + y
def divide(x, y):
if y == 0:
raise ValueError("Cannot divide by zero!")
return x / y
test_math_utils.py
from math_utils import add, divide
def test_add():
assert add(2, 3) == 5
assert add(-1, 1) == 0
def test_divide():
assert divide(10, 2) == 5
def test_divide_by_zero():
import pytest
with pytest.raises(ValueError):
divide(10, 0)
▶️ لتشغيل الاختبارات:
pytest
📌 شرح الأدوات في pytest
| الأداة | الاستخدام |
|---|---|
assert |
بديل مبسط لـ self.assertEqual وغيره |
pytest.raises() |
لاختبار أن الدالة تُطلق استثناء |
@pytest.mark.parametrize |
لتجربة نفس الدالة على عدة قيم مختلفة |
conftest.py |
ملف إعداد مشترك لإعداد البيانات أو التهيئة العامة |
fixtures |
لتحضير الكائنات أو البيئة قبل كل اختبار |
🧪 مثال على اختبار مع parametrize
import pytest
from math_utils import add
@pytest.mark.parametrize("a,b,result", [
(1, 2, 3),
(0, 0, 0),
(-1, -2, -3),
])
def test_add_parametrized(a, b, result):
assert add(a, b) == result
🧰 متى أستخدم pytest بدلاً من unittest؟
- إذا كنت تريد كتابة اختبارات بسرعة وبشكل أبسط.
- إذا كنت تحتاج إلى اختبار مع بيانات كثيرة باستخدام
parametrize. - إذا كنت تعمل على مشروع كبير وتحتاج إلى تقارير أو تحليلات للاختبارات.
🎯 التمرين: إنشاء واختبار دالة لتحويل درجات الحرارة
📌 المطلوب:
- أنشئ ملفًا يحتوي على دالة لتحويل درجات الحرارة من فهرنهايت إلى سيلسيوس.
- أنشئ ملف اختبار باستخدام
pytestيحتوي على:- اختبار نتائج صحيحة لقيم مختلفة.
- اختبار عند تمرير قيمة ليست رقمًا (مثل
Noneأوstr) باستخدامpytest.raises.
🧩 الملف الأول: temperature.py
def fahrenheit_to_celsius(f):
if not isinstance(f, (int, float)):
raise TypeError("Input must be a number.")
return (f - 32) * 5 / 9
✅ الملف الثاني: test_temperature.py
import pytest
from temperature import fahrenheit_to_celsius
def test_conversion_correctness():
assert round(fahrenheit_to_celsius(32), 2) == 0
assert round(fahrenheit_to_celsius(212), 2) == 100
assert round(fahrenheit_to_celsius(98.6), 1) == 37.0
def test_invalid_input():
with pytest.raises(TypeError):
fahrenheit_to_celsius("not a number")
with pytest.raises(TypeError):
fahrenheit_to_celsius(None)
▶️ لتشغيل الاختبارات:
pytest
📄 شرح سريع:
- استخدمنا
round()في الاختبار لأن التحويل ينتج قيمًا عشرية دقيقة جدًا. - استخدمنا
pytest.raisesلاختبار الاستثناءات عند تمرير مدخل غير رقمي.

