Pytest奇怪的ImportError

时间:2018-10-02 19:27:04

标签: python virtualenv pytest

在我的项目上运行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。

2 个答案:

答案 0 :(得分:0)

我在动态导入方面也遇到了类似的问题,并且看到这可以解决我的问题

如果您在文件ekiim/panflute/utils.py(Github代码)的第46行中检查类ContextImport

该类的作用是,它用作上下文管理器,因此您可以为其提供一个文件(带有其绝对路径),并将该文件导入该上下文中。

因此,也许可以通过修改此上下文管理器,将项目目录放入路径,然后还原更改(退出上下文时)。

该类通过将路径放在sys.path列表的第一项中来工作,也许这就是您的问题,您只是将其追加到路径列表中。

不过,我不确定这是正确的还是Python的。

答案 1 :(得分:-4)

运行用于Pytest的命令以找到您的test _ *。py文件时,您必须位于测试目录中。

尝试研究if __name__ == "__main__":,但请先查看Pytest文档中的反模式和抽象。如果您的体系结构遵循Pytest标准,则可能不需要此步骤。