最简python测试工作流核心三步:触发时机(on: [push, pull_request])、装python(uses: actions/setup-python@v4,须写具体小版本如"3.11")、跑测试(run: python -m pytest tests/ -v);无需声明runner或pip install pytest。

直接用 setup-python 就能搞定,别自己写 apt install python3 或手动下载编译 —— 那样既慢又不可靠,还容易因系统差异失败。
怎么写最简可用的 Python 测试工作流
核心就三步:选触发时机、装 Python、跑测试。不需要额外声明 runner 类型(GitHub 托管的 Ubuntu runner 默认带 Python 工具缓存),也不用 pip install pytest —— 大多数版本预装了。
-
on: [push, pull_request]覆盖最常见场景,避免只监听push导致 PR 里漏检 -
uses: actions/setup-python@v4必须显式调用,哪怕你只测一个版本;不写这行,python --version可能返回系统自带的老版本(比如 Ubuntu 22.04 的 3.10.12),和你本地开发环境不一致 -
run: python -m pytest tests/ -v比pytest tests/更稳妥,绕过 PATH 查找问题,也避免某些 runner 上没把pytest命令加进环境变量
多 Python 版本并行测试要避开的坑
用 strategy: matrix 看似简单,但实际运行时容易卡在依赖安装或测试超时上,尤其当某个版本(如 3.7)已 EOL、某些包不再提供 wheel 时。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 矩阵中不要硬塞已停更版本(如
"3.7"),除非你明确维护兼容性;否则pip install -e .可能因pyproject.toml中的requires-python拒绝安装 - 每个 job 默认独享干净环境,但
pip cache不跨 job 共享 —— 如果想提速,加actions/cache@v4缓存~/.cache/pip,注意 key 要包含${{ matrix.python-version }} - 测试命令建议加超时控制:
timeout -s SIGINT 300s python -m pytest tests/ || true,防止某个版本 hang 死整个 workflow
为什么 setup-python 的 python-version 不能写成 "3" 或 "3.x"
它不支持模糊匹配。写 "3" 会报错 Version 3 not found;写 "3.x" 会被当成字面字符串,找不到对应缓存条目,最终 fallback 到源码编译 —— 这可能花 5 分钟以上,且大概率因缺少 build-essential 失败。
- 必须写具体小版本号,如
"3.9"、"3.11";GitHub 会自动映射到工具缓存中最接近的可用版本(比如"3.9"实际可能是3.9.18) - 查当前支持哪些版本?看 actions/python-versions 仓库的 latest.json,或直接在 workflow 里加一步
run: actions/setup-python --list-versions - PyPy 同理,得写
"pypy-3.9",不能只写"pypy"
本地调试 YAML 语法错误最快的方法
别等 push 后看 Actions 页面红叉 —— 那时候连日志都难读。直接用 VS Code 装 YAML 插件(Red Hat 出品),它会实时校验缩进、key 是否重复、值类型是否合法。
- 特别注意冒号后必须有空格:
run: python -m pytest✅,run:python -m pytest❌(会解析成字符串拼接) - 路径别用反斜杠:
./testsunit在 Windows 本地可能通,但在 Linux runner 上会报No module named 'tests\unit' - 用
act工具本地模拟执行:act -j test --secret-file .secrets,比反复 push 省至少 80% 时间
真正麻烦的从来不是写对第一版 YAML,而是某天 CI 突然变慢或报错 —— 往往是 setup-python 自动升级了 minor 版本,而你的 pyproject.toml 里锁死了 black==22.3.0,结果新版 Python 把旧 black 的 AST 解析器搞崩了。这种隐性依赖断裂,得靠矩阵测试+语义化版本约束一起防。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










