0Pricing
Python Academy · درس

تعدد المعاملات وتغطية الاختبارات

شغّل الاختبارات بمدخلات متعددة باستخدام @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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. كتابة اختبارات pytest الأولى
  2. التركيبات والإعداد/التنظيف
  3. تعدد المعاملات وتغطية الاختبارات
  4. المحاكاة باستخدام unittest.mock
← العودة إلى Python Academy