django setzen von environment-Variablen in tests unittest
Ich möchte in der Lage sein, um das setzen von Umgebungsvariablen in meinem Django-app, die für die tests ausführen zu können. Zum Beispiel, meine Ansichten beruhen auf mehrere API-keys.
Gibt es Möglichkeiten, um override-Einstellungen während der Tests, aber ich will nicht, dass Sie definiert in settings.py
wie, dass ist eine Frage der Sicherheit.
Habe ich versucht, in meinem setup-Funktion zur Einstellung dieser Umgebungsvariablen, aber das funktioniert nicht zu geben, die Django-Anwendung die Werte.
class MyTests(TestCase):
def setUp(self):
os.environ['TEST'] = '123' # doesn't propogate to app
Wenn ich lokal testen, habe ich einfach ein .env
Datei habe ich mit
foreman start -e .env web
liefert os.environ
mit den Werten. Aber in Djangos unittest.TestCase
es nicht eine Möglichkeit (die ich kenne) setzen, die.
Wie kann ich dies umgehen?
- Haben Sie versucht, mit EnvironmentVarGuard?
- Ja, das war die richtige Antwort!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
test.support.EnvironmentVarGuard
ist eine interne API, die verändert werden kann, ist von version zu version mit brechen (rückwärts inkompatibel) ändert. In der Tat, die gesamtetest
Paket ist nur zur internen Verwendung. Es wurde ausdrücklich auf das test-Paket-Dokumentation-Seite, dass es für die internen Tests von core-Bibliotheken und NICHT eine öffentliche API. (siehe links unten)Sollten Sie verwenden
patch.dict()
in der python-standard-libunittest.mock
. Es kann verwendet werden als Kontext-manager, Dekorateur oder Klasse decorator. Siehe Beispiel-code unten kopiert von der offiziellen Python-Dokumentation.Update: für diejenigen, die nicht Lesen Sie die Dokumentation gründlich und vielleicht verpasst haben, der Hinweis, Lesen Sie mehr
test
Paket Hinweise aufhttps://docs.python.org/2/library/test.html oder
https://docs.python.org/3/library/test.html
class test.test_support.EnvironmentVarGuard
, in anderen Worten, es ist Teil destest
Paket, was ist ein Regressionstest-Paket für Python. Und dann Blättern Sie Ihre Seite ganz nach OBEN, Lesen Sie den Hinweis in der zweiten Zeile direkt nach dem Titel: Hinweis: Das test-Paket ist gedacht für die interne Nutzung durch Python nur. Es ist dokumentiert, für den Vorteil der core-Entwickler von Python. Jegliche Nutzung dieser Paket außerhalb der Python-standard-Bibliothek ist entmutigt, als code hier erwähnt zu ändern oder entfernt werden, ohne zu bemerken, zwischen den Versionen von Python.Als @schillingt angemerkt in den Kommentaren, EnvironmentVarGuard war der richtige Weg.
Diese richtig setzt die Umgebungsvariablen für die Dauer der Kontext-Objekt
with
- Anweisung.from test.support import EnvironmentVarGuard
. Allerdings, wenn Sie lieber nicht davon abhängen, ob für den internen Gebrauch nur code, die Sie kopieren konnten die python 2.7 Umsetzung der EnvironmentVarGuard in Ihrem eigenen code -- es ist ziemlich einfach.Mit
EnvironmentVarGuard
ist keine gute Lösung, wie es schlägt in einigen Umgebungen und arbeiten in anderen. siehe Beispiel unten.Eine bessere Lösung ist das, was vorgeschlagen wurde von erewok erfordert die Nutzung der
unittest.mock
in Python ist3.Vorausgesetzt, mit unittest
``
Wenn Sie laden Sie Ihre Umgebungsvariablen in Django ' s
settings.py
- Datei wie folgt:Können Sie diese:
os.environ
Variablen insettings.py
, und dann mit die - Variablen (a-lafrom django.conf import settings
) in dem gesamten code. Wenn Ihr code verwendet, zum Beispielmy_obj = MyClass(arg=settings.MY_ENV_VAR)
sind, dann werden Sie brauchen, um die Nutzung@override_settings()
wrapper, um richtig legen Sie IhreMY_ENV_VAR
in unit-tests. Wenn Sie Ihreos.environ
vars in sonstiger Weisemy_obj
werden nicht korrekt gestartetBenutze ich
py.test
als meine test-runner, und es ermöglicht Ihnen das erstellen einerpytest.ini
- Datei, in der Sie angeben können bestimmte Einstellungen der Datei zu verwenden, während der Ausführung von tests.Siehe Dokumentation dazu finden Sie hier:
http://pytest-django.readthedocs.org/en/latest/configuring_django.html#pytest-ini-settings
Ich empfehle py.test im Allgemeinen als ein test-runner, denn es unterstützt verschiedene Arten von test-Klassen und sogar einfache Funktionen, und es ist ziemlich einfach einzurichten, Leuchten oder anderen code, der ausgeführt wird vor und nach den tests.
settings.py
- Dateien, die nicht von environment-Variablen. Mein API-Aufrufe wie zum Beispiel AWS, etc sind mit Konstruktoren, die Umgebungsvariablen, nicht django-Einstellungen.boto
und anderen APIs aufzuhalten der Benutzung von Umgebungsvariablen ich möchte also in der Lage sein, diese zu benutzen. Ich war nur er die Analogie mit settings.pyAlte Frage, aber es kam in einer Google-Suche und keine der bestehenden Antworten geeignet sind. Wenn Sie pytest, env-vars gesetzt werden kann,/wieder mit pytest ist monkeypatching Funktionalität.
Zunächst, mein env-variable
PARTNER_CODE
warwow
.Konnte ich ändern kann, die env-variable mit dem folgenden:
Nun meine env-variable
PARTNER_CODE
sagtsos
.