There are a couple of different ways Django settings can be provided for the tests.
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
Example:
$ pytest --ds=test.settings
Example contents of pytest.ini:
[pytest] DJANGO_SETTINGS_MODULE = test.settings
Example contents of pyproject.toml:
[tool.pytest.ini_options] DJANGO_SETTINGS_MODULE = "test.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
.
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"
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=...)
Settings can be overridden by using the :fixture:`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.
pytest-django calls :func:`django.setup` automatically. If you want to do
anything before this, you have to create a pytest plugin and use
the :func:`~_pytest.hookspec.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 :pytest-confval:`addopts`.