[Fixed]-"Apps aren't loaded yet" when trying to run pytest-django

12πŸ‘

βœ…

Out of the box, pytest doesn’t know about the Django database, even with pytest-django installed. Never fear, though: pytest-django makes it easy for your tests to access the Django database using its django_db pytest mark.

Give this a try:

import pytest


@pytest.mark.django_db
def test_was_published_recently_with_future_question():
    time = timezone.now() + datetime.timedelta(days=30)
    future_question = Question(pub_date=time)
    assert future_question.was_published_recently() is False
πŸ‘€Franey

7πŸ‘

I had a similar problem when invoking tests either with pytest or python setup.py test.

For pytest invocation installing pytest-django in my virtual env solved the problem.

For python setup.py install adding pytest-django to the tests_require argument of setup() solved it.

Here’s the snippet of setup.py:

TEST_REQUIREMENTS = [
    'pytest',
    'pytest-django',
    'pylint',
    'pylint_django',
    'git-pylint-commit-hook',
]

setup(
    name='foo',
    version='0.0.1',
    description='Foo package',
    author='...',
    author_email='...',
    packages=['foo'],
    install_requires=INSTALL_REQUIREMENTS,
    setup_requires=SETUP_REQUIREMENTS,
    tests_require=TEST_REQUIREMENTS,
)

5πŸ‘

According to Django: AppRegistryNotReady(), when not using manage.py one must call django.setup() explicitly. I verified this by running the pytest test from a manage.py shell:

Kurts-MacBook-Pro:mysite2 kurtpeek$ python3 manage.py shell
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct  3 2017, 00:32:08) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import pytest

In [2]: pytest.main('polls/tests.py')
================================= test session starts ==================================
platform darwin -- Python 3.6.3, pytest-3.2.3, py-1.4.34, pluggy-0.4.0
rootdir: /Users/kurtpeek/Documents/Scratch/mysite2, inifile: pytest.ini
plugins: timeout-1.2.1
collected 1 item                                                                        

polls/tests.py F

======================================= FAILURES =======================================
___________________ test_was_published_recently_with_future_question ___________________

    def test_was_published_recently_with_future_question():
        time = timezone.now() + datetime.timedelta(days=30)
        future_question = Question(pub_date=time)
>       assert future_question.was_published_recently() is False
E    assert True is False
E     +  where True = <bound method Question.was_published_recently of <Question: >>()
E     +    where <bound method Question.was_published_recently of <Question: >> = <Question: >.was_published_recently

polls/tests.py:18: AssertionError
=================================== warnings summary ===================================
None
  passing a string to pytest.main() is deprecated, pass a list of arguments instead.

-- Docs: http://doc.pytest.org/en/latest/warnings.html
========================= 1 failed, 1 warnings in 0.14 seconds =========================
Out[2]: 1

This is not really an acceptable solution, however, as the tests need to be runnable from the command line. Are there perhaps other pytest decorators to ensure the required setup?

πŸ‘€Kurt Peek

1πŸ‘

For me, setting the DJANGO_SETTINGS_MODULE as an export on the command line or in the pytest.ini solved the problem.
It seems to ignore the export of that env var in conftest.py
If I figure it out I will update this post.

0πŸ‘

Does it say somewhere in the docs that the test should work without subclassing django.test.TestCase? I don’t think that django-pytest does anything special in regards to loading django apps. So, if your class continues to inherit from TestCase, you should be able to use everything else from pytest, such as it’s assertions, fixtures, etc.

πŸ‘€MrName

0πŸ‘

Just by installing pytest-django in addition to existing pytest, the error was gone for me as well πŸ˜€

πŸ‘€liyapo

0πŸ‘

For me the issue was that I forgot to add pytest.ini to link pytest to my project settings – see the docs

# -- FILE: pytest.ini (or tox.ini)
[pytest]
DJANGO_SETTINGS_MODULE = test.settings
# -- recommended but optional:
python_files = tests.py test_*.py *_tests.py
πŸ‘€rdmolony

0πŸ‘

When trying to run pytest without starting up django, you might encounter this kind of issue.

To resolve the Apps aren't loaded yet error, I made the following changes:

  1. Created a test_settings.py file: I created a new file named test_settings.py in the config directory of my Django app with the same content from my settings.py.

  2. Imported django module and added django.setup() in the test_settings.py after other module imports and startup configurations.

This allowed me to initialize the Django app registry and other necessary components before running the tests.

Here’s how the test_settings.py file looks:

# test_settings.py

import django
... (other module imports and configurations)
django.setup()

By adding these two lines, the Apps aren't loaded yet error was resolved, and I was able to run my tests using pytest without any issues.

Here’s my project structure:

.
β”œβ”€β”€ Dockerfile
β”œβ”€β”€ app
β”‚Β Β  β”œβ”€β”€ config
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ asgi.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ celery.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ celery_beat_schedules.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ settings.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ test_settings.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ urls.py
β”‚Β Β  β”‚Β Β  └── wsgi.py
β”‚Β Β  β”œβ”€β”€ core
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ admin.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ apps.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ constants.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ decorators.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ enums.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ management
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── commands
β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ __init__.py
β”‚Β Β  β”‚Β Β  β”‚Β Β      └── wait_for_db.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ models.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ services.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ tests
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ factories.py
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ models
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── test_kr.py
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── views
β”‚Β Β  β”‚Β Β  β”‚Β Β      └── test_search_member.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ urls.py
β”‚Β Β  β”‚Β Β  └── views.py
β”‚Β Β  β”œβ”€β”€ manage.py
β”‚Β Β  β”œβ”€β”€ pytest.ini

Additional Note:
It’s important to ensure you have the pytest and pytest-django packages installed.

0πŸ‘

inspired by the answer above by @Peter Varshavsky
I had pytest installed, but invoking pytest was giving that error.
so installed pytest-django, then i created a pytest.ini file in the root directory with

[pytest]
DJANGO_SETTINGS_MODULE = projectname.settings

it also works if you just export the variable before running the command pytest.
now if i invoke pytest, it works succeussfully.

0πŸ‘

In the conftest.py file made the following changes before importing any other models / files.

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<MODULE_NAME>.settings")

import django
django.setup()

The above snippets helped me to resolve the issue for me.

πŸ‘€Mansi Shah

Leave a comment