我确实有以下项目结构
base
__init.py
settings
__init__.py
settings.py
tests
pytest.ini
test_module.py
我的pytest.ini
看起来像这样:
[pytest]
#DJANGO_SETTINGS_MODULE =base.settings.settings
我的test_module.py
看起来像这样:
def test_django():
from base.settings import settings as base_settings
from django.conf import settings as django_settings
assert 3==5
我现在跑步时:
py.test
它会毫无问题地运行导入,并会在assert 3==5
引发错误(如预期的那样)。这告诉我基数在sys.path
上,可以导入base.settings.settings
。
现在我将test_module.py
更改为:
def test_django():
from base.settings import settings as base_settings
from django.conf import settings as django_settings
print django_settings.xxx
assert 3==5
我现在跑步时:
py.test --ds=base.settings.settings
我收到错误:
错误:无法导入设置'base.settings.settings'(是否在sys.path上?):没有名为base.settings.settings的模块。
当我没有通过命令行设置设置,但是通过pytest.ini
文件(通过取消注释该行)时,效果相同。
看起来我想念这里的东西???
答案 0 :(得分:20)
因为django.conf.settings是惰性的,所以只有在您尝试访问它时才会尝试导入设置模块。这就是您只需导入设置对象时测试不会失败的原因。
您的问题已在此处讨论:https://github.com/pelme/pytest_django/issues/23
这是pytest的问题,而不是pytest-django本身。 Pytest由于某种原因从sys.path中删除当前目录。它应该很容易解决。
解决方案1:
PYTHONPATH=`pwd` py.test
解决方案2:
将此添加到您的conftest.py(我假设conftest.py与您的应用位于同一目录中):
import os
import sys
sys.path.append(os.path.dirname(__file__))
解决方案3(如果您使用的是virtualenv包装器):
当你开始一个新项目时,只需将项目的根目录添加到virtualenv的PYTHONPATH中 在项目目录中执行此行:
add2virtualenv .
答案 1 :(得分:1)
为什么你的设置中有3个“t”? 它应该是设置而不是设置
答案 2 :(得分:0)
From the docs,似乎base
已经在你的路径中 - 所以也许你想要使用
py.test --ds=settings.settings
答案 3 :(得分:0)
你运行没有--ds=base.settings.settings
参数的第二个程序而不是第一个程序。这是错误似乎来自的地方。
同样在导入同名settings
的代码时,我很想做类似的事情:
from base.settings import settings as foo
from django.conf import settings as bar
答案 4 :(得分:0)
我有同样的问题。 pytest -s <project_dir>
对我来说很好。