我开始使用pytest,我觉得我设置错了。
我的目录名为" cyan"我的所有代码。它有一些顶级的东西和一个lib目录,其中包含所有正常工作的代码,正常情况下。
我有一个测试目录,我试图进行pytest测试。
我目前有一个测试:test_A:
import pytest
from cyan.lib import dataCrunch
import os,sys
def test_foo():
print os.getcwd()
print sys.path
assert 1==0
您会注意到来自cyan.lib导入的""线。它应该是来自lib import",但这不起作用。
从测试结果中可以清楚地看出它不起作用的原因:
/Users/brianp/work/cyan
['/Users/brianp/work', .........]
....正如预期的那样,都是标准的图书馆venv东西。
当我从正常的python运行中打印sys.path时,我得到:
['', .........]
这似乎是正确的。
因此,当我运行pytest时,坐在青色目录中,父目录进入python路径而不是当前目录。
我在所有适当的目录中都有__init__.py
。
增加:
好的,感谢@ timchap的评论,我已经学到了一些东西:
Tim发布的文档暗示在我的青色目录中使用pytest.ini应该使其成为rootdir。那不起作用。
似乎正在发生的事情是它从测试目录开始,并在路径中查找,直到找到一个没有__init__.py
的目录。由于我的根目录有一个,它一直持续到父目录。
也许这就是整个问题?我的根目录有__init__.py
?看起来像是一个奇怪的假设......
答案 0 :(得分:2)
要向@ timchap的回答添加详细信息:
Rootdir的计算方式与他发布的链接完全相同。
但是,rootdir不是用于确定pythonpath(sys.path)的内容。
通常,当你运行python时,它会添加'' (或'。')到pythonpath,这样可以导入当前目录中的东西,pytest尝试做一些更复杂的事情。
pytest查找(我相信)测试目录,并一直向上查找,直到找到一个没有__init__.py
的目录。如果你的项目的根目录由于任何原因恰好有__init__.py
,那么它将会过高一个目录,并且可能所有本地导入(除非它们是相对的)都会失败。
答案 1 :(得分:1)
The pytest documentaiton提供了有关如何确定pytest运行的根目录的一些信息。这似乎并不能解释您的观察结果,但它确实提供了对根目录决定应该如何工作的一些见解。
经过一些反思后,我认为你观察到的行为是有道理的 - pytest似乎试图将当前包的父目录添加到路径中,因此使用当前包的绝对导入的模块可以正常工作。 / p>
为避免将来出现这种歧义,您可以考虑在测试模块中使用相对导入。