首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用局部模块防止pytest

如何使用局部模块防止pytest
EN

Stack Overflow用户
提问于 2021-04-20 09:21:46
回答 2查看 210关注 0票数 3

作为参考,这是相对于 of this question。这个问题询问如何使pytest使用您的本地模块。我希望避免使用本地模块进行pytest。

我需要测试我的模块的安装过程。我们都应该测试我们模块的安装过程。因此,我希望我的测试套件假装它是试图导入我的模块的任何其他python模块,我已经安装了这个模块(无论它是否与我的最新编辑和/或可编辑的安装是我的业务)。

我的项目布局如下:

代码语言:javascript
复制
.
├── my_package
│   ├── __init__.py
│   └── my_module.py
├── setup.py
├── pyproject.toml
└── tests
    ├── conftest.py
    ├── __init__.py
    └── test_my_package.py

如果我

代码语言:javascript
复制
pip install .
cd tests
python -c "import my_package"

一切都很好。但是,如果我

代码语言:javascript
复制
pip install .
pytest

但事实并非如此。这是因为pytest自动将调用目录添加到PYTHONPATH中,因此无法测试pip install是否正常工作。我不想那样做。

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

EN

回答 2

Stack Overflow用户

发布于 2021-04-20 09:31:38

解决方法是通过将tests/conftest.py更改为包括

代码语言:javascript
复制
import sys
sys.path.pop(0)

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

代码语言:javascript
复制
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)]
票数 0
EN

Stack Overflow用户

发布于 2022-11-22 00:38:18

请参阅pytest import mechanisms and sys.path/PYTHONPATH文档,其中描述了控制此行为的三种导入模式。例如,尝试如下:

代码语言:javascript
复制
$ pytest --import-mode=importlib

它使用importlib导入测试模块,而不是操作sys.pathPYTHONPATH

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67176036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档