حول المحتوى:
كيفية كتابة اختبارات فعّالة، تنظيم مشاريع الاختبار، استخدام fixtures، اختبار الأداء، ودمج pytest مع CI للحصول على تغطية عالية وجودة كود أفضل.
الاختبار الآلي يعد أحد أعمدة تطوير البرمجيات الحديثة، وتعد اختبارات الوحدات (Unit Testing) وسيلة فعّالة لجعل الكود أكثر قوة ومرونة وسهل الصيانة. في عالم بايثون، يبرز إطار العمل pytest كأحد أشهر وأقوى الأدوات لكتابة اختبارات وحدات بإنتاجية وسلاسة عالية. في هذا الدليل العملي، سوف نتعلم معًا كيفية كتابة اختبارات فعّالة، تنظيم مشروعك للاختبارات، استخدام fixtures، اختبار الأداء (Performance testing)، ودمج pytest مع أدوات التكامل المستمر (CI) لضمان تغطية شاملة، واستمرارية جودة البرمجية.
اختبار الوحدات يمثل بداية جودة البرمجيات الحديث، حيث يقوم المطورون بفحص كل وحدة برمجية (دالة، كلاس، موديول) بصورة معزولة عن باقي أجزاء النظام. فائدة هذه الاختبارات تكمن في:
ولمعرفة المزيد حول مبادئ كتابة الكود النظيف واحترافية البرمجة، يمكنك الاطلاع على هذا الشرح حول Clean Code في ifhmsah.
pyttest هو إطار اختبار مرن وقوي يجمع بين البساطة والميزات المتقدمة، ويدعم كتابة اختبارات واضحة وسهلة الفهم حتى للمبتدئين، مع قدرات متقدمة ومرونة لتناسب المشاريع الكبيرة والمعقدة.
pip install pytest requirements.txt ضمن مشروعك، وأضف فيه pytest لتسهيل الإدارة لاحقاً.tests/ أو test_*.py.يفضل دائماً تنظيم ملفات الاختبار بصورة واضحة. مثال على هيكلة مشروع بايثون صغيرة مع اختبارات:
my_project/ ├── src/ │ └── calculator.py ├── tests/ │ └── test_calculator.py ├── requirements.txt
لنفترض أن لديك ملف calculator.py في مجلد src يحتوي على دالة بسيطة:
# src/calculator.py
def add(x, y):
return x + y
لإجراء اختبار على الدالة السابقة:
# tests/test_calculator.py
from src.calculator import add
def test_add():
assert add(3, 2) == 5
لتشغيل الاختبارات، من سطر الأوامر داخل المشروع:
pytest سوف يقوم pytest بشكل تلقائي بالبحث عن الملفات التي تبدأ بـ test_ أو تنتهي بـ _test.py وتشغيل جميع الاختبارات التي تحمل دوال تبدأ بـ test_.
test_add_with_positive_numbers).assert ... هو قلب كل اختبار في pytest.Fixtures في pytest تسمح لك بتمرير بيانات، تهيئة بيئة الاختبار، إنشاء بيانات افتراضية، أو إعداد قاعدة بيانات، بشكل تلقائي قبل (أو بعد) الاختبارات.
import pytest
from src.calculator import add
@pytest.fixture
def sample_numbers():
return (2, 5)
def test_add_with_fixture(sample_numbers):
x, y = sample_numbers
assert add(x, y) == 7
وترث الاختبارات جميع مزايا fixture بدون تكرار الكود، أو تكرار خطوات الإعداد.
scope="module" مثلاً) لتقليل الموارد create/teardown.autouse=True لجعل fixture تُستخدم تلقائياً لكل اختبار داخل الملف.اختبار الأداء يُستخدم للتحقق من سرعة ودقة الدوال عند تنفيذها مع كميات ضخمة من البيانات. يمكنك استخدام pytest-benchmark لتسهيل عملية اختبار الأداء.
pip install pytest-benchmark def slow_add(x, y):
# دالة اصطناعية بطيئة
import time
time.sleep(0.1)
return x + y
def test_add_performance(benchmark):
result = benchmark(slow_add, 10, 5)
assert result == 15
pytest tests/ --benchmark-only استخدم تقارير الأداء للتحقق أن التغييرات الجديدة لم تؤثر على سرعة الكود.
واحدة من أهم نقاط قوة pytest هي قدرته على التكامل مع أدوات تغطية الكود (code coverage)، مثل coverage.py. هذه الأدوات توفّر تقارير بنسب الكود المغطى باختبارات الوحدات، وتبرز السطور غير المختبرة.
pip install pytest-cov pytest --cov=src tests/ التكامل مع أنظمة CI (مثل GitHub Actions, GitLab CI, Travis CI) أمر بالغ الأهمية لضمان سير الإصدارات البرمجية بثقة. تستطيع إعداد السيرفر الخاص بك لفحص جميع الاختبارات تلقائياً عند كل دفع أو Merge لتنبيه المطورين بأي فشل أو نقص في التغطية.
.github/workflows/python-app.yml).pytest --cov=src tests/التكامل المستمر سيقلل من الأعطال المفاجئة، ويزيد موثوقية المشروع عبر جميع مراحل التطوير.
إذا كنت تستخدم البرمجة غير المتزامنة (async/await) في مشروعك، فلاحظ أن pytest يدعم اختبار الدوال اللا تزامنية عبر إضافة مكتبة pytest-asyncio. للاطلاع أكثر على البرمجة غير المتزامنة وأهميتها راجع موضوعنا: البرمجة غير المتزامنة في بايثون: تحسين الأداء باستخدام async و await.
import pytest
import asyncio
async def fetch_data():
await asyncio.sleep(0.1)
return 42
@pytest.mark.asyncio
async def test_fetch_data():
result = await fetch_data()
assert result == 42
مع القليل من الإعدادات الإضافية، ستحصل على اختبارات شاملة حتى للكود المتقدم والمعاصر.
تعلم pytest اختبارات وحدات بايثون هو استثمار طويل الأمد لجودة مشاريعك. كتابة اختبارات فعّالة ومنظمة لا ترفع فقط من جودة المنتج البرمجي، بل تؤدي أيضًا إلى بيئة عمل أكثر أمانًا وكفاءة. دمج أدوات تغطية الكود، Fixtures، واختبار الأداء مع CI سيجعل مشروعك ضمن المشاريع القوية والموثوقة.
تابع قسم البرمجة في افهم صح وراجع أفضل مقالاتنا حول Clean Code وغيرها من المواضيع المتقدمة لصقل مهاراتك البرمجية.
كيفية كتابة اختبارات فعّالة، تنظيم مشاريع الاختبار، استخدام fixtures، اختبار الأداء، ودمج pytest مع CI للحصول على تغطية عالية وجودة كود أفضل.
مساحة اعلانية