Pytest-django: وفر طريقة لاكتشاف ما إذا كان Django يجري الاختبارات

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

سيكون من الجيد أن تفعل شيئًا مثل:

if settings.TESTING:
    print("py.test is being ran")

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

"pytest" in sys.modules ؟

ال 9 كومينتر

"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 .

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

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

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

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

ojake picture ojake  ·  6تعليقات

dan-passaro picture dan-passaro  ·  4تعليقات

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