以Django tutorial中的(部分)投票应用程序为例,我试图让pytest-django运行。
使用命令django-admin startproject mysite2
,我创建了一个具有以下结构的项目目录:
.
├── db.sqlite3
├── manage.py
├── mysite2
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── polls
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
└── pytest.ini
字符串
我的pytest.ini
看起来像
[pytest]
DJANGO_SETTINGS_MODULE = mysite2.settings
python_files = tests.py test_*.py *_tests.py
型
按照教程,在polls/models.py
中,我创建了Question
和Choice
模型:
import datetime
from django.db import models
from django.utils import timezone
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
型
现在,如果我按照教程中的描述创建tests.py
,它基于Python的内置unittest
模块,
import datetime
from django.utils import timezone
from django.test import TestCase
from .models import Question
class QuestionModelTests(TestCase):
def test_was_published_recently_with_future_question(self):
time = timezone.now() + datetime.timedelta(days=30)
future_question = Question(pub_date=time)
self.assertIs(future_question.was_published_recently(), False)
型
我从命令行运行python manage.py test
,测试失败:
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
F
======================================================================
FAIL: test_was_published_recently_with_future_question (polls.tests.QuestionModelTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/kurtpeek/Documents/Scratch/mysite2/polls/tests.py", line 23, in test_was_published_recently_with_future_question
self.assertIs(future_question.was_published_recently(), False)
AssertionError: True is not False
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (failures=1)
Destroying test database for alias 'default'...
型
但是,如果我将测试代码更改为(尝试的)pytest
等效代码(即,无需子类TestCase
并使用普通Assert):
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
型
然后运行pytest
命令,得到以下错误:
================================= 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 0 items / 1 errors
======================================== ERRORS ========================================
___________________________ ERROR collecting polls/tests.py ____________________________
polls/tests.py:10: in <module>
from .models import Question
polls/models.py:6: in <module>
class Question(models.Model):
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/base.py:100: in __new__
app_config = apps.get_containing_app_config(module)
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/apps/registry.py:244: in get_containing_app_config
self.check_apps_ready()
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/apps/registry.py:127: in check_apps_ready
raise AppRegistryNotReady("Apps aren't loaded yet.")
E django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!
=============================== 1 error in 0.64 seconds ================================
型
到目前为止,我还没有找到解决这个问题的方法。有什么办法让测试进行吗?
8条答案
按热度按时间7gyucuyw1#
开箱即用,即使安装了
pytest-django
,pytest
也不知道Django数据库。但永远不要害怕:pytest-django
使您的测试可以使用其django_db pytest标记轻松访问Django数据库。给予这个:
字符串
8fq7wneg2#
我在调用
pytest
或python setup.py test
的测试时遇到了类似的问题。对于
pytest
调用,在我的虚拟环境中安装pytest-django
解决了这个问题。对于
python setup.py install
,将pytest-django
添加到setup()
的tests_require
参数中解决了这个问题。下面是
setup.py
的片段:字符串
os8fio9y3#
根据Django: AppRegistryNotReady(),当不使用
manage.py
时,必须显式调用django.setup()
。我通过从manage.py
shell运行pytest
测试来验证这一点:字符串
然而,这并不是一个真正可接受的解决方案,因为测试需要从命令行运行。是否有其他
pytest
装饰器来确保所需的设置?gz5pxeao4#
对我来说,将DJANGO_SETTINGS_MODULE设置为命令行或pytest.ini中的导出解决了这个问题。它似乎忽略了www.example.com中的env变量的导出conftest.py,如果我弄清楚了,我会更新这篇文章。
zhte4eai5#
文档中有没有说测试应该在没有子类化
django.test.TestCase
的情况下工作?我不认为django-pytest
在加载django应用程序方面有什么特别的功能。因此,如果您的类继续从TestCase
继承,您应该能够使用pytest
的其他所有内容,例如Assert、fixture等。vlju58qv6#
只要在现有的
pytest
之外再安装pytest-django
,错误也消失了:D8fsztsew7#
对我来说,问题是我忘记添加
pytest.ini
来将pytest
链接到我的项目设置-请参阅docs字符串
azpvetkf8#
当尝试在不启动django的情况下运行pytest时,您可能会遇到这种问题。
为了解决
Apps aren't loaded yet
错误,我做了以下更改:1.创建
test_settings.py
文件:我在Django应用程序的config目录中创建了一个名为test_settings.py的新文件,它的内容与我的settings.py
中的内容相同。1.导入
django
模块,并在其他模块导入和启动配置后在test_settings.py
中添加django.setup()
。这允许我在运行测试之前初始化Django应用程序注册表和其他必要的组件。
下面是
test_settings.py
文件的外观:字符串
通过添加这两行,
Apps aren't loaded yet
错误得到了解决,我可以使用pytest运行测试,没有任何问题。以下是我的项目结构:
型
附加说明:确保您安装了
pytest
和pytest-django
软件包非常重要。