在我的项目上运行PyTest时遇到一个奇怪的问题。项目结构看起来像这样。
myproject
├── env
│ └── stuff
├── __init__.py
├── myproject
│ ├── __init__.py
│ └── myfile.py
└── tests
├── __init__.py
└── framework
└── unit
└── test_myfile.py
myproject / myproject中的代码运行良好。此外,在myproject根目录中还有一些带有代码的文件夹,这些文件夹引用了myproject / myproject中的代码作为模块。
但是当我使用以下语法(在virutalenv内部)运行pytest
(env) myproject $ python3.6 -m pytest tests/framework
所有测试均失败,并显示以下错误消息:
E ModuleNotFoundError: No module named 'myproject.tests'
E _pytest.nodes.Collector.CollectError: ImportError while importing test module '/home/myuser/projects/myproject/tests/__init__.py'.
E Hint: make sure your test modules/packages have valid Python names.
E Traceback:
E ModuleNotFoundError: No module named 'myproject.tests'
的输出
(env) myproject $ python3.6 -c "import sys; print('\n'.join(sys.path))"
是
/home/myuser/projects/myproject/env/lib/python36.zip
/home/myuser/projects/myproject/env/lib/python3.6
/home/myuser/projects/myproject/env/lib/python3.6/lib-dynload
/usr/lib/python3.6
/home/myuser/projects/myproject/env/lib/python3.6/site-packages
然后按照其他帖子中的答案进行操作,即使我通过.pth文件将myproject,myproject / myproject和myproject / test手动添加到路径中,也会收到相同的错误消息。
解决错误消息的方法是在myproject / myproject中添加一个名为tests的空文件夹。完成之后,错误消息消失并且测试运行正常。谁能解释造成这种奇怪行为的原因?
编辑:注释中的解决方案。问题是由于不应该存在的顶级 init .py。
答案 0 :(得分:0)
我在动态导入方面也遇到了类似的问题,并且看到这可以解决我的问题
如果您在文件ekiim/panflute/utils.py(Github代码)的第46行中检查类ContextImport
,
该类的作用是,它用作上下文管理器,因此您可以为其提供一个文件(带有其绝对路径),并将该文件导入该上下文中。
因此,也许可以通过修改此上下文管理器,将项目目录放入路径,然后还原更改(退出上下文时)。
该类通过将路径放在sys.path
列表的第一项中来工作,也许这就是您的问题,您只是将其追加到路径列表中。
不过,我不确定这是正确的还是Python的。
答案 1 :(得分:-4)
运行用于Pytest的命令以找到您的test _ *。py文件时,您必须位于测试目录中。
尝试研究if __name__ == "__main__":
,但请先查看Pytest文档中的反模式和抽象。如果您的体系结构遵循Pytest标准,则可能不需要此步骤。