我什么时候应该使用pytest --import-mode importlib

问题描述

这是我的项目结构:

git_dir/
    root/
        __init__.py
        tests/
            __init__.piy
            test1.py
        foo_to_test/
            foo.py

我正在使用pytest测试foo.py,而test1.py如下:

from foo_to_test.foo import func_to_test

def test1():
    assert something about func_to_test

我要从终端运行

pytest tests

现在解决这个问题。 当使用--import-mode追加或--import-mode前置时,它将'git_dir'添加到PYTHONPATH。 问题在于'git_dir'不是项目根目录。

  • 我可以添加sys.path.append('git_dir / root'),但是名称'git_dir'对于在其他计算机上工作的其他程序员而言是不同的。

  • 我在pytest文档中看到使用--import-mode importlib可能解决了我的问题,但是它似乎对我的PYTHONPATH没有任何影响,我无法理解它在做什么

所以我的问题是:

  • -import-mode importlib在做什么?
  • 在测试时如何自动将我的根添加到路径中,这样对于每个拉该项目的程序员来说都是一样的?

解决方法

这看起来很难,因为它不应该是这样工作的。可能是时候了解一下包装了。

Python 模块系统旨在按照您的描述在 sys.path 目录中查找模块。这个变量将由用户填充,以某种方式,最好不要干预。

当开发人员想要使用您的软件包时,他们必须确保它安装在他们运行测试的系统上。

如果您想让他们更轻松,请提供例如project.toml 文件;然后他们可以构建您的软件包,并使用 pip install /path/to/your/distribution-file.tgz 安装它。

有关此处的更多信息:https://setuptools.readthedocs.io/en/latest/userguide/quickstart.html#python-packaging-at-a-glance