Pytest-django: دعم الوصول إلى قاعدة البيانات لتركيبات مستوى "الدورة".

تم إنشاؤها على ٨ يونيو ٢٠١٥  ·  4تعليقات  ·  مصدر: pytest-dev/pytest-django

تستخدم مجموعة الاختبار الخاصة بنا TestRunner مخصصًا له طريقة run_suite مثل:

def run_suite(self, suite, **kwargs):
    call_command('loaddata', 'foo')
    call_command('loaddata', 'bar')
    return super(CustomTestRunner, self).run_suite(suite, **kwargs)

التركيبات التي يتم تحميلها شائعة جدًا بالفعل ومن المنطقي تحميلها في كل حالة اختبار. على سبيل المثال ، نستضيف عدة Site s من تطبيقنا ويقوم أحد التركيبات بتحميل مجموعة فرعية من تلك العناصر Site . توجد مفاتيح خارجية Site في جميع تطبيقاتنا تقريبًا ، لذا فمن المنطقي تحميل القليل منها قبل المجموعة بأكملها.

على الرغم من أنه من الناحية النظرية يجب أن أكون قادرًا على إعادة تسمية التركيبات إلى initial_data.json وتحميلها ، وذلك لأي سبب غريب لا يعمل. هذا عندما وجدت أنه لا توجد طريقة لوضع شريط لاصق فوقه في اختبار py.test ، لأن الوقت الوحيد المسموح فيه بالوصول db يكون على مستوى الوظيفة.

هل هناك أي خطط لتضمين عنصر أساسي على مستوى الجلسة للوصول إلى db؟

db-configuration

التعليق الأكثر فائدة

إليك تركيبات لتمكين تركيبات مستوى الجلسة لـ db التي أستخدمها. إنها تشبه الطريقة الموثقة ولكنها أيضًا تتراجع في نهاية جلسة الاختبار.

from django.db import transaction

@pytest.fixture(scope="session")
def initial_test_data(django_db_setup, django_db_blocker):
    with django_db_blocker.unblock():
        # Wrap in try + atomic block to do non crashing rollback
        try:
            with transaction.atomic():
                yield
                raise Exception
        except Exception:
            pass

@pytest.fixture(scope="session", autouse=True)
def some_initial_data(initial_test_data):
    # Data added here will stay in db for the whole test session

ال 4 كومينتر

ما هو إصدار Django الذي تستخدمه؟
لا يتم النظر في IIRC initial_data.json مع التطبيقات التي تستخدم الترحيل في Django 1.7+.

يبدو أن هناك حلًا بديلًا في (ربما مشكلة مكررة): https://github.com/pytest-dev/pytest-django/issues/105#issuecomment -61474664

يمكنك أيضًا استخدام إشارة عبر app/management/__init__.py للتغلب على هذا:

# Handle initial data in Django 1.7+.

from django.db.models import signals
from django.core.management import call_command

def load_initial_data(app_config, sender, **kwargs):
    my_label = __package__.split(".")[-2]
    if sender.label == my_label:
        call_command('loaddata', 'initial_data.yaml', app_label=my_label)

signals.post_migrate.connect(load_initial_data, weak=False)

راجع أيضًا https://github.com/pytest-dev/pytest-django/pull/220#issuecomment -83310828

آها! لقد حاولت بالفعل استخدام _django_db_setup لكنني حصلت على أخطاء حول عدم السماح لي بالوصول إلى قاعدة بيانات Django بدون علامة. أفترض أن _django_cursor_wrapper يمنع هذه المشكلة كما هو موضح في # 105. شكرا لك على الرابط blueyed

يبدو أن هذا سيسمح لي باستخدام قاعدة البيانات في تركيبات على مستوى الجلسة ، وسيحل مشكلتي. هل هناك أي مصلحة في جعل ذلك في المتناول بطريقة أكثر سهولة في الاستخدام؟ هل هذا الحل غير مدعوم وعرضة للانقطاع في المستقبل؟

هذا شيء يتم العمل عليه وسيتم دعمه بواسطة واجهة برمجة تطبيقات عامة. لقد قمت بتمييز هذه المشكلة بـ "تكوين db" وهي مشكلات تتعلق بوجود المزيد من الخيارات عندما يتعلق الأمر بتكوين قاعدة البيانات. سوف أقوم بتحديث هذه المشكلة بمزيد من المعلومات بمجرد أن تصبح هذه التغييرات رئيسية!

إليك تركيبات لتمكين تركيبات مستوى الجلسة لـ db التي أستخدمها. إنها تشبه الطريقة الموثقة ولكنها أيضًا تتراجع في نهاية جلسة الاختبار.

from django.db import transaction

@pytest.fixture(scope="session")
def initial_test_data(django_db_setup, django_db_blocker):
    with django_db_blocker.unblock():
        # Wrap in try + atomic block to do non crashing rollback
        try:
            with transaction.atomic():
                yield
                raise Exception
        except Exception:
            pass

@pytest.fixture(scope="session", autouse=True)
def some_initial_data(initial_test_data):
    # Data added here will stay in db for the whole test session
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

koxu1996 picture koxu1996  ·  3تعليقات

aljosa picture aljosa  ·  8تعليقات

rodrigorodriguescosta picture rodrigorodriguescosta  ·  4تعليقات

asfaltboy picture asfaltboy  ·  5تعليقات

mjk4 picture mjk4  ·  4تعليقات