python - 如何使用本地模块防止 pytest
问题描述
作为参考,这与这个问题相反。该问题询问如何让 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 的发现,而不是使用这两个实用程序。
解决方案
一种解决方法是通过更改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)]
推荐阅读
- sql - 创建 SQL 视图时无法识别“IS”和“OR”
- android - osmdroid 的 CopyrightOverlay.setCopyrightNotice() 是如何工作的?
- php - Laravel 验证如何在没有 try catch 的情况下将 Exception 作为 Json 返回?
- python - 如何从表格中绘制方波
- javascript - 样式系统按钮未正确呈现
- php - EnvelopeRecipients::update 中的 INVALID_REQUEST_BODY
- javascript - 使用 document.querySelector() 提取下拉值 - 多个 id
- angular - 运算符过滤器不按从 API 发送的元素进行迭代
- java - Android NPE 上 BackdropFrameRenderer onResourcesLoaded()
- python - 离散优化 - 从分数矩阵的每一行和每一列中精确选择 N 个项目