在GitLab CI/CD中用pytest测试Flask应用时如何忽略特定脚本?
问题原因与解决方案
核心问题根源
你配置的.coveragerc的omit规则仅作用于覆盖率统计阶段,不会干预pytest运行时的模块导入流程。你现在遇到的报错发生在pytest收集测试用例、导入依赖模块的阶段,远早于覆盖率统计环节,所以omit规则完全不会生效。
从报错栈的导入链可以看到:
- 测试文件导入
processor.py时,首先触发了父包app.pv_dimensioning的__init__.py执行 - 该
__init__.py顶层直接导入了controller.py - 后续逐层导入依赖直到
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
相关产品推荐
相关产品推荐

