سؤال

أريد أن أكتب اختبارات يمكنها إظهار ما إذا كانت قاعدة البيانات متزامنة مع ملفmodels.py الخاص بي أم لا.في الواقع لقد قمت بكتابتها بالفعل، فقط لأكتشف أن Django ينشئ قاعدة بيانات جديدة في كل مرة يتم فيها تشغيل الاختبارات بناءً على ملفmodels.py.هل هناك أي طريقة يمكنني من خلالها اختبار النماذج.py استخدام مخطط قاعدة البيانات الموجودة؟الموجود في mysql/postgresql، وليس الموجود في /myapp/models.py ؟

لا أهتم بالبيانات الموجودة في قاعدة البيانات، أنا أهتم فقط بها مخطط أي.أريد أن تلاحظ اختباراتي ما إذا كان الجدول الموجود في قاعدة البيانات يحتوي على حقول أقل من المخطط الموجود في ملفmodels.py الخاص بي.

أنا أستخدم إطار عمل Unittest (في الواقع امتداد Django له) إذا كان لهذا أي صلة.

شكرًا

هل كانت مفيدة؟

المحلول

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

للقيام بذلك، تحتاج إلى نسخ طريقة run_test من django.test.simple إلى موقع في مشروعك - لقد وضعت موقعي في myproject/test/test_runner.py

ثم قم بإجراء التغييرات التالية على تلك الطريقة:

// change
old_name = settings.DATABASE_NAME
from django.db import connection
connection.creation.create_test_db(verbosity, autoclobber=not interactive)
result = unittest.TextTestRunner(verbosity=verbosity).run(suite)
connection.creation.destroy_test_db(old_name, verbosity)

// to:
result = unittest.TextTestRunner(verbosity=verbosity).run(suite)

تأكد من إجراء جميع عمليات الاستيراد الضرورية في الأعلى ثم في ملف الإعدادات الخاص بك، قم بتعيين الإعداد:

TEST_RUNNER = 'myproject.test.test_runner.run_tests'

الآن، عند تشغيل اختبار ./manage.py، سيقوم Django بإجراء الاختبارات مقابل الحالة الحالية لقاعدة البيانات الخاصة بك بدلاً من إنشاء إصدار جديد بناءً على تعريفات النموذج الحالي لديك.

شيء آخر يمكنك القيام به هو إنشاء نسخة من قاعدة البيانات الخاصة بك محليًا، ثم إجراء فحص في طريقة run_test() الجديدة الخاصة بك مثل هذا:

if settings.DATABASE_NAME != 'my_test_db': 
    sys.exit("You cannot run tests using the %s database. Please switch DATABASE_NAME to my_test_db in settings.py" % settings.DATABASE_NAME) 

وبهذه الطريقة لن يكون هناك خطر من إجراء اختبارات على قاعدة بياناتك الرئيسية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top