"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > إتقان Pytest Monkeypatch: تبسيط الاختبار الخاص بك

إتقان Pytest Monkeypatch: تبسيط الاختبار الخاص بك

نشر في 2025-02-09
تصفح:675

Mastering Pytest Monkeypatch: Simplify Your Testing

عندما يتعلق الأمر بالاختبار في بيثون ، فإن ضمان اختبارات موثوقة ومعزولة أمر بالغ الأهمية. أحد التحديات الشائعة هو كيفية السخرية من أو تعديل سلوك الكائنات والوظائف أثناء الاختبارات. هذا هو المكان الذي تضيء فيه لاعبا اساسيا monkeypatch pytest. يوفر طريقة مرنة لاستبدال أجزاء من الكود ديناميكيًا أثناء الاختبار.

في هذه المدونة ، سنستكشف قوة monkeypatch ، ولماذا تكون مفيدة ، وكيف يمكنك استخدامها لكتابة اختبارات نظيفة وفعالة.


ما هو monkeypatch؟

تتيح لك لاعبا اساسيا monkeypatch في pytest تعديل أو استبدال:

  • وظائف أو طرق
  • سمات الكائنات
  • متغيرات البيئة

هذا التعديل الديناميكي مؤقت ويطبق فقط على نطاق الاختبار ، مما يضمن استعادة السلوك الأصلي بمجرد انتهاء الاختبار. هذا يجعل Monkeypatch مفيدًا بشكل خاص لسخر التبعيات أو التبعيات المتجددة أو اختبار التعليمات البرمجية في ظل ظروف محددة دون إجراء تغييرات دائمة.


لماذا تستخدم monkeypatch؟

إليك بعض سيناريوهات المفاتيح حيث يمكن لـ Monkeypatch تبسيط الاختبارات الخاصة بك:

  1. التبعيات السخرية : استبدال التبعيات الخارجية بكائنات أو وظائف وهمية لاختبار وحدات معزولة.
  2. اختبار حالات الحافة : محاكاة سلوكيات الحافة مثل الاستثناءات أو قيم إرجاع محددة.
  3. تتغير البيئة المؤقتة : تعديل متغيرات البيئة لاختبار المنطق الخاص بالتكوين.
  4. استبدال الأساليب : تجاوز مؤقتًا طرق الفئات أو الوحدات النمطية.

أمثلة على استخدام monkeypatch

1. السخرية من الوظيفة

افترض أن لديك وظيفة تعتمد على واجهة برمجة التطبيقات الخارجية:

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"

لاختبار المنطق دون الاتصال فعليًا واجهة برمجة التطبيقات ، يمكنك أن تسخر من Fetch_data:

# test_my_app.py
from my_app import fetch_data

def test_fetch_data(monkeypatch):
    def mock_fetch_data():
        return "Mocked Response"

    monkeypatch.setattr("my_app.fetch_data", mock_fetch_data)

    assert fetch_data() == "Mocked Response"

2. متغيرات البيئة الغالبة

تخيل أنك تختبر وظيفة تعتمد على متغيرات البيئة:

# config.py
import os

def get_database_url():
    return os.getenv("DATABASE_URL", "default_url")

يمكنك استخدام monkeypatch لمحاكاة بيئات مختلفة:

# test_config.py
from config import get_database_url

def test_get_database_url(monkeypatch):
    monkeypatch.setenv("DATABASE_URL", "mocked_url")

    assert get_database_url() == "mocked_url"

3. يسخر من طريقة في الفصل

إذا كنت بحاجة إلى استبدال طريقة داخل الفصل مؤقتًا:

# my_class.py
class Calculator:
    def add(self, a, b):
        return a   b

اختبر السلوك باستخدام طريقة وهمية:

# test_my_class.py
from my_class import Calculator

def test_calculator_add(monkeypatch):
    def mock_add(self, a, b):
        return 42

    monkeypatch.setattr(Calculator, "add", mock_add)

    calc = Calculator()
    assert calc.add(1, 2) == 42

4. السخرية من الوظائف المدمجة

يمكنك حتى السخرية من وظائف مدمجة لسيناريوهات محددة:

# my_module.py
def is_file_openable(filename):
    try:
        with open(filename, "r"):
            return True
    except IOError:
        return False

نفتح لمحاكاة سلوكيات مختلفة:

# test_my_module.py
from my_module import is_file_openable

def test_is_file_openable(monkeypatch):
    def mock_open(filename, mode):
        raise IOError("Mocked IOError")

    monkeypatch.setattr("builtins.open", mock_open)

    assert not is_file_openable("test.txt")

أفضل الممارسات مع monkeypatch

  1. SCOPE : استخدم monkeypatch فقط ضمن نطاق الاختبار لتجنب الآثار الجانبية.
  2. تجنب الإفراط في الاستخدام : احتجاز monkeypatch للسيناريوهات التي لا تكون فيها حقن التبعية أو أنماط التصميم الأخرى غير ممكنة.
  3. استخدم مسارات صريحة : عند تعيين السمات ، قم بتوفير المسارات الصريحة والكائن لمنع التعديلات العرضية.
  4. استعادة الإعدادات الافتراضية : يعيد MonkeyPatch تلقائيًا الحالة الأصلية ، ولكن تجنب التسلسل أو التعشيش للحفاظ على الاختبارات البسيطة.

خاتمة

Pytest's Monkeypatch هي أداة قوية لكتابة اختبارات معزولة وموثوقة ونظيفة. سواء كنت تسخر من وظيفة ، أو متغيرات البيئة المتجددة ، أو حالات اختبار الحافة ، يمكن لـ Monkeypatch تبسيط سير عمل اختبارك بشكل كبير.

من خلال دمج الأمثلة وأفضل الممارسات الموضحة هنا ، يمكنك جعل جناح الاختبار الخاص بك قويًا ويمكن صيانته. استكشف وثائق Pytest الرسمية لمعرفة المزيد وإلغاء تأمين الإمكانات الكاملة لـ Pytest!

اختبار سعيد!

بيان الافراج يتم استنساخ هذه المقالة على: https://dev.to/mohamedabdelwahab/mastering-pytest-monkeypatch-simplify-your-testing-jj8؟1 إذا كان هناك أي انتهاك ، فيرجى الاتصال بـ [email protected] لحذفها.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3