Django py.test 找不到设置模块

21 投票
5 回答
13207 浏览
提问于 2025-04-17 17:51

我有以下的项目结构:

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 这一行报错(这是预期的结果)。这说明 base 已经在 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 文件(取消注释那一行)来设置,效果也是一样。

看起来我好像漏掉了什么???

5 个回答

0

为什么你的设置里有三个“t”?应该是“settings”,而不是“setttings”。

1

根据文档的内容,base 似乎已经在你的路径中,所以你可能想要使用

py.test --ds=settings.settings
24

因为django.conf.settings是懒加载的,它只有在你尝试访问它的时候才会去导入设置模块。这就是为什么当你只是导入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 wrapper):

当你开始一个新项目时,只需通过在项目目录下执行这一行,将项目的根目录添加到virtualenv的PYTHONPATH中:

add2virtualenv .

撰写回答