本文举了一个简单的例子,用来展示如何用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来运行后,测试用例才进行验证的