سيكون من الجيد أن تفعل شيئًا مثل:
if settings.TESTING:
print("py.test is being ran")
"pytest" in sys.modules
؟
يمكنك إضافة إعداد بنفسك بملف إعدادات منفصل للاختبارات
أعتقد أن الأساليب التي اقترحها blueyed و adamchainz يجب أن تكون كافية إذا لزم الأمر. بشكل عام ، لا يُنصح بتغيير طريقة عمل الكود الخاص بك عن طريق الاستبطان فيما إذا كان يتم استدعاء الرمز من الاختبارات أم لا. إذا تم القيام بذلك ، فيمكن القيام به بطريقة pytest عامة (لا يقتصر الأمر حقًا على pytest-django). شكرًا على الاقتراح ، لا تتردد في إعادة فتح هذه المشكلة إذا كانت لديك معلومات إضافية حول هذه المشكلة!
مثال ذي صلة من مستندات pytest اكتشف ما إذا كان يعمل من داخل تشغيل pytest :
# content of conftest.py
def pytest_configure(config):
import sys
sys._called_from_test = True
def pytest_unconfigure(config):
import sys
del sys._called_from_test
المشكلة هي أن pytest_configure
يتم تشغيله بعد settings.py
. هل هناك طريقة لتشغيل هذا الرمز قبل settings.py
؟
تضمين التغريدة
ما هو الخطأ في استخدام 'pytest' in sys.modules
؟
حسنًا ، نعم ، لقد نجحت ، على الرغم من أنها تبدو صعبة بعض الشيء بالنسبة لي.
هناك طريقة أخرى سريعة وقذرة للتحقق من ذلك في settings.py وهي
TESTING = os.path.basename(sys.argv[0]) in ('pytest', 'py.test')
تضمين التغريدة
ما هو الخطأ في استخدام'pytest' in sys.modules
؟
حقيقة أنه تم استيراد pytest لا تعني أن pytest
قيد التشغيل ويتم استدعاء الرمز من الاختبار. في الأساس ، أحد الواردات الخاصة بي pytest
لشيء آخر. يستورد pytest أيضًا pytest
حتى لو أظهر مساعدة CLI: pytest --help
هذه حالة استخدام صالحة جدًا:
لدي إعداد django قابل للتكوين مع الملفات والمتغيرات المحلية حيث يتم وضع أوراق اعتماد مختلفة وتهيئة بيئة تطوير محلية أخرى. لكني أريد أن لا تستخدم الوحدات الخاصة بي بيانات الاعتماد هذه أو الإعدادات المحددة أبدًا لعدم استخدامها عن طريق الخطأ على نظام حقيقي (إذا تم الاستهزاء به بشكل غير صحيح) أو اجتياز / فشل تكوين dev env المحلي. لذلك أريد استبعاد هذه الإعدادات المحلية عند تشغيلها مع pytest.
لدي شيء مثل:
import os
import os.path
import sys
from split_settings.tools import include, optional
def is_pytest_running():
return (os.getenv('PYTEST_RUNNING') == 'true' or
os.path.basename(sys.argv[0]) in ('pytest', 'py.test'))
ENVVAR_SETTINGS_PREFIX = 'MV_SERVER_'
local_settings_path = os.getenv(f'{ENVVAR_SETTINGS_PREFIX}SETTINGS', '../../../local/settings.py')
includes = [
'base.py',
'logging.py',
'custom.py',
]
if not is_pytest_running():
includes.append(optional(local_settings_path))
includes.append('envvars.py')
include(*includes)
يعد استخدام os.getenv('PYTEST_RUNNING') == 'true'
طريقة نظيفة إلى حد ما للقيام بذلك ، ولكن المشكلة تكمن في تعيين هذا المتغير. إعداده في conftest.py لا يعمل لأن pytest-django يستورد الإعدادات قبل تنفيذ conftest.py. يعد إعداده في سطر الأوامر عند تشغيل pytest أمرًا غير مريح كما أنه يتعارض مع الغرض: إذا نسي شخص ما تعيينه ، فسيتم استخدام بيانات الاعتماد الحقيقية من تهيئة dev env المحلية.
os.path.basename (sys.argv [0]) في ('pytest'، 'py.test')
اضطررت لتغييره إلى os.path.basename(os.path.dirname(sys.argv[0])) in ('pytest', 'py.test')
لأن sys.argv[0]
كان يخرج كـ /home/project/venv/lib/python3.8/site-packages/pytest/__main__.py
.
التعليق الأكثر فائدة
"pytest" in sys.modules
؟