اختبار Pytest: دليل شامل لاختبار Python

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

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

توصيات