You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:37:31