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.


$ export DJANGO_SETTINGS_MODULE=test.settings
$ pytest


$ DJANGO_SETTINGS_MODULE=test.settings pytest

Command line option --ds=SETTINGS


$ pytest --ds=test.settings

pytest.ini settings

Example contents of pytest.ini:


pyproject.toml settings

Example contents of pyproject.toml:

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 as tox.ini or pyproject.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:

$ pytest

Command Line Option:

$ pytest --dc=MySettings

INI File Contents:


pyproject.toml File Contents:


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 file:

from django.conf import settings

def pytest_configure():

Overriding individual settings

Settings can be overridden by using the settings fixture:

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:

def pytest_load_initial_conftests(early_config, parser, args):

    def noop(*args, **kwargs):
        pass = noop

This plugin can then be used e.g. via -p in addopts.