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

在GitLab CI/CD中用pytest测试Flask应用时如何忽略特定脚本?

问题原因与解决方案

核心问题根源

你配置的.coveragerc的omit规则仅作用于覆盖率统计阶段,不会干预pytest运行时的模块导入流程。你现在遇到的报错发生在pytest收集测试用例、导入依赖模块的阶段,远早于覆盖率统计环节,所以omit规则完全不会生效。

从报错栈的导入链可以看到:

  1. 测试文件导入processor.py时,首先触发了父包app.pv_dimensioning的__init__.py执行
  2. 该__init__.py顶层直接导入了controller.py
  3. 后续逐层导入依赖直到decode_verify_jwt.py,这个文件的顶层作用域直接执行了urllib.request.urlopen网络请求,CI环境没有VPN无法解析域名,直接抛出异常中断执行。

解决方案(按优先级排序)

方案1:修复模块顶层的网络请求逻辑(最优)

不要在模块的顶层作用域执行任何网络、数据库连接这类强依赖外部环境的操作,改为懒加载模式:
把decode_verify_jwt.py里顶层执行的urlopen逻辑,移到verifier第一次被调用的方法内,或者封装为初始化函数,在实际使用时才调用,不要导入模块就直接执行。

方案2:调整包初始化的导入逻辑

修改app/pv_dimensioning/__init__.py,不要在顶层直接导入controller相关内容:
flask-restx的namespace注册可以放到app工厂函数中延迟执行,不需要在包初始化阶段就导入全量依赖,只要保证processor.py本身的导入不依赖其他需要VPN的模块即可。

方案3:测试前置mock依赖(无需修改业务代码)

在tests目录下新建conftest.py,在pytest启动时提前mock掉触发网络请求的模块,示例配置:

import sys
from unittest.mock import Mock

# 提前mock需要网络请求的模块,避免导入报错
sys.modules['app.pv_dimensioning.utils.decode_verify_jwt'] = Mock(
    verifier=Mock()
)

这样导入链走到decode_verify_jwt的时候会直接用mock对象,不会执行真实的网络请求。

原有配置说明

你现有的.coveragerc配置本身没有问题,等导入问题解决后,覆盖率统计阶段会自动忽略你配置的omit文件,不需要额外调整。

内容的提问来源于stack exchange,提问作者some_programmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 14:54:01