Pytest: دليل شامل لاختبار Python
مقدمة عن Pytest
الاختبار جزء أساسي من تطوير البرمجيات. بدون اختبارات جيدة، يصعب ضمان موثوقية الكود واستقراره عند إجراء التغييرات. Pytest هو إطار عمل حديث وقوي وسهل الاستخدام للاختبار الآلي في Python، يبسط بشكل كبير عملية كتابة وتنفيذ الاختبارات.
حاز Pytest على شعبية واسعة في مجتمع المطورين بفضل صياغته المختصرة، وإمكانياته الواسعة للتوسع، ونظام fixtures القوي. يتفوق بشكل ملحوظ على وحدة unittest القياسية من حيث سهولة الاستخدام وسرعة تطوير الاختبارات.
تثبيت وإعداد Pytest
التثبيت عبر pip
pip install pytest
التحقق من التثبيت
pytest --version
أول اختبار بسيط
أنشئ ملفًا باسم test_example.py:
def test_addition():
assert 2 + 2 == 4
def test_string_operations():
text = "Hello, World!"
assert "Hello" in text
assert len(text) == 13
تشغيل الاختبارات
pytest
سيكتشف Pytest تلقائيًا جميع ملفات ودوال الاختبار التي تتبع اتفاقيات التسمية.
هيكلة وتنظيم الاختبارات
اتفاقيات التسمية
يستخدم Pytest الاتفاقيات التالية للاكتشاف التلقائي للاختبارات:
- ملفات الاختبار:
test_*.pyأو*_test.py - دوال الاختبار:
def test_...() - فئات الاختبار:
class Test...(بدون دالة__init__) - طرق الاختبار داخل الفئات:
def test_...()
تنظيم هيكل الاختبارات
project/
├── src/
│ ├── calculator.py
│ └── utils.py
├── tests/
│ ├── test_calculator.py
│ ├── test_utils.py
│ └── conftest.py
└── pytest.ini
تشغيل الاختبارات بخيارات مختلفة
# تشغيل جميع الاختبارات
pytest
# تشغيل الاختبارات في مجلد معين
pytest tests/
# تشغيل ملف معين
pytest test_calculator.py
# تشغيل اختبار معين
pytest test_calculator.py::test_add
# تشغيل اختبارات فئة معينة
pytest test_calculator.py::TestCalculator
# تشغيل طريقة معينة داخل فئة
pytest test_calculator.py::TestCalculator::test_multiply
أساسيات كتابة الاختبارات
استخدام assert للتحقق
يستخدم Pytest عامل assert القياسي في Python للتحقق من الشروط:
def test_basic_assertions():
# التحقق من المساواة
assert 2 + 2 == 4
# التحقق من عدم المساواة
assert 3 * 3 != 8
# التحقق من الاحتواء
assert "Python" in "Python testing"
# التحقق من الأنواع
assert isinstance(42, int)
# التحقق من الصحة
assert bool([1, 2, 3])
# التحقق من الخطأ
assert not bool([])
اختبار الاستثناءات
import pytest
def divide(a, b):
if b == 0:
raise ValueError("القسمة على صفر غير مسموح بها")
return a / b
def test_division_by_zero():
with pytest.raises(ValueError):
divide(10, 0)
def test_exception_message():
with pytest.raises(ValueError, match="القسمة على صفر"):
divide(10, 0)
def test_exception_type():
with pytest.raises(ZeroDivisionError):
1 / 0
تنظيم الاختبارات في فئات
class TestCalculator:
def test_addition(self):
assert 2 + 3 == 5
def test_subtraction(self):
assert 10 - 4 == 6