Python 3.12 对 pytest 完全兼容,只需使用 pytest≥8.0.0 版本并确保测试文件命名符合 test_.py 或 _test.py 规范,同时子目录需含 __init__.py 才能被正确发现和执行。

直接上手就行,Python 3.12 对 pytest 完全兼容,无需降级或特殊适配 —— 只要别用已废弃的 asyncio 旧写法(比如 loop.run_until_complete()),就基本不会踩坑。
pip install pytest 后为什么 test_*.py 不执行?
常见原因是当前目录下没有符合命名规范的测试文件,或者 pytest 找不到入口。pytest 默认只扫描当前目录及子目录中满足以下任一条件的文件:
- 文件名以
test_开头(如test_api.py) - 文件名以
_test.py结尾(如utils_test.py)
注意:pytest 不会递归扫描隐藏目录(如 .git)、__pycache__ 或不含 __init__.py 的纯数据目录。如果 tests/ 目录下没放 __init__.py,某些旧版本 pytest(__init__.py 避免 CI 环境差异。
conftest.py 中的 fixture 在 class 内部不生效?
这是 scope 和作用域匹配问题。fixture 默认是 function 级别,但如果在 TestXXX 类里用 self 调用,而 fixture 没声明 autouse=True 或没通过参数注入,就会静默失效。
创建 Flask + Vue.js 全栈项目,采用单端口架构、uv 依赖管理、结构化日志和生产级前端设计。当用户要求以下操作时触发:创建新的 Flask+Vue 项目、搭建 Web 应用、构建全栈 Python+Vue 应用、初始化 Flask Web 项目、设置单端口 Flask 前后端项目。触发词:新建项目、创建项目、搭建项目、Flask项目、Vue项目。
- 正确写法:把 fixture 名作为测试方法的参数,例如
def test_login(self, api_client) - 错误写法:
self.api_client—— 这不是 pytest 的调用方式,除非你在setup_method里手动赋值 - 若想全局自动注入,加
@pytest.fixture(autouse=True, scope="function"),但慎用,容易掩盖依赖关系
pytest-html 报告里中文乱码或用例名显示为 test_abc[0]?
根本原因是参数化时没传 ids,且系统 locale 设置未覆盖 UTF-8 输出路径。
- 参数化必须显式加
ids才能显示可读名称:@pytest.mark.parametrize("url,expected", [("a.com", 200), ("b.com", 404)], ids=["valid_domain", "invalid_domain"]) - 生成报告时加
--html=report.html --charset=utf-8,否则 Windows 控制台默认 GBK 可能导致 HTML 文件内联 JS 解析异常 - Python 3.12 默认使用 UTF-8 filesystem encoding,但某些 CI 容器(如 alpine)仍需在启动时加
ENV PYTHONIOENCODING=utf-8
真正卡住人的往往不是安装或语法,而是 fixture 作用域和参数化 id 的缺失 —— 这两个点一旦漏掉,调试成本远高于重写用例本身。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










