Django + tox:应用程序尚未加载

Django + tox: Apps aren't loaded yet

我正在迁移 Django 项目以使用 Tox 和 pytest。当 运行 tox.

时,我得到以下信息
_________________________________________ ERROR collecting fixtureless/tests/test_django_project/test_app/tests/test_factory.py _________________________________________
fixtureless/tests/test_django_project/test_app/tests/test_factory.py:10: in <module>
    from test_app.models import ModelOne, ModelTwo
fixtureless/tests/test_django_project/test_app/models.py:11: in <module>
    class ModelOne(models.Model):
.tox/py36-django21/lib/python3.6/site-packages/django/db/models/base.py:87: in __new__
    app_config = apps.get_containing_app_config(module)
.tox/py36-django21/lib/python3.6/site-packages/django/apps/registry.py:249: in get_containing_app_config
    self.check_apps_ready()
.tox/py36-django21/lib/python3.6/site-packages/django/apps/registry.py:132: in check_apps_ready
    raise AppRegistryNotReady("Apps aren't loaded yet.")
E   django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

这是我的 tox 文件。

[tox]
skipsdist = true
envlist =
    py{36,37}-django21,
    py{36,37}-django22,

# Add environment to use the default python3 installation
[testenv]
setenv =
    PYTHONDONTWRITEBYTECODE=1
    PYTHONPATH = {toxinidir}:{toxinidir}/fixtureless/tests/test_django_project
    DJANGO_SETTINGS_MODULE = settings.postgres
deps =
    pillow
    psycopg2
    pytest
    django21: Django>=2.1,<2.2
    django22: Django>=2.2,<2.3
commands = pytest

好像 django.setup() 没有被调用什么的。我对毒素还很陌生。任何帮助将不胜感激。

这是一个开源项目 (django-fixtureless) and I have been successfully running the Django test suite using the instructions outlined here

Django 不知道如何 运行 pytest 风格的测试函数。 Plain pytest 也不提供 django 集成。您可以

  • 写一个自定义测试运行ner(一个最小的例子):

    # myapp/runner.py
    
    class PytestRunner:
        def run_tests(self, test_labels):
            import pytest    
            return pytest.main(test_labels)
    

    并将您的应用配置为使用它而不是默认 DiscoverRunner:

    # myapp/settings.py
    TEST_RUNNER = 'myapp.runner.PytestRunner'
    

    现在 python manage.py test 将调用 pytest 而不是默认的 unittest

  • 或使用pytest-django插件。将其添加到 deps:

    deps =
        ...
        pytest
        pytest-django
        ...
    

    这本身不提供与 manage.py test 的集成,但您将能够像往常一样通过 pytest:

    调用测试
    $ pytest --ds=myapp.settings
    ...
    

    该插件还提供了许多重新实现 Django 测试助手(如 RequestFactoryClient 等)的有用装置,因此您可以完成 unittest 式测试的完整端口 类 到 pytest 风格的测试函数。有关配置详细信息和代码示例,请参阅 pytest-django docs