بايثون بعد الأساسيات 7: شرح pytest في بايثون للمبتدئين وكتابة الاختبارات بسهولة

شرح pytest في بايثون للمبتدئين وكتابة اختبارات تلقائية

عندما تكتب برنامجًا بلغة بايثون، قد تعمل الدوال بشكل صحيح في البداية، ثم تتوقف إحداها عن العمل بعد تعديل جزء آخر من المشروع. تجربة كل دالة يدويًا بعد كل تعديل قد تكون ممكنة في البرامج الصغيرة، لكنها تصبح بطيئة ومتعبة عندما يكبر المشروع.

في هذا المقال ستتعلم استخدام مكتبة pytest لكتابة اختبارات تلقائية في بايثون. سنتعرف على طريقة تثبيتها، وكتابة أول اختبار باستخدام assert، وتشغيل عدة حالات باستخدام parametrize، واختبار الأخطاء المتوقعة، واستخدام fixtures لتجهيز البيانات المشتركة.

هذا الدرس يأتي بعد تعلم أساسيات اختبار الدوال باستخدام مكتبة unittest. لا يعني ذلك أن unittest غير مفيدة، لكن pytest توفر طريقة مختصرة وواضحة لكتابة كثير من الاختبارات.

{alertInfo} الفكرة ببساطة: تكتب دالة يبدأ اسمها بـ test_، وتستخدم داخلها assert لتحديد النتيجة المتوقعة، ثم تشغّل pytest لتعرف أي الاختبارات نجح وأيها فشل.

{getToc} $title={محتوى المقال}

ما هو pytest في بايثون؟

pytest هو إطار عمل لاختبار برامج بايثون. يساعدك على تشغيل الاختبارات تلقائيًا، ومقارنة النتائج الفعلية بالنتائج المتوقعة، ومعرفة سبب فشل الاختبار.

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

يستطيع pytest مساعدتك في:

  • اكتشاف ملفات ودوال الاختبار تلقائيًا.
  • عرض سبب فشل المقارنات بطريقة واضحة.
  • تشغيل عدة حالات اختبار باستخدام الكود نفسه.
  • اختبار الاستثناءات والأخطاء المتوقعة.
  • تجهيز بيانات مشتركة باستخدام fixtures.
  • تشغيل كثير من الاختبارات المكتوبة باستخدام unittest.

ما الفرق بين unittest وpytest؟

تؤدي الأداتان الغرض الأساسي نفسه، وهو كتابة وتشغيل الاختبارات، لكن طريقة الاستخدام تختلف بينهما.

النقطة unittest pytest
التثبيت مدمجة مع بايثون ولا تحتاج إلى تثبيت. مكتبة خارجية يتم تثبيتها باستخدام pip.
شكل الاختبار تعتمد غالبًا على كلاس يرث من TestCase. يمكن كتابة الاختبار كدالة عادية.
المقارنة تستخدم دوال مثل assertEqual(). تستخدم أمر assert العادي.
تجربة عدة قيم تحتاج غالبًا إلى حلقة أو subTest. توفر parametrize بطريقة مختصرة.
تجهيز البيانات تستخدم setUp() وtearDown(). تستخدم نظام fixtures.
سهولة البداية مفيدة لفهم إطار الاختبار المدمج في بايثون. قصيرة وواضحة في المشاريع الصغيرة والمتوسطة.

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

تنظيم ملفات مشروع بايثون وملفات الاختبار باستخدام pytest

ماذا تحتاج قبل استخدام pytest؟

قبل تطبيق هذا الدرس، يفضل أن تعرف أساسيات الموضوعات التالية:

  • إنشاء الدوال باستخدام def.
  • إرجاع النتائج باستخدام return.
  • استخدام assert للتحقق من شرط.
  • استيراد دالة من ملف آخر.
  • تشغيل ملفات بايثون من Terminal أو CMD.
  • تثبيت المكتبات باستخدام pip.

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

إنشاء مشروع جديد للتجربة

أنشئ مجلدًا جديدًا باسم:

pytest_project

سنضع داخله ملفًا يحتوي على الدوال، وملفًا آخر يحتوي على الاختبارات.

سيكون هيكل المشروع في البداية بهذا الشكل:

pytest_project/
│
├── calculator.py
└── test_calculator.py
كتابة أول اختبار في pytest باستخدام assert

إنشاء بيئة افتراضية للمشروع

يفضل تثبيت pytest داخل بيئة افتراضية خاصة بالمشروع، حتى تبقى مكتبات المشروع منفصلة عن بقية المشاريع.

إنشاء البيئة الافتراضية في Windows

py -m venv .venv

ثم فعّل البيئة:

.venv\Scripts\activate

إنشاء البيئة الافتراضية في macOS أو Linux

python3 -m venv .venv

ثم فعّلها:

source .venv/bin/activate

بعد نجاح التفعيل، يظهر اسم البيئة غالبًا في بداية سطر الأوامر.

تثبيت pytest باستخدام pip

بعد تفعيل البيئة الافتراضية، ثبّت المكتبة باستخدام:

python -m pip install -U pytest

للتأكد من نجاح التثبيت، استخدم:

python -m pytest --version

إذا ظهر رقم إصدار pytest، فهذا يعني أن المكتبة أصبحت جاهزة للاستخدام.

{alertInfo} يفضل استخدام python -m pytest بدل كتابة pytest فقط؛ لأن هذا يضمن تشغيل المكتبة باستخدام نسخة بايثون نفسها التي يعمل بها المشروع.

كتابة الدوال التي سنختبرها

افتح ملف calculator.py وأضف الدوال التالية:

def add(a, b):
    return a + b


def divide(a, b):
    if b == 0:
        raise ValueError("لا يمكن القسمة على صفر")

    return a / b


def average(numbers):
    if not numbers:
        raise ValueError("القائمة فارغة")

    return sum(numbers) / len(numbers)

يحتوي الملف على ثلاث دوال:

  • add() لجمع رقمين.
  • divide() لقسمة رقم على آخر مع منع القسمة على صفر.
  • average() لحساب متوسط عناصر قائمة مع منع القائمة الفارغة.

كتابة أول اختبار باستخدام pytest

افتح ملف test_calculator.py واكتب:

from calculator import add


def test_add():
    assert add(2, 3) == 5

في هذا الاختبار قمنا بثلاث خطوات:

  1. استوردنا الدالة add من ملف calculator.py.
  2. أنشأنا دالة اختبار يبدأ اسمها بـ test_.
  3. استخدمنا assert للتأكد أن جمع 2 و3 يعيد القيمة 5.

يبدأ اسم دالة الاختبار بـ test_ حتى يستطيع pytest اكتشافها تلقائيًا.

تشغيل عدة حالات اختبار باستخدام pytest parametrize

تشغيل أول اختبار

افتح Terminal داخل المجلد الرئيسي للمشروع، ثم شغّل:

python -m pytest

إذا كان الاختبار ناجحًا، سيظهر ناتج قريب من:

collected 1 item

test_calculator.py .                         [100%]

1 passed

النقطة . تعني أن الاختبار نجح، وعبارة 1 passed تعني أن اختبارًا واحدًا تم تشغيله بنجاح.

ماذا يحدث عند فشل الاختبار؟

غيّر القيمة المتوقعة مؤقتًا من 5 إلى 10:

def test_add():
    assert add(2, 3) == 10

شغّل الاختبارات مرة أخرى:

python -m pytest

سيظهر أن الاختبار فشل، لأن الدالة تعيد القيمة 5 بينما الاختبار يتوقع 10.

قد يظهر جزء من رسالة الخطأ بهذا الشكل:

>       assert add(2, 3) == 10
E       assert 5 == 10

1 failed

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

إضافة أكثر من اختبار

يمكنك كتابة اختبار مستقل لكل سلوك مهم في الدالة.

from calculator import add, divide


def test_add_positive_numbers():
    assert add(2, 3) == 5


def test_add_negative_numbers():
    assert add(-2, -3) == -5


def test_add_with_zero():
    assert add(7, 0) == 7


def test_divide():
    assert divide(10, 2) == 5

استخدم أسماء واضحة تصف ما يفحصه الاختبار. الاسم test_add_negative_numbers أوضح من اسم عام مثل test_2.

اختبار ظهور خطأ باستخدام pytest.raises

الدالة divide() ترفع خطأ ValueError عند محاولة القسمة على صفر. نريد كتابة اختبار يتأكد أن هذا الخطأ يظهر فعلًا.

عدّل ملف الاختبار كما يلي:

import pytest

from calculator import divide


def test_divide_by_zero():
    with pytest.raises(ValueError):
        divide(10, 0)

يخبر هذا الاختبار pytest أننا نتوقع ظهور خطأ من نوع ValueError. إذا لم يظهر الخطأ، يفشل الاختبار.

يمكنك أيضًا التأكد من رسالة الخطأ:

import pytest

from calculator import divide


def test_divide_by_zero_message():
    with pytest.raises(
        ValueError,
        match="لا يمكن القسمة على صفر"
    ):
        divide(10, 0)

هذه الطريقة مفيدة عند اختبار:

  • القيم غير المسموح بها.
  • القوائم الفارغة.
  • الملفات غير الموجودة.
  • أنواع البيانات غير الصحيحة.
  • المدخلات التي لا تحقق شروط البرنامج.

تشغيل عدة حالات باستخدام parametrize

قد تحتاج إلى تجربة الدالة نفسها مع عدة مجموعات من القيم. يمكنك كتابة اختبار منفصل لكل حالة، لكن هذا يؤدي إلى تكرار الكود.

يوفر pytest الأداة parametrize لتشغيل الاختبار نفسه مع قيم متعددة.

import pytest

from calculator import add


@pytest.mark.parametrize(
    "a,b,expected",
    [
        (2, 3, 5),
        (0, 0, 0),
        (-2, 5, 3),
        (10, -4, 6)
    ]
)
def test_add_multiple_cases(a, b, expected):
    assert add(a, b) == expected

كل tuple داخل القائمة يمثل حالة اختبار مستقلة:

  • القيمة الأولى ترسل إلى المتغير a.
  • القيمة الثانية ترسل إلى المتغير b.
  • القيمة الثالثة هي النتيجة المتوقعة.

عند تشغيل الاختبار، سيجرب pytest الحالات الأربع بشكل مستقل. إذا فشلت حالة واحدة، ستعرف القيم التي سببت الفشل.

شرح fixtures في pytest وتجهيز بيانات الاختبار

ما هي fixtures في pytest؟

fixture هي دالة تجهز بيانات أو موردًا يحتاجه اختبار واحد أو أكثر. بدل تكرار البيانات نفسها داخل عدة اختبارات، تكتبها مرة واحدة ثم تستخدمها عند الحاجة.

أضف المثال التالي إلى ملف الاختبار:

import pytest

from calculator import average


@pytest.fixture
def sample_numbers():
    return [10, 20, 30]


def test_average(sample_numbers):
    assert average(sample_numbers) == 20

لاحظ أننا لم نستدعِ sample_numbers() يدويًا. وضعنا اسمها داخل معاملات دالة الاختبار:

def test_average(sample_numbers):

عندما يرى pytest هذا الاسم، يبحث عن fixture بالاسم نفسه، ويشغّلها، ثم يرسل القيمة التي أعادتها إلى الاختبار.

متى نستخدم fixtures؟

يمكن استخدام fixtures في حالات كثيرة، مثل:

  • تجهيز قائمة بيانات تستخدمها عدة اختبارات.
  • إنشاء كائن من كلاس قبل الاختبار.
  • إنشاء ملف مؤقت.
  • تجهيز اتصال اختباري بقاعدة بيانات.
  • تجهيز إعدادات مشتركة.
  • تنظيف الموارد بعد انتهاء الاختبار.

استخدام fixture جاهزة باسم tmp_path

يوفر pytest عددًا من fixtures الجاهزة. من أشهرها tmp_path، التي تنشئ مجلدًا مؤقتًا مستقلًا للاختبار.

def test_write_temporary_file(tmp_path):
    file_path = tmp_path / "report.txt"

    file_path.write_text(
        "تم إنشاء التقرير",
        encoding="utf-8"
    )

    content = file_path.read_text(
        encoding="utf-8"
    )

    assert content == "تم إنشاء التقرير"

هذا أفضل من إنشاء ملفات اختبار عشوائية داخل مجلد المشروع، لأن الملف يوضع في مجلد مؤقت مستقل.

مقارنة الأرقام العشرية باستخدام pytest.approx

عند التعامل مع الأرقام العشرية، قد لا تكون المقارنة باستخدام == مناسبة دائمًا، بسبب طريقة تمثيل بعض القيم العشرية داخل الحاسوب.

يمكن استخدام pytest.approx للسماح بفارق صغير:

import pytest

from calculator import divide


def test_divide_decimal():
    result = divide(1, 3)

    assert result == pytest.approx(
        0.333333,
        rel=1e-5
    )

القيمة rel=1e-5 تحدد مقدار التقارب النسبي المسموح به. اختر مستوى الدقة حسب طبيعة الحساب الذي تختبره.

تشغيل اختبار محدد فقط

عندما يصبح لديك عدد كبير من الاختبارات، قد تحتاج إلى تشغيل ملف واحد فقط:

python -m pytest test_calculator.py

ولتحديد دالة اختبار واحدة:

python -m pytest test_calculator.py::test_divide_by_zero

لعرض أسماء الاختبارات بشكل تفصيلي، استخدم:

python -m pytest -v

للحصول على نتيجة مختصرة:

python -m pytest -q

ولإيقاف التشغيل عند أول اختبار فاشل:

python -m pytest -x

كيف يكتشف pytest ملفات الاختبار؟

يبحث pytest تلقائيًا عن ملفات ودوال تتبع أسماء محددة.

من أهم القواعد:

  • اسم الملف يبدأ بـ test_ مثل test_calculator.py.
  • أو ينتهي بـ _test.py مثل calculator_test.py.
  • اسم دالة الاختبار يبدأ بـ test_.
  • اسم كلاس الاختبار يبدأ غالبًا بـ Test.

إذا أنشأت دالة باسم check_add() بدل test_add()، فلن يكتشفها pytest تلقائيًا غالبًا.

تنظيم الاختبارات داخل مجلد tests

في المشروع الصغير يمكن وضع ملف الاختبار بجانب ملف البرنامج. لكن عندما يكبر المشروع، يفضل وضع الاختبارات داخل مجلد مستقل باسم tests.

pytest_project/
│
├── calculator.py
├── tests/
│   ├── __init__.py
│   └── test_calculator.py
│
├── requirements-dev.txt
└── README.md

يمكنك وضع مكتبة pytest داخل ملف requirements-dev.txt:

pytest

ثم تثبيت أدوات التطوير باستخدام:

python -m pip install -r requirements-dev.txt

يساعد فصل متطلبات التطوير عن متطلبات تشغيل البرنامج على منع تثبيت أدوات غير ضرورية للمستخدم النهائي.

إعداد pytest داخل pyproject.toml

يمكنك إضافة بعض الإعدادات داخل ملف pyproject.toml في المجلد الرئيسي للمشروع.

[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py"]
addopts = "-v"

في هذا المثال:

  • testpaths تحدد المجلد الذي يحتوي على الاختبارات.
  • python_files تحدد نمط أسماء ملفات الاختبار.
  • addopts تضيف خيار -v تلقائيًا عند التشغيل.

لا تضف إعدادات كثيرة دون حاجة. ابدأ بالإعدادات البسيطة، ثم أضف المزيد عندما يكبر المشروع.

مثال كامل لملف الاختبار

بعد جمع الأفكار السابقة، يمكن أن يصبح ملف test_calculator.py بهذا الشكل:

import pytest

from calculator import add, average, divide


@pytest.mark.parametrize(
    "a,b,expected",
    [
        (2, 3, 5),
        (0, 0, 0),
        (-2, 5, 3)
    ]
)
def test_add(a, b, expected):
    assert add(a, b) == expected


def test_divide():
    assert divide(10, 2) == 5


def test_divide_by_zero():
    with pytest.raises(
        ValueError,
        match="لا يمكن القسمة على صفر"
    ):
        divide(10, 0)


@pytest.fixture
def sample_numbers():
    return [10, 20, 30]


def test_average(sample_numbers):
    assert average(sample_numbers) == 20


def test_average_empty_list():
    with pytest.raises(
        ValueError,
        match="القائمة فارغة"
    ):
        average([])

شغّل الملف باستخدام:

python -m pytest -v

سيظهر كل اختبار باسمه وحالته، مما يسهل معرفة الاختبارات الناجحة والفاشلة.

أخطاء شائعة عند استخدام pytest

1. ظهور pytest is not recognized

يظهر هذا الخطأ غالبًا لأن المكتبة غير مثبتة داخل البيئة الحالية، أو لأن البيئة الافتراضية لم يتم تفعيلها.

جرّب:

python -m pip install -U pytest
python -m pytest --version

2. ظهور no tests ran

يعني هذا غالبًا أن pytest لم يجد ملفات أو دوال تتبع نمط التسمية الصحيح.

تأكد أن اسم الملف مثل:

test_calculator.py

وأن اسم دالة الاختبار يبدأ بـ:

test_

3. تسمية ملفك pytest.py

لا تسمِّ ملفًا داخل مشروعك pytest.py، لأن بايثون قد يحاول استيراد ملفك بدل المكتبة الأصلية.

تجنب أيضًا تسمية ملفاتك بأسماء مكتبات بايثون المعروفة مثل:

  • unittest.py
  • random.py
  • json.py
  • logging.py

إذا غيّرت اسم الملف واستمرت المشكلة، احذف مجلد __pycache__ ثم أعد التشغيل.

4. ظهور ModuleNotFoundError

قد يحدث الخطأ عندما تشغّل الاختبارات من داخل مجلد tests بدل تشغيلها من المجلد الرئيسي للمشروع.

استخدم:

cd pytest_project
python -m pytest

5. جعل اختبار يعتمد على اختبار آخر

يجب أن يكون كل اختبار مستقلًا. لا تجعل الاختبار الثاني يعتمد على ملف أو متغير أنشأه الاختبار الأول، لأن ترتيب تشغيل الاختبارات قد يتغير.

استخدم fixture لتجهيز بيانات مستقلة لكل اختبار عند الحاجة.

6. استخدام بيانات حقيقية أو حساسة

لا تستخدم قاعدة بيانات الإنتاج أو مفاتيح API الحقيقية أو كلمات المرور داخل الاختبارات. أنشئ بيانات تجريبية وبيئة منفصلة.

7. اختبار تفاصيل داخلية غير مهمة

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

أفضل ممارسات كتابة اختبارات pytest

  • اكتب اختبارًا لكل سلوك مهم، وليس لكل سطر كود.
  • استخدم أسماء واضحة تصف الحالة التي يتم اختبارها.
  • اجعل كل اختبار صغيرًا ويركز على فكرة واحدة.
  • اختبر الحالات الطبيعية والحالات الحدية.
  • اختبر الأخطاء المتوقعة بدل تجاهلها.
  • استخدم parametrize عند تجربة قيم متعددة.
  • استخدم fixtures للبيانات والإعدادات المشتركة.
  • لا تجعل الاختبارات تعتمد على الإنترنت دون ضرورة.
  • لا تعدّل بيانات حقيقية أثناء الاختبار.
  • شغّل الاختبارات بعد كل تعديل مهم.
{alertInfo} الاختبار الجيد لا يثبت أن البرنامج خالٍ من كل الأخطاء، لكنه يساعدك على اكتشاف المشكلات مبكرًا ويمنع الوظائف القديمة من الانكسار دون أن تلاحظ.

تدريب عملي على pytest

طوّر مشروع الحاسبة ونفّذ التمارين التالية:

  1. أضف دالة subtract() لطرح رقمين.
  2. أضف دالة multiply() لضرب رقمين.
  3. اكتب اختبارات للقيم الموجبة والسالبة والصفر.
  4. استخدم parametrize لتجربة خمس حالات لكل دالة.
  5. اكتب اختبارًا يتأكد أن average([]) ترفع ValueError.
  6. أنشئ fixture تعيد قائمة درجات تجريبية.
  7. ضع الاختبارات داخل مجلد tests.
  8. شغّل الاختبارات باستخدام الخيار -v.

حل مختصر لدالة الطرح

أضف إلى ملف calculator.py:

def subtract(a, b):
    return a - b

ثم أضف إلى ملف الاختبار:

import pytest

from calculator import subtract


@pytest.mark.parametrize(
    "a,b,expected",
    [
        (10, 3, 7),
        (0, 5, -5),
        (-2, -3, 1)
    ]
)
def test_subtract(a, b, expected):
    assert subtract(a, b) == expected

قالب سريع لبدء اختبار دالة

يمكنك الاحتفاظ بالقالب التالي واستخدامه عند بدء اختبار دالة جديدة:

import pytest

from app import my_function


@pytest.mark.parametrize(
    "value,expected",
    [
        (1, 2),
        (5, 10)
    ]
)
def test_my_function(value, expected):
    assert my_function(value) == expected

غيّر اسم الملف والدالة والقيم بما يناسب مشروعك، ثم شغّل:

python -m pytest -v

متى تبدأ كتابة الاختبارات؟

لا تحتاج إلى انتظار اكتمال المشروع. يمكنك كتابة الاختبارات بمجرد أن تصبح لديك دالة واضحة لها مدخلات ونتائج متوقعة.

من المناسب كتابة الاختبارات عندما:

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

ابدأ بأهم الوظائف في مشروعك، ولا تحاول كتابة مئات الاختبارات دفعة واحدة.

لماذا pytest مهمة بعد تعلم أساسيات بايثون؟

في مرحلة الأساسيات، تركز غالبًا على كتابة الكود وتشغيله. بعد ذلك تبدأ مشاريعك في احتواء عدة ملفات ودوال وكلاسات، ويصبح من الصعب التأكد يدويًا أن كل شيء ما زال يعمل.

تعلم الاختبارات يساعدك على:

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

لهذا السبب تعتبر الاختبارات من المهارات المهمة عند الانتقال من تعلم الأوامر الأساسية إلى بناء مشاريع بايثون حقيقية.

روابط داخلية مفيدة من بايثون العرب

مصادر خارجية مفيدة

الخلاصة

pytest هي أداة تساعدك على كتابة وتشغيل الاختبارات التلقائية في بايثون بطريقة مختصرة وواضحة. تبدأ بإنشاء دالة يبدأ اسمها بـ test_، ثم تستخدم assert لمقارنة النتيجة الفعلية بالنتيجة المتوقعة.

تعلمت في هذا المقال طريقة تثبيت pytest داخل بيئة افتراضية، وكتابة أول اختبار، وتشغيل الاختبارات، وفهم الاختبار الفاشل، واختبار الأخطاء باستخدام pytest.raises.

كما تعلمت استخدام parametrize لتجربة عدة قيم، واستخدام fixtures لتجهيز البيانات المشتركة، وتنظيم ملفات الاختبار داخل مجلد tests.

{alertSuccess} القاعدة المهمة: ابدأ باختبار أهم الدوال في مشروعك. اكتب اختبارًا للحالة الطبيعية، واختبارًا لحالة حدية أو خاطئة، ثم شغّل الاختبارات بعد كل تعديل مهم.

أسئلة شائعة

هل pytest جزء من بايثون؟

لا، pytest مكتبة خارجية تحتاج إلى تثبيتها باستخدام pip، بينما unittest مدمجة مع بايثون.

كيف أثبت pytest؟

فعّل البيئة الافتراضية ثم استخدم:

python -m pip install -U pytest

كيف أشغّل اختبارات pytest؟

افتح Terminal داخل المجلد الرئيسي للمشروع ثم شغّل:

python -m pytest

لماذا لا يجد pytest الاختبارات؟

غالبًا لأن اسم الملف أو دالة الاختبار لا يتبع نمط التسمية الصحيح. استخدم اسم ملف مثل test_app.py واسم دالة مثل test_add().

ما الفرق بين assert وpytest.raises؟

يستخدم assert لفحص شرط أو مقارنة نتيجة، بينما يستخدم pytest.raises للتأكد أن الكود يرفع استثناءً متوقعًا.

ما فائدة parametrize؟

تسمح لك بتشغيل الاختبار نفسه مع عدة مجموعات من القيم دون تكرار دالة الاختبار.

ما فائدة fixtures؟

تستخدم fixtures لتجهيز بيانات أو موارد يحتاجها اختبار واحد أو أكثر، مثل قائمة تجريبية أو ملف مؤقت أو اتصال اختباري.

هل يستطيع pytest تشغيل اختبارات unittest؟

نعم، يستطيع pytest تشغيل كثير من الاختبارات المكتوبة باستخدام unittest، لذلك يمكنك الانتقال إليه تدريجيًا.

هل أستخدم unittest أم pytest؟

استخدم unittest إذا أردت الاعتماد على مكتبة مدمجة مع بايثون، واستخدم pytest إذا كنت تريد كتابة مختصرة وميزات مثل fixtures وparametrize. الأهم هو كتابة اختبارات مفيدة ومنظمة.

إرسال تعليق

أحدث أقدم