pre-commit中pytest重复执行两次的问题排查求助
Pre-Commit重复运行Pytest测试的问题排查与解决
问题描述
使用pre-commit时,pytest测试会重复执行,失败次数翻倍,但直接执行对应的pytest命令时一切正常。
复现步骤
- 安装依赖:
pytest、pytest-cov、pre-commit - 添加
.pre-commit-config.yaml配置文件:repos: - repo: local hooks: - id: unit_test name: Run unit pytest language: python language_version: python3 entry: pytest tests/unit --cov=src/ types: [ python ] fail_fast: true stages: [commit] - id: integr_tests name: Run integration pytest language: python language_version: python3 entry: pytest tests/integration --cov=src/ types: [ python ] fail_fast: true stages: [push] - 执行钩子安装命令:
pre-commit install --hook-type pre-commit --hooktype pre-push - 在
tests/unit目录添加测试用例,其中test_config_source.py包含两个触发失败的测试 - 手动执行
pre-commit命令时,测试重复执行,失败次数翻倍;直接执行pytest tests/unit --cov=src/则正常
问题原因
核心问题是没有给local钩子配置pass_filenames: false。
pre-commit的默认行为是:如果钩子未设置pass_filenames: false,会将当前提交中符合types规则的所有文件路径作为参数追加到钩子的entry命令后。你的unit_test钩子指定了types: [python],当有Python文件被提交时,pytest会收到两个执行目标:你指定的tests/unit目录,以及pre-commit传递的具体测试文件路径,导致测试被重复执行。
解决方法
给两个local钩子都添加pass_filenames: false配置,禁用pre-commit自动传递文件名的行为:
修改后的.pre-commit-config.yaml:
repos: - repo: local hooks: - id: unit_test name: Run unit pytest language: python language_version: python3 entry: pytest tests/unit --cov=src/ types: [ python ] fail_fast: true stages: [commit] pass_filenames: false - id: integr_tests name: Run integration pytest language: python language_version: python3 entry: pytest tests/integration --cov=src/ types: [ python ] fail_fast: true stages: [push] pass_filenames: false
这样pre-commit就只会执行你指定的完整pytest命令,不会额外传递文件路径,测试也就不会重复运行了。
内容的提问来源于stack exchange,提问作者Alex Grand
相关产品推荐
相关产品推荐

