Es wäre schön, so etwas zu tun:
if settings.TESTING:
print("py.test is being ran")
"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.
Hilfreichster Kommentar
"pytest" in sys.modules
?