File: configuring_django.rst

package info (click to toggle)
pytest-django 4.11.1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 604 kB
  • sloc: python: 4,006; makefile: 39; sh: 17
file content (136 lines) | stat: -rw-r--r-- 3,709 bytes parent folder | download
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`.