Configuring Django settings
There are a couple of different ways Django settings can be provided for the tests.
The environment variable DJANGO_SETTINGS_MODULE
Running the tests with DJANGO_SETTINGS_MODULE
defined will find the
Django settings the same way Django does by default.
Example:
$ export DJANGO_SETTINGS_MODULE=test.settings
$ pytest
or:
$ DJANGO_SETTINGS_MODULE=test.settings pytest
Command line option --ds=SETTINGS
Example:
$ pytest --ds=test.settings
pytest.ini
settings
Example contents of pytest.ini:
[pytest]
DJANGO_SETTINGS_MODULE = test.settings
pyproject.toml
settings
Example contents of pyproject.toml:
[tool.pytest.ini_options]
DJANGO_SETTINGS_MODULE = "test.settings"
Order of choosing settings
The order of precedence is, from highest to lowest:
The command line option
--ds
The environment variable
DJANGO_SETTINGS_MODULE
The
DJANGO_SETTINGS_MODULE
option in the configuration file -pytest.ini
, or other file that Pytest finds such astox.ini
orpyproject.toml
If you want to use the highest precedence in the configuration file, you can
use addopts = --ds=yourtestsettings
.
Using django-configurations
There is support for using django-configurations.
To do so configure the settings class using an environment variable, the
--dc
flag, pytest.ini
option DJANGO_CONFIGURATION
or pyproject.toml
option DJANGO_CONFIGURATION
.
Environment Variable:
$ export DJANGO_CONFIGURATION=MySettings
$ pytest
Command Line Option:
$ pytest --dc=MySettings
INI File Contents:
[pytest]
DJANGO_CONFIGURATION=MySettings
pyproject.toml File Contents:
[tool.pytest.ini_options]
DJANGO_CONFIGURATION = "MySettings"
Using django.conf.settings.configure()
In case there is no DJANGO_SETTINGS_MODULE
, the settings
object can be
created by calling django.conf.settings.configure()
.
This can be done from your project’s conftest.py
file:
from django.conf import settings
def pytest_configure():
settings.configure(DATABASES=...)
Overriding individual settings
Settings can be overridden by using the settings
fixture:
@pytest.fixture(autouse=True)
def use_dummy_cache_backend(settings):
settings.CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.dummy.DummyCache",
}
}
Here autouse=True is used, meaning the fixture is automatically applied to all tests, but it can also be requested individually per-test.
Changing your app before Django gets set up
pytest-django calls django.setup()
automatically. If you want to do
anything before this, you have to create a pytest plugin and use
the pytest_load_initial_conftests()
hook, with
tryfirst=True
, so that it gets run before the hook in pytest-django
itself:
@pytest.hookimpl(tryfirst=True)
def pytest_load_initial_conftests(early_config, parser, args):
import project.app.signals
def noop(*args, **kwargs):
pass
project.app.signals.something = noop
This plugin can then be used e.g. via -p
in addopts
.