Pytest-django: Stellen Sie eine Möglichkeit bereit, um zu erkennen, ob Django Tests durchführt

Erstellt am 6. Mai 2016  ·  9Kommentare  ·  Quelle: pytest-dev/pytest-django

Es wäre schön, so etwas zu tun:

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

Hilfreichster Kommentar

"pytest" in sys.modules ?

Alle 9 Kommentare

"pytest" in sys.modules ?

Sie können selbst eine Einstellung mit einer separaten Einstellungsdatei für Tests hinzufügen

Ich denke, die von @blueyed und @adamchainz vorgeschlagenen

Relevantes Beispiel aus den pytest-Dokumenten Erkennen, wenn innerhalb eines pytest-Laufs ausgeführt wird :

# 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

Das Problem ist, dass pytest_configure nach settings.py . Gibt es eine Möglichkeit, diesen Code vor settings.py auszuführen?

@axil
Was ist falsch daran, 'pytest' in sys.modules ?

Hmm, ja, es funktioniert, obwohl es für mich etwas hackig aussieht.

Eine weitere schnelle und schmutzige Möglichkeit, dies in settings.py zu überprüfen, ist

TESTING = os.path.basename(sys.argv[0]) in ('pytest', 'py.test')

@axil
Was ist falsch daran, 'pytest' in sys.modules ?

Die Tatsache, dass pytest importiert wird, bedeutet nicht, dass pytest wird und der Code von einem Test aufgerufen wird. Grundsätzlich kann ich pytest für etwas anderes importieren. Außerdem importiert pytest pytest auch wenn es nur eine CLI-Hilfe anzeigt: pytest --help

Hier ist ein sehr gültiger Anwendungsfall:
Ich habe die Django-Einstellung, die mit lokalen Dateien und Variablen konfigurierbar ist, in denen verschiedene Anmeldeinformationen und andere lokale dev env-Konfigurationen eingegeben werden. Aber ich möchte, dass meine Unittests diese Anmeldeinformationen oder spezifischen Einstellungen niemals verwenden, um sie nicht versehentlich auf einem echten System zu verwenden (wenn sie unsachgemäß verspottet werden) oder bei der lokalen dev env-Konfiguration erfolgreich zu sein/fehlschlagen. Daher möchte ich, dass diese lokalen Einstellungen bei der Ausführung mit pytest ausgeschlossen werden.

Ich habe sowas wie:

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)

Die Verwendung von os.getenv('PYTEST_RUNNING') == 'true' ist mehr oder weniger sauber, aber das Problem besteht darin, diese Variable zu setzen. Das Festlegen in conftest.py funktioniert nicht, da pytest-django Einstellungen importiert, bevor conftest.py ausgeführt wird. Das Festlegen in der Befehlszeile beim Ausführen von pytest ist unpraktisch und verfehlt auch den Zweck: Wenn jemand vergisst, es festzulegen, werden echte Anmeldeinformationen aus der lokalen dev env-Konfiguration verwendet.

os.path.basename(sys.argv[0]) in ('pytest', 'py.test')

Ich musste es in os.path.basename(os.path.dirname(sys.argv[0])) in ('pytest', 'py.test') ändern, da sys.argv[0] als /home/project/venv/lib/python3.8/site-packages/pytest/__main__.py herauskam.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

tolomea picture tolomea  ·  4Kommentare

rodrigorodriguescosta picture rodrigorodriguescosta  ·  4Kommentare

WoLpH picture WoLpH  ·  7Kommentare

MRigal picture MRigal  ·  3Kommentare

asfaltboy picture asfaltboy  ·  5Kommentare