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}
posted @ 2022-11-22 18:10  紫青宝剑  阅读(424)  评论(0编辑  收藏  举报