我有这样的文件夹结构
App
--App
--app.py
--Docs
--Tests
--test_app.py
Run Code Online (Sandbox Code Playgroud)
在我test_app.py file,我有一行来导入我的应用程序模块.当我在根文件夹上运行py.test时,我得到关于没有名为app的模块的错误.我该如何配置?
jam*_*esc 38
使用Python 3并在类似的项目布局上获得相同的错误,我通过向模块添加__init__文件来解决它tests.
$ touch tests/__init__.py
Run Code Online (Sandbox Code Playgroud)
我在包装和导入方面不是很出色,但我认为这有助于pytest确定目标App模块的位置.
nch*_*pra 37
pytest使用命令运行python -m pytest有助于解决这个问题。
由于您当前的包尚未在您的$PYTHONPATH或sys.path- pytest 中,因此会出现此错误。
通过使用,python -m pytest您可以自动将工作目录添加到sys.path运行中pytest。他们的文档还提到:
这几乎相当于调用命令行脚本
pytest
ber*_*kyi 36
我已经__init__.py在/App/App目录中有一个文件,并且想要从项目根目录运行测试而没有任何路径错误的魔法:
python -m pytest tests
Run Code Online (Sandbox Code Playgroud)
输出立即如下所示:
? python -m pytest tests
====================================== test session starts ======================================
platform linux -- Python 3.5.1, pytest-2.9.0, py-1.4.31, pluggy-0.3.1
rootdir: /home/andrew/code/app, inifile:
plugins: teamcity-messages-1.17
collected 46 items
... lines omitted ...
============================= 44 passed, 2 skipped in 1.61 seconds ==============================
Run Code Online (Sandbox Code Playgroud)
小智 14
我遇到了类似的问题,不得不__init__.py从根目录中删除并__init__.py在tests文件夹中添加一个。
Dun*_*eal 13
所以你跑步py.test了/App.你确定/App/App在你的$PYTHONPATH吗?
如果不是,则尝试import app使用此类消息失败的代码.
编辑0:包括我在下面的评论中的信息,以确保完整性.
导入应用程序的尝试只有在内部执行时才会成功/App/App,这不是这里的情况.您可能希望/App/App通过放入其中来创建包,并将__init__.py导入更改为限定应用程序from App import app.
EDIT1:根据要求,在下面的第二条评论中添加进一步的解释.
通过放入__init__.py内部/App/App,该目录成为一个包.这意味着您可以从中导入,只要它 - 目录 - 在中可见$PYTHONPATH.即你可以从做的App import app,如果/App是在$PYTHONPATH.您当前的工作目录会自动添加到$PYTHONPATH,因此当您运行脚本时/App,导入将起作用.
在为我的应用程序运行测试用例时,我也遇到了同样的错误,如下所示
myproject
--app1
--__init.py__
--test.py
--app2
--__init.py__
--test.py
--__init.py__
Run Code Online (Sandbox Code Playgroud)
我删除了myproject 的 init.py文件来运行我的测试用例。
您也可以将一个空conftest.py文件添加到根应用程序文件夹中。
(如果您查看问题文件夹结构,它将与“Tests”文件夹处于同一级别,而不是在其中)。
conftest.pyPytest在所有项目文件夹中查找文件。
conftest.py为 pytest 找到它的文件树提供配置。因为 pytest 以某种方式扫描从 conftest.py 文件夹开始的所有子目录,所以它应该在测试文件夹之外找到包/模块(只要 conftest.py 文件位于您的应用程序根文件夹中) 。
最终,您可能想在空的 conftest.py 中编写一些代码,专门用于在不同的测试文件之间共享固定装置,以避免重复代码。毕竟,编写测试时也应该遵循 DRY 原则(Don't Repeat Yourself)。
添加__init.py__到测试文件夹还应该帮助 pytest 在整个应用程序中查找模块。但是,请注意,Python 3.3+ 具有隐式命名空间包,允许它创建没有__init__.py文件的包。话虽如此,__init__.py为此特定目的创建文件似乎更像是 pytest 的解决方法,而不是 python 的要求。有关更多信息,请参阅:Is __init__.py not required for packages in Python 3.3+