Django + tox:应用尚未加载

时间:2019-08-17 12:22:23

标签: python django testing pytest tox

我正在迁移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]
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),我已经按照here概述的说明成功运行了Django测试套件。

1 个答案:

答案 0 :(得分:2)

Django不知道如何运行pytest样式的测试函数。纯pytest也不提供Django集成。您可以

  • 编写一个自定义测试运行器(一个最小的示例):

    # 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样式的测试类的完整端口移植到{ {1}}型测试功能。有关配置的详细信息和代码示例,请参见pytest docs