FastAPI结合SQLAlchemy使用pytest测试无法获得100%覆盖率问题求助
问题根因
SQLAlchemy 异步扩展底层通过 greenlet 实现同步逻辑到异步协程的适配,默认配置下 coverage 工具仅追踪原生 Python 线程与协程的执行栈,greenlet 切换上下文时会中断覆盖率统计,导致 await 后的代码无法被正确计数。
解决方法
两种方案任选其一即可:
方案1:修改coverage配置适配greenlet
在项目根目录新建 .coveragerc 配置文件,添加以下内容:
[run] # 开启greenlet并发场景的覆盖率追踪 concurrency = greenlet thread # 指定要统计覆盖率的代码目录 source = .
配置完成后重新执行原有测试命令即可,此时 await 后的代码会被正常统计。
方案2:命令行直接指定追踪模式
如果不想新增配置文件,也可以直接在测试命令中添加参数调整追踪规则:
pytest -vv --cov=. --cov-concurrency greenlet,thread --cov-report term-missing --cov-report html
验证效果
修改配置后重新运行测试,main.py中第26-28行的代码会被标记为已覆盖,main.py覆盖率可达到100%。
内容的提问来源于stack exchange,提问作者Ilia Dmitriev
相关产品推荐
相关产品推荐

