Pytest 测试 Flask
Pytest 测试 Flask
参考文章:https://blog.csdn.net/weixin_30230009/article/details/107011345
参考文章:https://vimsky.com/examples/detail/python-ex-flask-Flask-test_client-method.html
单元测试:的主要目的是回归校验,避免新的修改影响此前的业务逻辑,此外,它还可以验证当前业务逻辑的健壮性,一个比较完整的单元测试,通常有最基本的测试加上比较复杂的边界测试构成。
Pytest 是 python 开发进行单元测试最常用的开发库;
单元测试的目的:单元测试是为了测试某个独立的功能,如果该独立功能调用了其他功能,就需要通过 不同的方式绕过这些功能,你可以利用Mock机制模拟外部服务的返回,也可以通过其他的方式。
粒度:单元测试的测试粒度没有明确的规范,如团队没有规定,按个人喜好来则可;对于 Web 服务,我个人偏向于以接口为单位,对重要的接口做单元测试,当然,有些人会将粒度控制到函数层面,都没啥问题,但如果测试粒度太大,比如多个功能同时测试,此时就称为功能测试
了。
1. 构建Flask测试应用
前置工作:使用单元测试的时候测试 flask 的时候需要事先将相关的权限认证,构建测试数据,使用 SQLAlchemy的时候可以SQLAlchemy
的模型导入进Sqllite
中,测试玩车删除也可;
利用 Pytest 测试 Flask 应用的时候,可以直接使用test_client
方法获取测试专用的客户端,并通过app_context
应用上下文方法构建当前应用的上下文;
@pytest.fixture # 通常用来控制作用范围;
def client():
"""获取测试客户端
"""
app.config['TESTING'] = True
with app.app_context():
test_client = app.test_client()
# client.environ_base['HTTP_TOKEN'] = Token 需要增加认证功能的时候设置 token 的值信息
yield test_client
2.视图函数的测试
test_client 与 requests 模块使用方法类似;
2.1 get 请求简单测试
import pytest
from flasktest import create_app
app = create_app()
@pytest.fixture
def client():
"""获取测试客户端
"""
app.config['TESTING'] = True
with app.app_context():
test_client = app.test_client()
# client.environ_base['']
yield test_client
def test_user(client):
url = '/web/user'
resp = client.get(url)
print(resp.json, type(resp.json))
assert resp.json == {'code': 200, 'data': {'msg': 'Hello buleprint restful'}}
将相关的参数输入进去,获得相对应的参数信息,使用断言assert进行判断值是否正确;
def test_user(client):
url = '/web/user'
resp = client.get(url)
print(resp.json, type(resp.json)) # 响应内容信息;
print("响应状态码:", resp.status_code)
print("响应请求头:", resp.content_type)
assert resp.status_code == 200
assert resp.content_type == "application/json"
assert resp.json == {'code': 200, 'data': {'msg': 'Hello buleprint restful'}}
使用断言检查返回值的信息是否与预计的值相同;
2.2 post 请求简单测试
说明:当请求只接收json形式的参数的时候一定要在请求参数中加上content_type="application/json"
,当参数不必须是json形式的时候可以直接删除掉此项;
def test_user_post(client):
url = "/web/user"
resp = client.post(url, content_type="application/json", data=json.dumps({"task": "New Task!"}))
print("响应头信息:", resp.headers)
assert resp.status_code == 200
assert resp.json.get("code") == 2000
assert resp.content_type == "application/json"
2.3 其他常见请求的测试
只需将 client 发送请求的函数换成指定的即可,当需要修改请求头的时候,将请求头的信息修改成为指定的请求头信息;
def test_user_put(client):
url = "/web/user"
resp = client.put(url)
print(resp.json)
assert resp.json == {"code": 1000}
def test_user_delete(client):
url = "/web/user"
resp = client.delete(url)
assert resp.json == {"code": 3000}