对已经运行的flask服务测试代码覆盖率

news2024/9/29 14:02:43

上一篇文章《用pytest-cov获取flask项目的测试代码覆盖率》展示了用pytest的测试用例验证flask的函数,获取代码覆盖率信息。但是上述方法要求web服务没有提前启动,而是由pytest来启动,然后运行测试用例。
那么对于已经启动的web服务,能否也用pytest来做代码覆盖率的验证呢?答案是肯定的,需要使用Coverage.py。

整体思路

  • 手动启动Flask Web项目,项目启动代码中包含coverage信息收集
  • pytest的testcase使用requests模块对Web服务发起HTTP请求,对回复进行验证
  • 手动退出Web项目,终止coverage信息收集,输出报告

源码展示

  • 文件目录结构
admin@pc:~/my_flask_app$ tree -a
.
├── app.py
├── __init__.py
└── tests
    └── test_app.py

1 directory, 3 files
  • app.py主程序中,需要加入
    • 通过环境变量判断是否启动COV收集
    • 定义函数响应"Ctrl+C",从而停止COV收集,输出COV报告
admin@pc:~/my_flask_app$ cat app.py 
import os
import signal
import sys
from flask import Flask, jsonify


# 仅在测试模式下启用覆盖率
if os.getenv("FLASK_COVERAGE"):
    import coverage
    COV = coverage.coverage(branch=True, include="./app.py")  # 确保只覆盖项目代码
    COV.start()

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

@app.route('/api/data')
def get_data():
    return jsonify({'data': 'Here is some data'})


def handle_sigint(signum, frame):
    """Handle Ctrl+C (SIGINT) to properly save coverage data."""
    if os.getenv("FLASK_COVERAGE"):
        COV.stop()
        COV.save()
        print("\nCoverage Report:")
        COV.report()
        COV.html_report(directory='htmlcov')
        COV.erase()
    sys.exit(0)


if __name__ == '__main__':
    # 捕获 SIGINT 信号 (Ctrl+C)
    signal.signal(signal.SIGINT, handle_sigint)

    # 启动 Flask 应用
    app.run()
admin@pc:~/my_flask_app$ 
  • 测试用例中要用到requests,需要保证已经安装
admin@pc:~/my_flask_app$ cat tests/test_app.py 
# tests/test_app.py
import requests

def test_hello_world():
    """Test the root route"""
    response = requests.get('http://127.0.0.1:5000/')
    assert response.status_code == 200
    assert response.text == 'Hello, World!'

def test_get_data():
    """Test the /api/data route"""
    response = requests.get('http://127.0.0.1:5000/api/data')
    assert response.status_code == 200
    assert response.json() == {'data': 'Here is some data'}
admin@pc:~/my_flask_app$ 

运行和调试

  • 首先设置环境变量然后运行app
admin@pc:~/my_flask_app$ export FLASK_APP=my_flask_app.app
admin@pc:~/my_flask_app$ export FLASK_COVERAGE=1
admin@pc:~/my_flask_app$ 
admin@pc:~/my_flask_app$ python3 app.py 
 * Serving Flask app 'app'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit

  • 另外开一个端口,运行测试用例,都是pass的
admin@pc:~/my_flask_app$ pytest tests/
================================================================= test session starts ==================================================================
platform linux -- Python 3.10.12, pytest-8.3.3, pluggy-1.5.0
rootdir: /home/admin/my_flask_app
plugins: anyio-4.4.0, cov-5.0.0
collected 2 items                                                                                                                                      

tests/test_app.py ..                                                                                                                             [100%]

=================================================================== warnings summary ===================================================================
../../../usr/lib/python3/dist-packages/requests/__init__.py:87
  /usr/lib/python3/dist-packages/requests/__init__.py:87: RequestsDependencyWarning: urllib3 (2.2.2) or chardet (4.0.0) doesn't match a supported version!
    warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "

tests/test_app.py::test_hello_world
tests/test_app.py::test_get_data
  /home/admin/.local/lib/python3.10/site-packages/urllib3/poolmanager.py:315: DeprecationWarning: The 'strict' parameter is no longer needed on Python 3+. This will raise an error in urllib3 v2.1.0.
    warnings.warn(

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
============================================================ 2 passed, 3 warnings in 0.19s =============================================================
admin@pc:~/my_flask_app$ 
  • 回到第一个终端,用ctrl+c中断app的运行,可以看到打印
admin@pc:~/my_flask_app$ python3 app.py 
 * Serving Flask app 'app'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit
127.0.0.1 - - [29/Sep/2024 10:59:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [29/Sep/2024 10:59:02] "GET /api/data HTTP/1.1" 200 -
^C
Coverage Report:
Name     Stmts   Miss Branch BrPart  Cover
------------------------------------------
app.py      27     23      6      1    15%
------------------------------------------
TOTAL       27     23      6      1    15%
admin@pc:~/my_flask_app$ 
  • 要看详细报告,可以用浏览器打开下面的文件
admin@pc:~/my_flask_app$ ls -lt htmlcov/index.html 
-rw-rw-r-- 1 admin admin 4929  9月 29 11:00 htmlcov/index.html
admin@pc:~/my_flask_app$ 

在这里插入图片描述

经验分享

  • 如果遇到最后报错"coverage.exceptions.NoDataError: No data to report.",需要关注COV = coverage.coverage()里面的include=后面的表达式是否正确
  • 不确定怎么写,可以先把include参数拿掉,看看能否出结果
  • include和omit的表达式如何书写,可以参考这里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2176935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【STM32-HAL库】MQ2烟雾传感器使用(STM32F407ZET6)

MQ2可燃气体传感器介绍 MQ2是一种广谱气体传感器,能够检测多种可燃气体和烟雾。它是一种低成本、高灵敏度的传感器,广泛应用于家庭和工业环境中的气体监测。 原理 MQ2传感器的工作原理基于金属氧化物半导体(MOX)技术。当传感器暴露…

俄罗斯市场合格评定准入认证要求

前言 国内厂家想要把自己的产品顺利出口到俄罗斯市场,就需要基本了解俄罗斯的市场合格评定准入要求。俄罗斯主要实行的认证有EAC(TR-CU/CU-TR)认证、GOST R认证、计量认证和医疗产品国家注册。下面就分别简单介绍一下这几个产品认证。 一、EAC(TR-CU/CU-TR)认证介绍…

LVGL 笔记

在显示GUI的过程中需要对某些对象进行临时隐藏或临时显示,因此需要对该对象的FLAG进行配置就可以实现对象的显示和隐藏了. lv_obj_add_flag(user_obj, LV_OBJ_FLAG_HIDDEN);//隐藏对象 lv_obj_clear_flag(user_obj, LV_OBJ_FLAG_HIDDEN);//取消隐藏 GUI-Guider 中的选项卡 注意…

Linux驱动开发(速记版)--驱动基础

第一章 初识内核源码 Linux系统源码提供了操作系统的核心功能,如进程管理、内存管理、文件系统等。 BusyBox这类的文件系统构建工具,则提供了在这些核心功能之上运行的一系列实用工具和命令,使得用户能够执行常见的文件操作、文本处理、网络配…

MaxKB知识库问答系统入选Gitee最有价值开源项目

2024年9月19日,飞致云旗下开源项目MaxKB成功加入Gitee平台主导的GVP计划,入选2024年GVP——Gitee最有价值开源项目。MaxKB也是继MeterSphere、DataEase和1Panel之后,飞致云旗下第四个入选GVP的开源项目。 ▲图1 MaxKB入选2024年Gitee最有价值…

软机器人咋模仿生物?响应式水凝胶Aquabots有啥用?快来了解一下!

大家好,今天我们要来了解一项关于响应式水凝胶Aquabots的研究——《Responsive‐Hydrogel Aquabots》发表于《Advanced Science》。在当今科技发展中,制造能像生物体一样具有响应适应性的软机器人是个挑战。而Aquabots为解决这个问题带来了新的突破。它通…

vue3项目执行pnpm update后还原package.json文件后运行报错

项目场景: vue官方版本已更新到vue3.5,项目中还在使用vue3.4,因此想要更新项目vue版本。 问题描述 执行了 pnpm update 命令,一键更新了所有包,更新完成后项目不能正常运行。为了还原项目代码,先删除 nod…

“AI+Security”系列第3期(七):智能体车企落地实践

近日,由安全极客、Wisemodel 社区、InForSec 网络安全研究国际学术论坛和海升集团联合主办的 “AI Security” 系列第 3 期技术沙龙 ——“AI 安全智能体,重塑安全团队工作范式” 活动顺利举行。此次活动备受关注,吸引了线上线下超过千名观众…

DriveVLM 论文学习

论文链接:https://arxiv.org/abs/2402.12289 解决了什么问题? 自动驾驶对交通行业有着革命性的作用,实现 FSD 的一个主要障碍就是场景理解。场景理解涉及在复杂且不可预测的环境中进行导航,这些环境可能包括恶劣的天气条件、复杂…

【Git】克隆主项目,并同时克隆所有子模块

子模块 带有箭头的文件夹(relaxed_ik_core)通常表示这是一个 Git 子模块(submodule)。Git 子模块是一种嵌入式的 Git 仓库,它允许你在一个仓库中引用其他的 Git 仓库。换句话说,relaxed_ik_core 不是这个项…

uniapp实战教程:如何封装一个可复用的表单组件

在uniapp开发过程中,表单组件的使用场景非常广泛。为了提高开发效率,我们可以将常用的表单组件进行封装。本文将带你了解如何在uniapp中封装一个表单组件,让你只需要通过属性配置轻松实现各种表单,效果图如下: 一、准备…

《北方牧业》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问:《中国动物检疫》是不是核心期刊? 答:不是,是知网收录的正规学术期刊。 问:《中国动物检疫》级别? 答:省级。主管单位:河北省畜牧局 主办单…

【win11】关闭windows11系统的讲述人

如何关闭windows11系统的讲述人,经常误触启动 讲述人(Narrator) 设置里找到讲述人(Narrator) 开关讲述人及快捷键

物联网行业中天线定制的激光直接成型 (LDS)技术

01 什么是lds技术? 普通的手机天线都被安装在手机的主板上: 在当今的智能手机中,我们常见的手机天线通常都被巧妙地安装在手机的主板上。这些天线承担着接收和发送信号的重要任务,是实现通信功能的关键组件之一。 而 LDS 天线…

运放信号失真原因分析——增益带宽积,压摆率

运放失真原因分析——增益带宽积,压摆率 运放失真原因分析 运放失真原因分析——增益带宽积,压摆率一、压摆率二、仿真模拟电路1.OPAx333的增益带宽积以及压摆率参数2.将输入信号的频率设置为10kHz3.将输入信号的频率设置为25kHz4.失真原因分析 总结 一、…

【MySQL实战45讲4-5】索引

文章目录 索引的定义索引的常见模型哈希表有序数组二叉搜索树 InnoDB的索引模型索引维护页分裂页合并页分裂和页合并的影响避免页分裂 覆盖索引最左前缀原则索引下推 索引的定义 索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。一本500页的书&#x…

全开源/彩虹晴天多功能系统源码/知识付费系统/虚拟商城系统/完美可用+修复改良版

源码简介: 2024年最新全开源的彩虹晴天多功能系统源码,它可以作为知识付费系统、虚拟商城系统,完美可用,并且是修复改良版。 最让人兴奋的是,搭建这个系统完全不需要授权,不管是在国内还是国外的服务器&am…

Mybatis-Mapper接口方式

目录 配置方式和接口方式的区别 示例:Mapper接口方式实现数据库的CRUD 配置方式和接口方式的区别 Mybatis框架在配置方式的情况下,对数据库的CRUD操作直接通过SqlSession对象来操作,常用的方法有select、insert、update、delete等方法&…

企业内训|提示词工程师高阶技术内训-某运营商研发团队

近日,TsingtaoAI为某运营商技术团队交付提示词工程师高级技术培训,本课程为期2天,深入探讨深度学习与大模型技术在提示词生成与优化、客服大模型产品设计等业务场景中的应用。内容涵盖了深度学习前沿理论、大模型技术架构设计与优化、以及如何…

MySQL高阶1988-找出没所学校的最低分数要求

目录 题目 准备数据 分析数据 总结 题目 每年,学校会公布学生申请所需的最低分数要求。学校根据所有学生的考试成绩来决定其最低分数要求。 学校希望确保即使 每 一个满足分数要求的学生都申请该学校,学校也有足够的能力接纳每一个学生。学校也希望…