如何使用本地模块防止pytest

2024-04-25 09:29:05 发布

您现在位置:Python中文网/ 问答频道 /正文

作为参考,这是this question的对立面。这个问题询问如何让pytest使用本地模块。我想避免使用本地模块进行pytest

我需要测试模块的安装过程。我们都应该测试模块的安装过程。因此,我想让我的测试套件假装是任何其他python模块试图导入我已经安装的模块(不管它是否是我最新编辑的最新版本和/或可编辑安装是我的事)

我的项目布局如下所示:

.
├── my_package
│   ├── __init__.py
│   └── my_module.py
├── setup.py
├── pyproject.toml
└── tests
    ├── conftest.py
    ├── __init__.py
    └── test_my_package.py

如果我

pip install .
cd tests
python -c "import my_package"

一切正常。然而,如果我

pip install .
pytest

事实并非如此。这是因为pytest会自动将调用目录添加到PYTHONPATH,从而无法测试pip install是否工作。我希望它不要那样做

我之所以需要这样做,是因为我正在使用setuptools-scm(在可编辑和不可编辑的安装中有不同的行为)和setuptools.find_packages,这使得忽略子包变得很容易。然而,重申一下,我的问题是pytest的发现,而不是这两个实用程序的使用


1条回答
网友
1楼 · 发布于 2024-04-25 09:29:05

解决方法是通过将tests/conftest.py更改为包含,手动编辑PYTHONPATH

import sys
sys.path.pop(0)

在第一次导入my_module之前,但它并不漂亮,并假设该项将在PYTHONPATH中的何处显示。当然,可以添加更多代码来显式检查,但这真的很难看:

import sys
from pathlib import Path
project_dir = str(Path(__file__).resolve().parent.parent)
sys.path = [p for p in sys.path if not p.startswith(project_dir)]

相关问题 更多 >

    热门问题