如何使用本地模块防止 pytest

问题描述

作为参考,这是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 的发现,而不是这两个实用程序的使用。

解决方法

一种解决方法是通过将 tests/conftest.py 更改为 include 来手动编辑 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)]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...