1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
.. _configuring_django_settings:
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 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 <https://pypi.python.org/pypi/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 :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.
Changing your app before Django gets set up
-------------------------------------------
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`.
|