تستخدم مجموعة الاختبار الخاصة بنا 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؟
ما هو إصدار 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
التعليق الأكثر فائدة
إليك تركيبات لتمكين تركيبات مستوى الجلسة لـ db التي أستخدمها. إنها تشبه الطريقة الموثقة ولكنها أيضًا تتراجع في نهاية جلسة الاختبار.