用pytest-cov获取flask项目的测试代码覆盖率

本文举了一个简单的例子,用来展示如何用pytest的测试用例验证flask的函数,获取代码覆盖率信息

前期准备

  • 本机系统为Ubuntu 22.04.4
  • 默认python版本为python3.10
  • 安装必要的python包
admin@pc:~$ pip3 install pytest pytest-cov flask

源码展示

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

1 directory, 5 files
admin@pc:~$ 
  • app.py是主程序,用来启动flask实例,响应request
admin@pc:~$ cat my_flask_app/app.py 
# my_flask_app/app.py
from flask import Flask, jsonify

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'})

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)
admin@pc:~$ 
  • 创建__init__.py文件
admin@pc:~$ cat my_flask_app/__init__.py 
from .app import app
admin@pc:~$ 
  • .coveragerc是pytest-cov的配置文件,标明忽略测试用例本身的覆盖率
admin@pc:~$ cat my_flask_app/.coveragerc 
[run]
omit =
    */tests/*
    */__init__.py
admin@pc:~$ 
  • tests目录下放的是pytest的文件
#conftest会在测试前启动flask app
admin@pc:~$ cat my_flask_app/tests/conftest.py 
import pytest
from my_flask_app import app

@pytest.fixture
def client():
    app.testing = True
    return app.test_client()
admin@pc:~$ 
admin@pc:~$ 

#验证'/'路由的返回结果
admin@pc:~$ cat my_flask_app/tests/test_app.py 
def test_hello_world(client):
    """Test the root route"""
    response = client.get('/')
    assert response.status_code == 200
    assert response.data == b'Hello, World!'

def test_get_data(client):
    """Test the /api/data route"""
    response = client.get('/api/data')
    assert response.status_code == 200
    assert response.is_json
    assert response.get_json() == {'data': 'Here is some data'}
admin@pc:~$ 

运行和调试

  • 采用显式指定PYTHONPATH的方式运行
admin@pc:~$ PYTHONPATH=. pytest --cov=my_flask_app  --cov-config=my_flask_app/.coveragerc
================================================================= test session starts ==================================================================
platform linux -- Python 3.10.12, pytest-8.3.3, pluggy-1.5.0
rootdir: /home/admin
plugins: anyio-4.4.0, cov-5.0.0
collected 2 items                                                                                                                                      

my_flask_app/tests/test_app.py ..                                                                                                                [100%]

---------- coverage: platform linux, python 3.10.12-final-0 ----------
Name                  Stmts   Miss  Cover
-----------------------------------------
my_flask_app/app.py      10      1    90%
-----------------------------------------
TOTAL                    10      1    90%


================================================================== 2 passed in 1.08s ===================================================================
admin@pc:~$ 
  • 也可以生产更加清楚的html文件
admin@pc:~$ PYTHONPATH=. pytest --cov=my_flask_app --cov-report=html:${HOME}/my_flask_app/htmlcov --cov-config=my_flask_app/.coveragerc
================================================================= test session starts ==================================================================
platform linux -- Python 3.10.12, pytest-8.3.3, pluggy-1.5.0
rootdir: /home/admin
plugins: anyio-4.4.0, cov-5.0.0
collected 2 items                                                                                                                                      

my_flask_app/tests/test_app.py ..                                                                                                                [100%]

---------- coverage: platform linux, python 3.10.12-final-0 ----------
Coverage HTML written to dir /home/admin/my_flask_app/htmlcov


================================================================== 2 passed in 1.07s ===================================================================
admin@pc:~$ 
  • '–cov-report=html:~/my_flask_app/htmlcov’等号的右边,冒号前是指定report格式,冒号后是指定生产的report目录的路径(注意,路径要用全路径)
  • 查看生成的文件
admin@pc:~$ ls -lt  ~/my_flask_app/htmlcov
total 100
-rw-rw-r-- 1 admin admin  4852  9月 29 08:54 class_index.html
-rw-rw-r-- 1 admin admin  5727  9月 29 08:54 function_index.html
-rw-rw-r-- 1 admin admin  4521  9月 29 08:54 index.html
-rw-rw-r-- 1 admin admin   607  9月 29 08:54 status.json
-rw-rw-r-- 1 admin admin  8239  9月 29 08:54 z_41b7da1697189eb7_app_py.html
-rw-rw-r-- 1 admin admin 25474  9月 29 08:54 coverage_html_cb_6fb7b396.js
-rw-rw-r-- 1 admin admin  1732  9月 29 08:54 favicon_32_cb_58284776.png
-rw-rw-r-- 1 admin admin  9004  9月 29 08:54 keybd_closed_cb_ce680311.png
-rw-rw-r-- 1 admin admin 14077  9月 29 08:54 style_cb_8e611ae1.css
admin@pc:~$ 
  • 用浏览器打开index.html文件
    在这里插入图片描述
    在这里插入图片描述

特别声明

  • 注意上述示例,在运行pytest之前,flask app并没有运行
  • 通过在conftest.py的pytest.fixture来运行后,测试用例才进行验证的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值