تعدد المعاملات وتغطية الاختبارات
شغّل الاختبارات بمدخلات متعددة باستخدام @pytest.mark.parametrize
تعدد المعاملات وتغطية الاختبارات درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.
@pytest.mark.parametrize
شغّلوا الاختبار نفسه باستخدام مدخلات متعددة عبر @pytest.mark.parametrize. وتمثل كل tuple حالة اختبار منفصلة.
import pytest
@pytest.mark.parametrize("a,b,expected", [
(1, 2, 3),
(0, 0, 0),
(-1, 1, 0),
(10, -5, 5),
])
def test_add(a, b, expected):
assert a + b == expectedمعامل واحد
بالنسبة إلى معامل واحد، مرّروا قائمة القيم مباشرةً.
import pytest
@pytest.mark.parametrize("n", [1, 2, 3, 4, 5])
def test_positive(n):
assert n > 0معرّفات الاختبارات المسماة
وفّروا قائمة ids لتسمية كل مجموعة معاملات والحصول على مخرجات أوضح.
import pytest
@pytest.mark.parametrize("value,result", [
(2, True),
(3, False),
], ids=["even", "odd"])
def test_is_even(value, result):
assert (value % 2 == 0) == resultتكديس مزينات parametrize
كدّسوا مزينَي parametrize للحصول على الجداء الديكارتي للمدخلات.
import pytest
@pytest.mark.parametrize("x", [1, 2])
@pytest.mark.parametrize("y", [10, 20])
def test_product(x, y):
assert x * y > 0 # 4 test cases: (1,10),(1,20),(2,10),(2,20)pytest-cov: التثبيت
ثبّتوا pytest-cov لقياس الأسطر من الشيفرة التي تغطيها الاختبارات.
# pip install pytest-cov
# Basic usage:
# pytest --cov=mypackage
# HTML report:
# pytest --cov=mypackage --cov-report=htmlقراءة مخرجات التغطية
تُظهر التغطية الأسطر أو الفروع أو العبارات التي لم تصل إليها الاختبارات.
# Name Stmts Miss Cover
# ------- ----- ---- -----
# mypackage/utils.py 20 3 85%
#
# Missing: lines 45, 67, 88تغطية الفروع
استخدموا --cov-branch لتتبّع ما إذا كان قد جرى اختبار كلا فرعي العبارات الشرطية.
# pytest --cov=mypackage --cov-branch
def is_positive(n):
if n > 0: # branch 1: True
return True
return False # branch 2: Falseالفشل عند انخفاض التغطية
استخدموا --cov-fail-under=N لإفشال عملية البناء إذا انخفضت التغطية عن N بالمئة.
# pytest --cov=mypackage --cov-fail-under=80
# FAIL Required test coverage of 80% not reached. Total: 72%.coveragerc Configuration
اضبطوا استثناءات التغطية في .coveragerc لتخطّي الشيفرة النمطية.
# .coveragerc
[run]
omit =
*/migrations/*
*/tests/*
setup.py
[report]
exclude_lines =
pragma: no cover
if TYPE_CHECKING:ما المقصود بالتغطية الجيدة
لا تضمن التغطية المرتفعة صحة الاختبارات. استهدفوا التأكيدات الهادفة، لا مجرد المرور على الأسطر. وتُعد نسبة 80-90% هدفًا عمليًا لمعظم المشاريع.
# A covered but useless test:
def test_nothing():
is_positive(5) # no assert — 100% coverage, zero confidence
# A meaningful test:
def test_positive():
assert is_positive(5) is True
assert is_positive(-1) is Falseدمج parametrize والتغطية
تحسّن الاختبارات ذات المعاملات التغطية تلقائيًا من خلال اختبار مسارات متعددة في الشيفرة باستخدام تعريف اختبار واحد.
import pytest
@pytest.mark.parametrize("n,expected", [
(5, True), (-1, False), (0, False)
])
def test_is_positive(n, expected):
assert is_positive(n) == expectedتحقّق سريع
ماذا يفعل --cov-fail-under=90 عند تشغيل pytest؟
مراجعة
استخدموا @pytest.mark.parametrize لاختبار مدخلات متعددة بوضوح. وقيسوا تغطية الشيفرة باستخدام pytest-cov، وتتبّعوا الفروع باستخدام --cov-branch، وفرضوا الحدود الدنيا باستخدام --cov-fail-under.
الأسئلة الشائعة
هل درس «تعدد المعاملات وتغطية الاختبارات» مجاني؟
نعم — نص درس «تعدد المعاملات وتغطية الاختبارات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.
ماذا ستتعلم في «تعدد المعاملات وتغطية الاختبارات»؟
شغّل الاختبارات بمدخلات متعددة باستخدام @pytest.mark.parametrize تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟
لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «تعدد المعاملات وتغطية الاختبارات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟
نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- كتابة اختبارات pytest الأولى
- التركيبات والإعداد/التنظيف
- تعدد المعاملات وتغطية الاختبارات
- المحاكاة باستخدام unittest.mock