ModuleNotFoundError 与 pytest

新手上路,请多包涵

我希望我的 测试文件夹与我的应用程序代码分开。我的项目结构是这样的

myproject/
  myproject/
    myproject.py
    moduleone.py
  tests/
    myproject_test.py

我的项目.py

 from moduleone import ModuleOne

class MyProject(object)
....

我的项目_test.py

 from myproject.myproject import MyProject
import pytest

...

我使用 myproject.myproject 因为我使用命令

python -m pytest

从项目根目录 ./myproject/

但是,这些模块中的导入失败了

E ModuleNotFoundError: 没有名为“moduleone”的模块

我正在运行 Python 3.7 并且从 3.3 开始读到,空的 __init__ 不再需要文件,这意味着我的项目变成了一个 隐式命名空间包

However, I have tried adding an __init__.py file in myproject/myproject/ and also tried adding a conftest.py file in myproject/ but neither works

我已经 阅读 了说要 弄乱路径的 答案,然后在其他问题中发表了评论,说 不要

什么是正确的方法,我错过了什么?

编辑;

可能相关,我使用 requirements.txt 使用 pip 安装 pytest。这可能有关系吗?如果是这样,在这种情况下安装 pytest 的正确方法是什么?

编辑 2:

sys.path 中的路径之一是 /usr/src/app/ 这是一个与 /my/local/path/myproject/ 的 docker 卷。

音量应该改为 /my/local/path/myproject/myproject/ 吗?

原文由 myol 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 813
2 个回答

解决方案:使用 PYTHONPATH 。变量

PYTHONPATH=. pytest

正如@J_H 所提到的,您需要显式添加项目的根目录,因为 pytest 只会添加到 sys.path 测试文件所在的目录(这就是为什么@Mak2006 的答案有效。 )


好的做法:使用 Makefile 或其他一些自动化工具

如果你不想一直输入那个长命令,一个选择是在你的项目的根目录中创建一个 Makefile ,例如:

 .PHONY: test
test:
    PYTHONPATH=. pytest

这使您可以简单地运行:

 make test

另一种常见的替代方法是使用一些标准测试工具,例如 tox

原文由 Arthur Colombini Gusmão 发布,翻译遵循 CC BY-SA 4.0 许可协议

不确定此解决方案是否特定于我的问题,但我只是将 __init__.py 添加到我的 tests 文件夹,这解决了问题。

原文由 Erfan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题