pytest-metadata插件不支持直接在pytest.ini或命令行写version=1.2.3,需通过pytest_configure钩子向config._metadata["version"]注入;HTML报告需pytest-html v3.2.0+或显式--metadata才显示,且键名须统一小写。

pytest-metadata 插件不支持直接写入自定义版本字段
直接在 pytest.ini 或命令行里加 version=1.2.3 不会生效——pytest-metadata 默认只收集环境变量、Python 版本、平台等固定元数据,不开放任意键值写入。想加版本号,必须通过钩子函数手动注入。
用 pytest_configure 钩子往 metadata 字典里塞 version
在项目根目录的 conftest.py 中添加如下代码,这是最稳定、兼容性最好的方式:
def pytest_configure(config):
config._metadata["version"] = "1.2.3"
注意几点:
-
config._metadata是插件内部维护的字典,直接赋值即可,无需 import 或初始化 - 版本号建议从
__version__变量或pyproject.toml读取,避免硬编码,例如:from mypackage import __version__ - 如果用了
--metadata命令行参数,它会覆盖钩子里的值,顺序上钩子先执行,命令行后合并
生成 HTML 报告时 version 不显示?检查插件版本和模板
pytest-html v3.2.0+ 才默认渲染 _metadata 全部字段;旧版本只显示预设字段(如 Platform、Python)。现象是:控制台输出里能看到 version,但 HTML 里没有。
立即学习“Python免费学习笔记(深入)”;
解决办法:
- 升级到最新版:
pip install -U pytest-html - 若仍不显示,可在
pytest.ini中显式启用完整元数据:addopts = --html=report.html --self-contained-html --metadata version 1.2.3 - 自定义 HTML 模板时,确保模板中包含
{{ metadata }}或遍历metadata.items()的逻辑
CI 环境下动态获取版本要避开 git describe 失败场景
很多项目用 git describe --tags 获取版本,但在 CI 构建镜像里常因没带 git history 而报错 fatal: No names found,导致测试直接退出。
安全做法是加异常兜底:
import subprocess
def get_version():
try:
return subprocess.check_output(["git", "describe", "--tags"], text=True).strip()
except (subprocess.CalledProcessError, FileNotFoundError):
return "unknown"
def pytest_configure(config):
config._metadata["version"] = get_version()
关键点:
- 捕获
CalledProcessError(git 命令失败)和FileNotFoundError(没装 git) - 不要用
os.popen或os.system,它们不抛异常,错误会被静默吞掉 - 如果构建流程本身已通过环境变量传入版本(如
CIRCLE_TAG),优先读环境变量,更快更可靠
真正容易被忽略的是:metadata 字段名区分大小写,且 HTML 报告对键名无自动格式化——写成 "Version" 和 "version" 在报告里就是两个不同条目;统一小写最稳妥。


















