Python sys.path包括py.test rootdir,用于相对于项目根导入测试

Python sys.path包括py.test rootdir,用于相对于项目根导入测试,python,pytest,Python,Pytest,我在pytest的sys.path列表中没有包含我的项目rootdir时遇到问题。相反,它包括默认情况下测试所在的目录 这是我的项目结构 proj/ setup.py mypackage/ __init__.py a.py tests/ test_a.py 使用运行pytest时 py.test proj/mypackage/tests 它将proj/mypackage/tests插入sys.path,这不好,因为现在我无法导入,因为它与tests

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

这是我的项目结构

proj/
  setup.py
  mypackage/
    __init__.py
    a.py
    tests/
      test_a.py
使用运行pytest时

py.test proj/mypackage/tests
它将proj/mypackage/tests插入sys.path,这不好,因为现在我无法导入,因为它与tests目录无关


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

我使用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)
然后将该文件放在tests目录中。默认情况下,conftest.py文件将在任何其他文件之前运行,因此其他测试将能够导入mypackage

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