pytest通过命名规则(test_.py或_test.py)、含__init__.py的包结构及配置文件识别测试;需确保可导入性、正确工作目录和安装方式,conftest.py作用域限于同级及子目录,命令支持路径、类、标记等精准运行。

pytest怎么识别测试文件和目录
pytest 默认只运行满足命名规则的文件和函数,不是随便放个 test_*.py 就能自动发现——它依赖明确的文件名、目录结构和可导入性。如果你把测试文件放在普通子目录里但没加 __init__.py,或者用了非标准命名(比如 check_login.py),pytest 会直接跳过。
- 必须以
test_开头或以_test.py结尾(如test_utils.py或auth_test.py) - 含测试代码的目录必须是 Python 包:存在
__init__.py(空文件即可) - 目录名本身不影响识别,但嵌套过深或含特殊字符(如空格、中文)可能触发导入失败
- 如果项目根目录下有
pyproject.toml或pytest.ini,优先读取其中的testpaths或python_files配置
按模块组织时如何避免导入错误
测试文件要 import 被测模块,但路径不对就会报 ModuleNotFoundError 或 ImportError。常见错误不是写错了模块名,而是当前工作目录和 Python 路径不匹配。
- 推荐在项目根目录下运行
pytest,而不是进到tests/目录里执行 - 确保被测代码在 Python path 中:可通过
sys.path.insert(0, str(Path(__file__).parent.parent))临时加路径,但更稳妥的是用-m pip install -e .安装为可编辑包 - 不要在测试文件里用相对导入(如
from ..src import mymodule),pytest 不支持这种语法解析 - 如果使用
src/布局(即源码全在src/下),需在pyproject.toml中配packages = [{include = "src"}]并配合安装
test\_conftest.py 的作用范围和陷阱
conftest.py 是 pytest 的“配置中枢”,但它只对同级及子目录下的测试生效,不会向上影响父目录或其他分支目录。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 每个目录可放一个
conftest.py,pytest 按目录层级自动合并 fixture 和 hook - 同名 fixture 在子目录
conftest.py中定义会覆盖父目录的,不是叠加 - 别在
conftest.py里写业务逻辑或耗时初始化——它会在每次测试收集阶段加载,拖慢pytest --collect-only - 如果用了
autouse=True的 fixture,务必确认作用域(scope="session"可能跨模块污染状态)
运行指定模块测试的常用命令写法
光靠目录结构不够,得用对命令才能精准触发对应模块的测试,否则容易误跑全量或漏掉关键路径。
- 跑整个模块目录:
pytest tests/unit/auth/(注意结尾斜杠不是必须,但加了更明确) - 跑某模块下所有测试类:
pytest tests/unit/auth/test_login.py::TestLoginFlow - 按标记筛选(需提前用
@pytest.mark.unit):pytest -m unit或pytest -m "not integration" - 想排除某个慢测试目录?用
--ignore=tests/integration/,比删文件安全
最常被忽略的一点:pytest 缓存导入状态。改了 conftest.py 或新增测试目录后,有时要加 --import-mode=importlib 才能正确重载,否则旧 fixture 还在内存里。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










