If you want to use Pytest for running the test suite in your Django project, all you need to do is to install pytest-django, tell it where to look for the Django settings file - usually by placing a
pytest.ini file in the project root folder - and you're ready to go. However, even though the
pytest.ini file is probably the most common way to point pytest-django to the settings file, it also the last place in which pytest-django will look for it. In fact, every time you run
pytest, pytest-django will check for the
DJANGO_SETTINGS_MODULE variable in the following order:
- command line option with
- environment variables
While this order would work perfectly fine for many projects, if you happen to have an enviroment variable pointing to a different settings file (e.g. if you're running your project in a Docker container), it might reveals itself as a bit of a bummer. So, what are the available options for preventing django-pytest from picking up the wrong variable?
This is probably a no-brainer, but the most obvious way to make sure pytest-django picks up the right settings file is to pass the
--ds option when invoking
pytest from the command line.
While it certainly works, it adds quite a lot of typing - especially if you use a settings module instead of a single setting file, since it could easily translate into
$ pytest --ds=project_folder.settings_folder.settings_file
Certainly not something I'd like to do every time I want to run the test suite.
Setting the environment variable
Another way around the issue is to set the environment variable to the test settings file before every test run and the setting it back to its original value once you're finished.
However, besides still requiring quite a lot of typing, this method is also extremely error prone. What if you forget to set the environment variable back after test running? So, unless you're willing to take the risk of frustrating debugging time trying to figure out why your app is not working as it should, this option is pretty much a no-op.
addopts in the
Wouldn't be awesome if you could just use the
pytest.ini file, set all the necessary settings in there, and not have to worry ever again? Actually you can, thanks to
addopts does is to add options (hence the double d!) to your test run as if they were specified via command line. So, for example, if you want to update and export coverage every time you run the suite, you would write this in the
[pytest] addopts = --cov=. --cov-report=html
and every time you run
pytest it will, behind the scene, be interpreted as if you have run
$ pytest --cov=. --cov-report=html
Thus, by adding
addopts it is possible to override pytest-django discovery order and make sure that the value in the
pytest.ini file gets read instead of environment variable.
Ok, but what if you want to point pytest to a different settings file for one run only? No problem! One of the perks of this method is that you can esplicitly pass the
--ds option from the command line to override the one in the
pytest.ini file. So running
$ pytest --ds=other_settings_file
will just work as usual. Neat!Go Top