Sublime Text 不支持一键运行全部测试,仅能通过手动配置构建系统执行当前文件;Ctrl+B 默认只运行激活标签页的单个 test_*.py 文件,因 $file 变量仅指向当前文件路径,且构建系统不扫描项目或识别选区。

Sublime Text 本身不支持“一键运行测试用例”这个动作——它没有内置的测试发现、聚合或批量执行机制;所谓“运行测试”,全靠你手动配置构建系统调用外部测试工具(如 pytest、unittest),且默认只作用于当前打开的单个文件。
为什么 Ctrl+B 只跑一个 test_*.py 文件
Sublime 的构建系统是单文件上下文模型:$file 变量永远只代表当前激活标签页的完整路径,不会自动扫描项目里所有 test_*.py 或 *_test.py 文件。你开了 10 个测试文件,Ctrl+B 也只会执行最上面那个。
- 试图在
cmd字段写pytest tests/?不行——tests/是相对路径,而working_dir默认是${file_path}(即当前文件所在目录),不是项目根目录 - 用
shell_cmd写pytest *.py?通配符不会被展开,实际传给 pytest 的就是字面量*.py,报错 “File not found” - 选中某行测试函数名再按 Ctrl+B?没用——构建系统根本不读取选区,
$selected_text是非法变量,静默忽略
运行单个测试文件:最小可靠配置
这是最稳、最常复用的起点。适用于调试某个具体文件,比如 test_calculator.py。
新建 Packages/User/Python_Pytest.sublime-build,内容如下:
{
"cmd": ["python", "-m", "pytest", "$file", "-v", "--tb=short"],
"file_regex": "^([^:]+):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${project_path:${folder}}",
"selector": "source.python"
}
-
python -m pytest比裸pytest更可靠:它自动把当前工作目录加入sys.path,避免ImportError: No module named 'src' -
working_dir设为${project_path:${folder}}:优先用项目根目录, fallback 到当前文件夹;否则conftest.py或包内导入大概率失败 - 别漏
--tb=short:精简 traceback,避免输出刷屏盖过关键错误 - 如果用虚拟环境,把
python换成绝对路径,比如"/Users/you/.venv/bin/python"(macOS/Linux)或"C:/venv/Scripts/python.exe"(Windows)
运行单个测试函数:必须加 -k 或显式路径
想只跑 test_add 这个函数,不能靠选中代码,得改构建系统命令或手动输入函数名。
- 粗粒度匹配(推荐):
"cmd": ["python", "-m", "pytest", "$file", "-k", "test_add", "-v"]—— 匹配函数名含test_add的所有项 - 精确到函数(需已知名字):
"cmd": ["python", "-m", "pytest", "$file::test_add", "-v"]—— 注意双冒号语法,$file::test_add是 pytest 原生命令格式 - 别写
-k "$file_base_name":那只是文件名(如test_calculator),不是函数名,匹配不到任何测试 - 想交互式输函数名?Sublime 原生不支持;可装
InputHelper插件配合自定义命令,但稳定性差,2026 年多数已停更
真正批量运行打开的测试文件:靠 mini 插件,不是 JSON 配置
如果你真需要“运行所有已打开的 *test.py”,唯一靠谱方式是写个极简插件——JSON 构建系统做不到循环或条件判断。
新建 Packages/User/run_open_tests.py:
import sublime
import sublime_plugin
import subprocess
class RunOpenTestsCommand(sublime_plugin.WindowCommand):
def run(self):
files = [v.file_name() for v in self.window.views()
if v.file_name() and v.file_name().endswith("test.py")]
if not files:
sublime.status_message("No test files open")
return
subprocess.Popen(["python", "-m", "pytest"] + files + ["-v"])
- 保存后按
Ctrl+Shift+P→ 输入Run Open Tests即可触发 - 它只找文件名以
test.py结尾的视图(不是*test.py),若你用test_*.py,改成.endswith("_test.py")或用in判断 - 注意:该插件不设
working_dir,所以所有测试文件必须能被 pytest 在当前工作目录下正确 import;建议从项目根目录启动 Sublime - 别指望它支持
conftest.py跨文件共享 fixture——每个文件仍是独立执行上下文
最易被忽略的点:所有这些方案都依赖终端里 python --version 和 pytest --version 能正常输出。GUI 启动的 Sublime(双击图标)在 macOS/Linux 下不加载 shell 配置,PATH 不包含你的虚拟环境或 pip 安装路径——务必从终端执行 subl . 启动编辑器。











