0Pricing
Python Academy · درس

التركيبات والإعداد/التنظيف

استخدم التركيبات لمشاركة حالة الاختبار وإعداد الموارد

التركيبات والإعداد/التنظيف درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.

ما التركيبات الإضافية؟

التركيبات الإضافية هي دوال مزيّنة بـ @pytest.fixture توفر تبعيات الاختبار. ويحقنها pytest حسب الاسم.

import pytest

@pytest.fixture
def user():
    return {"name": "Alice", "age": 30}

def test_name(user):
    assert user["name"] == "Alice"

الإعداد والتنظيف باستخدام yield

أعيدوا قيمة التركيبة الإضافية باستخدام yield داخلها لفصل الإعداد (قبل yield) عن التنظيف (بعد yield).

import pytest

@pytest.fixture
def db_connection():
    conn = create_connection()  # setup
    yield conn
    conn.close()                # teardown

def test_query(db_connection):
    result = db_connection.query("SELECT 1")
    assert result is not None

نطاقات الـ fixture

تحكّموا في عدد مرات إنشاء الـ fixture باستخدام scope: function (الافتراضي)، class، module، session.

import pytest

@pytest.fixture(scope="module")
def expensive_resource():
    print("\nSetup once per module")
    yield object()
    print("\nTeardown once per module")

مشاركة الـ fixtures عبر conftest.py

ضعوا الـ fixtures في conftest.py لمشاركتها بين ملفات الاختبار دون عمليات استيراد.

# conftest.py
import pytest

@pytest.fixture
def config():
    return {"env": "test", "debug": True}

# test_app.py
def test_env(config):
    assert config["env"] == "test"

اعتماديات الـ fixture

يمكن أن يعتمد الـ fixture على fixtures أخرى من خلال إدراجها كمعاملات.

import pytest

@pytest.fixture
def base_url():
    return "http://localhost:8000"

@pytest.fixture
def api_client(base_url):
    return Client(base_url)

def test_get(api_client):
    resp = api_client.get("/health")
    assert resp.status_code == 200

Fixtures ذات التشغيل التلقائي

اضبطوا autouse=True لتطبيق الـ fixture على جميع الاختبارات ضمن نطاقه دون إدراجه كمعامل.

import pytest

@pytest.fixture(autouse=True)
def reset_env(monkeypatch):
    monkeypatch.setenv("ENVIRONMENT", "test")

def test_env():
    import os
    assert os.environ["ENVIRONMENT"] == "test"

الـ fixture ‏tmp_path

يوفّر pytest الـ fixture المضمّن tmp_path، الذي يمنح كل اختبار مجلدًا مؤقتًا جديدًا.

def test_write_file(tmp_path):
    f = tmp_path / "hello.txt"
    f.write_text("hello")
    assert f.read_text() == "hello"

الـ fixture ‏monkeypatch

يتيح لكم monkeypatch استبدال السمات أو متغيرات البيئة أو إدخالات القواميس مؤقتًا أثناء الاختبار.

def get_env():
    import os
    return os.environ.get("MODE", "prod")

def test_mode(monkeypatch):
    monkeypatch.setenv("MODE", "test")
    assert get_env() == "test"

الـ fixture ‏capsys

يلتقط capsys مخرجات stdout وstderr أثناء الاختبارات.

def greet(name):
    print(f"Hello, {name}!")

def test_greet(capsys):
    greet("Alice")
    out, err = capsys.readouterr()
    assert out == "Hello, Alice!\n"

المنظفات النهائية للـ fixture باستخدام request.addfinalizer

بديل عن yield: سجّلوا عملية التنظيف باستخدام request.addfinalizer.

import pytest

@pytest.fixture
def resource(request):
    r = acquire_resource()
    request.addfinalizer(r.release)
    return r

Fixtures ذات المعاملات

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

import pytest

@pytest.fixture(params=["sqlite", "postgres"])
def db(request):
    return create_db(request.param)

def test_insert(db):
    db.insert({"id": 1})
    assert db.count() == 1

تحقّق سريع

أي نطاق للـ fixture ينشئه مرة واحدة لجلسة الاختبار بأكملها؟

مراجعة

توفّر الـ fixtures إعدادًا وتهيئةً لاحقةً قابلين لإعادة الاستخدام عبر yield. استخدموا scope للتحكم في دورة الحياة، وconftest.py للمشاركة، وautouse=True للتطبيق التلقائي.

الأسئلة الشائعة

هل درس «التركيبات والإعداد/التنظيف» مجاني؟

نعم — نص درس «التركيبات والإعداد/التنظيف» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.

ماذا ستتعلم في «التركيبات والإعداد/التنظيف»؟

استخدم التركيبات لمشاركة حالة الاختبار وإعداد الموارد تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟

لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «التركيبات والإعداد/التنظيف»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟

نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

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

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