sys.path 包括 py.test rootdir 以相对于项目根目录导入测试
sys.path including py.test rootdir to make tests import relative to project root
我在使用 pytest 时遇到问题,没有将我的项目 rootdir 包含在 sys.path 列表中。相反,它包含默认情况下测试所在的目录。
这是我的项目结构。
proj/
setup.py
mypackage/
__init__.py
a.py
tests/
test_a.py
当 运行 pytest 与
py.test proj/mypackage/tests
它将 proj/mypackage/tests 插入到 sys.path 中,这不好,因为现在我无法导入 a,因为它与测试目录无关。
我注意到 py.test 检测到一个 rootdir,这被认为是我的项目的根目录,即 proj 目录。这就是我在测试期间 sys.path 中想要的,因此我的所有代码都与该目录相关。我如何确保 py.test 在 sys.path 中包含 (...)/proj/ 以便我可以 import mypackage.a
在 test_a.py 中。
我使用 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)
然后您可以将此文件放在测试目录中。默认情况下,conftest.py 文件将在任何其他内容之前得到 运行,因此其他测试将能够导入 mypackage。
另一种可能更好的方法是添加 setup.py 并遵循给出的建议 here.
我在使用 pytest 时遇到问题,没有将我的项目 rootdir 包含在 sys.path 列表中。相反,它包含默认情况下测试所在的目录。
这是我的项目结构。
proj/
setup.py
mypackage/
__init__.py
a.py
tests/
test_a.py
当 运行 pytest 与
py.test proj/mypackage/tests
它将 proj/mypackage/tests 插入到 sys.path 中,这不好,因为现在我无法导入 a,因为它与测试目录无关。
我注意到 py.test 检测到一个 rootdir,这被认为是我的项目的根目录,即 proj 目录。这就是我在测试期间 sys.path 中想要的,因此我的所有代码都与该目录相关。我如何确保 py.test 在 sys.path 中包含 (...)/proj/ 以便我可以 import mypackage.a
在 test_a.py 中。
我使用 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)
然后您可以将此文件放在测试目录中。默认情况下,conftest.py 文件将在任何其他内容之前得到 运行,因此其他测试将能够导入 mypackage。
另一种可能更好的方法是添加 setup.py 并遵循给出的建议 here.