Ctrl+B只运行当前文件是因为构建系统中"$file"是单文件变量,不自动扫描目录;需新建pytest-all.sublime-build,显式指定tests/路径、设置working_dir和PYTHONPATH,或用python -m pytest确保模块可导入。

Sublime Text 本身不运行测试,它只负责调用外部命令(如 pytest、jest)——所以“批量运行所有测试用例”的本质,是让构建系统正确识别并执行项目中全部符合规范的测试文件。
为什么 Ctrl+B 只跑当前文件,而不是整个项目?
默认构建系统(比如你手动配的 pytest.sublime-build)里 "cmd": ["pytest", "$file", "-v"] 中的 $file 是单个文件路径变量。它不会自动扩展成 test_*.py 或递归扫描目录。
- 这是最常被忽略的点:你以为点了构建就是“运行全部”,其实只是“运行当前打开的那个测试文件”
- 如果你没打开任何测试文件,
$file为空,构建会失败或静默退出 -
pytest命令本身支持目录路径(如pytest tests/),但构建系统必须显式写进去,不能靠“猜”
配置构建系统以运行整个 test 目录
新建一个 pytest-all.sublime-build 文件,内容如下:
{
"cmd": ["pytest", "tests/", "-v", "--tb=short"],
"working_dir": "${project_path:${folder}}",
"selector": "source.python",
"variants": [
{
"name": "pytest with coverage",
"cmd": ["pytest", "tests/", "--cov=src", "--cov-report=term-missing", "-v"]
}
]
}
-
tests/是常见测试目录名,按你实际结构调整(如test/、src/tests/) -
working_dir必须设为项目根目录,否则pytest找不到被测代码或conftest.py - 加
--tb=short避免堆栈过长遮挡关键错误信息 - 如果项目无
tests/目录,改用pytest . -v -p no:warnings从当前目录递归搜test_*.py
运行时找不到模块(ImportError)怎么办?
典型报错:ImportError: No module named 'myapp',说明 Python 路径没对上。
- 不是环境没装包,而是
pytest启动时的sys.path不包含你的源码目录 - 在构建系统里加
"env": {"PYTHONPATH": "${project_path:${folder}}/src"}(把src换成你放__init__.py的目录) - 或者更稳妥:用
python -m pytest替代直接调pytest,它会自动把当前目录加入sys.path - 验证方法:在终端进入项目根目录,手动运行
python -m pytest tests/,成功了再同步到构建系统
想一键运行所有测试,又不想改构建系统?
可以临时用 Sublime 控制台(Ctrl+`)执行 Python 命令,绕过构建系统限制:
import subprocess; subprocess.run(["python", "-m", "pytest", "tests/", "-v"])
- 这行代码会立即在 Sublime 内置终端中运行,输出直接显示在面板里
- 适合快速验证,但不推荐长期依赖——控制台命令不记录、不复用、无法绑定快捷键
- 真正稳定的方案,还是回到构建系统 + 显式路径 + 正确
PYTHONPATH
最容易被忽略的是 working_dir 和 PYTHONPATH 的组合效果:少一个,pytest 就可能既找不到测试文件,也 import 不了被测模块。别只盯着命令行参数,路径上下文才是批量运行成败的关键。

















