pytest不识别test_文件是因为默认仅发现test_.py或_test.py文件中以test_开头的函数或方法,且子目录需含__init__.py或显式指定路径。

pip install pytest 装完为啥不认 test_ 文件?
装完 pytest 后直接在项目根目录跑 pytest 却没发现任何测试,大概率不是安装问题,而是当前目录下没有符合自动发现规则的文件或结构。pytest 默认只找 test_*.py 或 *_test.py 这两类命名的 Python 文件,并且只执行其中以 test_ 开头的函数或方法。
- 确保测试文件名是
test_math.py、calculator_test.py这类,不能叫math_tests.py或test.py - 测试函数必须是
def test_add():,不能是def run_add_test():或def TestAdd():(后者是类名,但类里方法仍需test_前缀) - 如果文件在子目录里(如
tests/test_api.py),默认不会递归进tests/—— 除非该目录有__init__.py或你显式指定路径:pytest tests/
为什么 pytest 不运行 class TestCalc 中的 def add()?
pytest 支持测试类,但对类和方法的命名都有硬性要求:类名必须以 Test 开头(如 TestCalc),且类中每个测试方法仍必须以 test_ 开头。它不会把普通方法名当测试用例,也不会识别 unittest.TestCase 那套 def setUp(self): 的写法(除非你用 pytest-unittest 插件)。
- ✅ 正确:
class TestCalc:+def test_add(self): - ❌ 错误:
class CalcTest:(类名不以Test开头) - ❌ 错误:
class TestCalc:+def add(self):(方法名没test_) - ⚠️ 注意:类里以
_开头的方法(如def _helper(self):)会被自动跳过,哪怕名字带test
pytest 自动发现失败的三个常见隐藏原因
即使文件名和函数名都对,也可能因为环境或配置被静默跳过。这些点不像报错那么明显,容易卡住半天。
-
__pycache__/目录或.pyc文件损坏时,pytest 可能加载旧字节码导致跳过新写的test_函数 —— 试下删掉__pycache__/和所有.pyc - 当前工作目录不是你认为的那个目录(比如 IDE 终端默认进了
venv/或src/)—— 运行pwd(macOS/Linux)或cd(Windows)确认位置 - 项目里存在
pyproject.toml或pytest.ini,里面写了python_files = *.py这类覆盖默认规则的配置,会直接禁用test_*.py匹配 —— 检查配置中是否有python_files、python_classes、python_functions项
想让 pytest 扫描非标准命名的文件怎么办?
不建议长期绕过默认规则,但如果临时调试或继承老项目,可以用命令行参数强制包含。注意这不是“修复”,而是“覆盖”——后续 CI 或队友运行时同样会失效,得同步改配置。
立即学习“Python免费学习笔记(深入)”;
- 单次运行:用
-k按函数名匹配,比如pytest -k "test_add"或pytest -k "api" - 临时加文件:用
--pyargs把模块当包导入,如pytest --pyargs mypackage.tests(要求my_package/tests/__init__.py存在) - 持久生效:在
pyproject.toml里写:[tool.pytest.ini_options] python_files = ["test_*.py", "*_test.py", "check_*.py"]
这样新增的check_db.py也能被扫到
test.py 或 test_utils.py,以为 pytest 会认——它真不认。规则就两条:文件名要匹配、函数名要匹配,中间不插任何商量余地。










