django setting environment variables in unittest tests django setting environment variables in unittest tests python python

django setting environment variables in unittest tests


The test.support.EnvironmentVarGuard is an internal API that might be changed from version to version with breaking (backward incompatible) changes. In fact, the entire test package is internal use only. It was explicitly stated on the test package documentation page that it's for internal testing of core libraries and NOT a public API. (see links below)

You should use patch.dict() in python's standard lib unittest.mock. It can be used as a context manager, decorator or class decorator. See example code below copied from the official Python documentation.

import osfrom unittest.mock import patchwith patch.dict('os.environ', {'newkey': 'newvalue'}):    print(os.environ['newkey'])  # should print out 'newvalue'    assert 'newkey' in os.environ  # should be Trueassert 'newkey' not in os.environ  # should be True

Update: for those who doesn't read the documentation thoroughly and might have missed the note, read more test package notes at

https://docs.python.org/2/library/test.html or

https://docs.python.org/3/library/test.html


As @schillingt noted in the comments, EnvironmentVarGuard was the correct way.

from test.test_support import EnvironmentVarGuard # Python(2.7 < 3)from test.support import EnvironmentVarGuard # Python >=3from django.test import TestCaseclass MyTestCase(TestCase):    def setUp(self):        self.env = EnvironmentVarGuard()        self.env.set('VAR', 'value')    def test_something(self):        with self.env:            # ... perform tests here ... #            pass

This correctly sets environment variables for the duration of the context object with statement.


If you are loading your environment variables in Django's settings.py file like this:

import osENV_NAME = os.environ.get('ENV_NAME', 'default')

You could use this:

from django.test import TestCase, override_settings@override_settings(ENV_NAME="super_setting")def test_...(self):