使用pytest测试Flask(二)

这是我参与更文挑战的第29天,活动详情查看: 更文挑战

前言

上文我们介绍了pytest的相关概念, 并手动初始化了一个链接SQLite数据库的小型Flask App

但这些fixture(固定装置, 还记得它吗?)显然是不够用的

方案

编写测试环境相关代码

在使用数据库进行测试时, 我们必然会预置一些数据

并且在访问接口时, 需要让它们已经写入数据库中

首先, 我们先创建一个用于生成数据的方法:

def init_data():
    ...初始化数据
复制代码

之后, 我们创建数据库的相关fixture, 这里我使用的是Flask-SQLAlchemy:

from flask_sqlalchemy import SQLAlchemy

my_db = SQLAlchemy()

def init_data():
    ...初始化数据
    
@pytest.fixture(scope="session")
def db():
    init_data()
    try:
        yield my_db
    finally:
        my_db.close_all_sessions()
        my_db.drop_all()
复制代码

要注意在测试结束后, 关闭所有数据库连接删除全部数据

否则临时数据库文件不会清除, 非常不优雅

完成数据初始化后, 我们引入请求客户端, 为了编写后续的测试用例:

@pytest.fixture(scope='session')
def client(app, db):
    with app.test_client() as test_client:
        yield test_client
复制代码

其中的app, db就是我们之前创建的fixture, 要注意保证名称一致才能正确加载

编写测试用例

我们需要在tests文件夹下, 创建以test_开头的文件, 例如: test_api

pytest会按照字符顺序执行测试用例

测试用例可以笼统归纳为两种: http请求和非http请求

还记得之前文章中的自定义json编码器吗?它将时间全部转换为了时间戳

对于它的测试属于非http请求, 我们可以不使用fixture, test_json_encoder.py:

from datetime import datetime

from .encoders import MyJSONEncoder

json_encoder = MyJSONEncoder()

def test_datetime():
    now = datetime.now()
    result = json_encoder.default(now)
    assert result == str(round(now.timestamp()))
复制代码

assert(断言)就是校验的精髓, 但它不仅仅应用于测试, 更多的使用方法可以参考Python官方文档, 有中文哦

http请求就需要用到我们刚才创建的client, 在引入它的同时, 还会引入app, db

其实就是构造了整个Flask App的环境, test_user_api.py:

def test_list(client):
    rv = client.get('/api/users')
    json_data = rv.get_json()
    assert json_data['code'] == 200
    assert 'data' in json_data
    assert 1 == len(json_data['data']['items'])
复制代码

总结

测试是健壮性代码的必要条件

请谨记, 先编写好准确的测试用例, 事半功倍

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享