pytest自动发现测试需严格遵循命名约定:文件名必须为test_.py或_test.py,测试类以test开头且无__init__,函数以test_开头;否则直接跳过不报错。

pytest 能自动发现测试,根本不需要你手动列文件或写配置——前提是命名和结构严格符合它的默认约定。一旦不匹配,它就直接跳过,连警告都不给。
test_*.py 和 *_test.py 是硬性门槛
pytest 只认两种文件名模式:test_*.py 和 *_test.py,中间的 * 不能是空的(比如 test_.py 不行),也不能含非法字符(如空格、中文)。常见踩坑点:
-
test.py或demo.py:完全不会被扫描到 -
TestDemo.py或TEST_LOGIN.PY:大小写敏感,必须小写开头 + 下划线组合 -
conftest.py:虽然会被加载(用于共享 fixture),但本身不会被当作测试文件执行
类和函数的命名不是“建议”,是识别开关
即使文件名对了,类和函数命名不对,照样不运行。关键规则只有三条:
- 测试类名必须以
Test开头,且不能有__init__(self)方法(否则整个类被忽略) - 测试函数(无论在模块顶层还是类里)必须以
test_开头 -
test_后面至少得有一个合法字符,test_()函数名无效,test()也不行
示例有效写法:def test_can_parse_json(self):、class TestUserAPI:;无效写法:def parse_json_test():、class UserTest:、class TestUser:def __init__(self): pass。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
pytest 不会递归进非测试目录,除非你显式告诉它
默认只扫当前目录及其子目录下所有符合命名规则的 .py 文件,但有三个隐含限制:
- 如果某层目录下没有
__init__.py,pytest 仍能发现里面的test_*.py,但不会把该目录当 Python 包处理(影响 fixture 导入路径) - 名字带点的目录(如
test_data/)或以.开头的目录(如.cache/)会被跳过 - 若想指定扫描起点,可用
--testpaths参数,比如pytest --testpaths=tests/ integration/,但注意这会覆盖默认路径,不是追加
pyproject.toml 里的 [tool.pytest.ini_options] 不是“可选增强”,而是覆盖行为
一旦项目根目录存在 pyproject.toml 并写了 [tool.pytest.ini_options],pytest 就不再读取默认规则,而是严格按配置来。最容易出问题的是:
- 误删
python_files配置项:默认值是["test_*.py", "*_test.py"],删掉后它就只认test_*.py,*_test.py全部失效 - 错误设置
python_classes = ["Test*"]却漏了python_functions = ["test_*"]:函数就全丢了 - 加了
testpaths = ["tests"]却忘了当前目录还有test_utils.py:那个文件彻底隐身
真正安全的做法是:没特殊需求就别配 pyproject.toml;非要配,就完整复制默认值再改,别删行。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










