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}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通