عندما تكتب برنامجًا بلغة بايثون، قد تعمل الدوال بشكل صحيح في البداية، ثم تتوقف إحداها عن العمل بعد تعديل جزء آخر من المشروع. تجربة كل دالة يدويًا بعد كل تعديل قد تكون ممكنة في البرامج الصغيرة، لكنها تصبح بطيئة ومتعبة عندما يكبر المشروع.
في هذا المقال ستتعلم استخدام مكتبة 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؟
قبل تطبيق هذا الدرس، يفضل أن تعرف أساسيات الموضوعات التالية:
- إنشاء الدوال باستخدام
def. - إرجاع النتائج باستخدام
return. - استخدام
assertللتحقق من شرط. - استيراد دالة من ملف آخر.
- تشغيل ملفات بايثون من Terminal أو CMD.
- تثبيت المكتبات باستخدام
pip.
إذا لم تكتب اختبارات من قبل، يمكنك مراجعة مقال اختبار الدوال باستخدام unittest في بايثون أولًا لفهم الفكرة الأساسية.
إنشاء مشروع جديد للتجربة
أنشئ مجلدًا جديدًا باسم:
pytest_project
سنضع داخله ملفًا يحتوي على الدوال، وملفًا آخر يحتوي على الاختبارات.
سيكون هيكل المشروع في البداية بهذا الشكل:
pytest_project/
│
├── calculator.py
└── test_calculator.py
إنشاء بيئة افتراضية للمشروع
يفضل تثبيت 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
في هذا الاختبار قمنا بثلاث خطوات:
- استوردنا الدالة
addمن ملفcalculator.py. - أنشأنا دالة اختبار يبدأ اسمها بـ
test_. - استخدمنا
assertللتأكد أن جمع 2 و3 يعيد القيمة 5.
يبدأ اسم دالة الاختبار بـ test_ حتى يستطيع pytest اكتشافها تلقائيًا.
تشغيل أول اختبار
افتح 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؟
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.pyrandom.pyjson.pylogging.py
إذا غيّرت اسم الملف واستمرت المشكلة، احذف مجلد __pycache__ ثم أعد التشغيل.
4. ظهور ModuleNotFoundError
قد يحدث الخطأ عندما تشغّل الاختبارات من داخل مجلد tests بدل تشغيلها من المجلد الرئيسي للمشروع.
استخدم:
cd pytest_project
python -m pytest
5. جعل اختبار يعتمد على اختبار آخر
يجب أن يكون كل اختبار مستقلًا. لا تجعل الاختبار الثاني يعتمد على ملف أو متغير أنشأه الاختبار الأول، لأن ترتيب تشغيل الاختبارات قد يتغير.
استخدم fixture لتجهيز بيانات مستقلة لكل اختبار عند الحاجة.
6. استخدام بيانات حقيقية أو حساسة
لا تستخدم قاعدة بيانات الإنتاج أو مفاتيح API الحقيقية أو كلمات المرور داخل الاختبارات. أنشئ بيانات تجريبية وبيئة منفصلة.
7. اختبار تفاصيل داخلية غير مهمة
ركز على السلوك والنتيجة التي يحتاجها المستخدم أو بقية البرنامج. إذا ربطت الاختبار بتفاصيل داخلية صغيرة جدًا، فقد يفشل الاختبار بعد تحسين الكود رغم أن النتيجة ما زالت صحيحة.
أفضل ممارسات كتابة اختبارات pytest
- اكتب اختبارًا لكل سلوك مهم، وليس لكل سطر كود.
- استخدم أسماء واضحة تصف الحالة التي يتم اختبارها.
- اجعل كل اختبار صغيرًا ويركز على فكرة واحدة.
- اختبر الحالات الطبيعية والحالات الحدية.
- اختبر الأخطاء المتوقعة بدل تجاهلها.
- استخدم
parametrizeعند تجربة قيم متعددة. - استخدم fixtures للبيانات والإعدادات المشتركة.
- لا تجعل الاختبارات تعتمد على الإنترنت دون ضرورة.
- لا تعدّل بيانات حقيقية أثناء الاختبار.
- شغّل الاختبارات بعد كل تعديل مهم.
{alertInfo} الاختبار الجيد لا يثبت أن البرنامج خالٍ من كل الأخطاء، لكنه يساعدك على اكتشاف المشكلات مبكرًا ويمنع الوظائف القديمة من الانكسار دون أن تلاحظ.
تدريب عملي على pytest
طوّر مشروع الحاسبة ونفّذ التمارين التالية:
- أضف دالة
subtract()لطرح رقمين. - أضف دالة
multiply()لضرب رقمين. - اكتب اختبارات للقيم الموجبة والسالبة والصفر.
- استخدم
parametrizeلتجربة خمس حالات لكل دالة. - اكتب اختبارًا يتأكد أن
average([])ترفعValueError. - أنشئ fixture تعيد قائمة درجات تجريبية.
- ضع الاختبارات داخل مجلد
tests. - شغّل الاختبارات باستخدام الخيار
-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 مهمة بعد تعلم أساسيات بايثون؟
في مرحلة الأساسيات، تركز غالبًا على كتابة الكود وتشغيله. بعد ذلك تبدأ مشاريعك في احتواء عدة ملفات ودوال وكلاسات، ويصبح من الصعب التأكد يدويًا أن كل شيء ما زال يعمل.
تعلم الاختبارات يساعدك على:
- اكتشاف الأخطاء مبكرًا.
- تعديل الكود بثقة أكبر.
- منع عودة الأخطاء التي تم إصلاحها.
- تنظيم سلوك الدوال بصورة واضحة.
- تطوير مشاريع أكبر بطريقة احترافية.
لهذا السبب تعتبر الاختبارات من المهارات المهمة عند الانتقال من تعلم الأوامر الأساسية إلى بناء مشاريع بايثون حقيقية.
روابط داخلية مفيدة من بايثون العرب
- كورس بايثون بعد الأساسيات
- اختبار الدوال باستخدام unittest في بايثون
- تنظيم ملفات مشروع Python بطريقة صحيحة
- شرح pip وتثبيت مكتبات Python
- تشغيل ملف Python في CMD وTerminal وVS Code
- شرح try وexcept والتعامل مع الأخطاء
- مولد هيكل مشاريع بايثون
مصادر خارجية مفيدة
- دليل البدء الرسمي في pytest
- توثيق assert في pytest
- توثيق fixtures في 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. الأهم هو كتابة اختبارات مفيدة ومنظمة.



