这是我参与更文挑战的第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