Pytest从父目录运行?

时间:2017-07-17 22:25:27

标签: python pytest

我开始使用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?看起来像是一个奇怪的假设......

2 个答案:

答案 0 :(得分:2)

要向@ timchap的回答添加详细信息:

Rootdir的计算方式与他发布的链接完全相同。

但是,rootdir不是用于确定pythonpath(sys.path)的内容。

通常,当你运行python时,它会添加'' (或'。')到pythonpath,这样可以导入当前目录中的东西,pytest尝试做一些更复杂的事情。

pytest查找(我相信)测试目录,并一直向上查找,直到找到一个没有__init__.py的目录。如果你的项目的根目录由于任何原因恰好有__init__.py,那么它将会过高一个目录,并且可能所有本地导入(除非它们是相对的)都会失败。

答案 1 :(得分:1)

The pytest documentaiton提供了有关如何确定pytest运行的根目录的一些信息。这似乎并不能解释您的观察结果,但它确实提供了对根目录决定应该如何工作的一些见解。

经过一些反思后,我认为你观察到的行为是有道理的 - pytest似乎试图将当前包的父目录添加到路径中,因此使用当前包的绝对导入的模块可以正常工作。 / p>

为避免将来出现这种歧义,您可以考虑在测试模块中使用相对导入。