sys.path 包括 py.test rootdir 以使测试相对于项目根目录导入

jac*_*ton 4 python pytest

我在使用 pytest 时遇到问题,在 sys.path 列表中不包括我的项目 rootdir。相反,它包括默认情况下测试所在的目录。

这是我的项目结构。

proj/
  setup.py
  mypackage/
    __init__.py
    a.py
    tests/
      test_a.py
Run Code Online (Sandbox Code Playgroud)

运行 pytest 时

py.test proj/mypackage/tests
Run Code Online (Sandbox Code Playgroud)

它将proj/mypackage/tests插入到 sys.path 中,这并不好,因为现在我无法导入 a,因为它与测试目录无关。

我注意到 py.test 检测到一个 rootdir,它被识别为我的项目的根目录,即 proj 目录。这是我在测试期间在 sys.path 中想要的,所以我的所有代码都是相对于该目录的。我如何确保 py.test在 sys.path 中包含(...)/proj/以便我可以import mypackage.a在 test_a.py 中。

der*_*ers 5

我使用 conftest.py 将包路径(相对于 conftest.py 文件)附加到 sys.path 以便可以导入包。像这样的东西:

# contents of conftest.py
import sys
from os.path import abspath, dirname
package_path = abspath(dirname(dirname(__file__)))
sys.path.insert(0, package_path)
Run Code Online (Sandbox Code Playgroud)

然后,您可以将此文件放在测试目录中。默认情况下,conftest.py 文件将在其他任何事情之前运行,因此其他测试将能够导入 mypackage。

另一种可能更好的方法是添加一个 setup.py 并遵循此处给出的建议。