前言
单元测试,及测试某块代码的逻辑是否正确。
通过flask对象的客户端来模拟发送请求。
使用断言assert进行判断,断言成功,程序继续执行;断言失败,抛出断言失败。
登录代码(login.py)
# -*- coding:utf-8 -*-
from flask import Flask
from flask import request, jsonify
app = Flask(__name__)
@app.route("/login", methods=["POST"])
def login():
username = request.form.get("username")
password = request.form.get("password")
if not all([username, password]):
resp = {
"code": 1,
"message": "invalid params"
}
return jsonify(resp)
if username == "admin" and password == "python":
resp = {
"code": 0,
"message": "login success"
}
return jsonify(resp)
else:
resp = {
"code": 2,
"message": "wrong user or password"
}
return jsonify(resp)
if __name__ == "__main__":
app.run(debug=True)
测试登录代码(test.py)
# -*- coding:utf-8 -*-
import unittest
from .login import app
import json
class LoginTest(unittest.TestCase):
"""构造单元测试案例"""
def setUp(self): # 功能类似于def __init__
# 设flask工作在测试模式下
# app.config["TESTING"] = True # 方式一
app.testing = True #方式二
# 使用flask创建客户端
self.client = app.test_client()
def test_empty_username_password(self):
"""测试用户名和密码为空的情况"""
# 模拟客户端发送请求,返回响应对象
ret = self.client.post("/login", data={})
# 获取响应体的数据(是json)
resp = ret.data
resp = json.loads(resp)
# 断言
self.assertIn("code", resp)
self.assertEqual(resp["code"], 1)
def test_wrong_username_password(self):
"""测试用户名获密码错误的情况"""
# 模拟客户端发送请求,返回响应对象
ret = self.client.post("/login", data={
"username": "admin",
"password": "abc"
})
# 获取响应体的数据(是json)
resp = ret.data
resp = json.loads(resp)
# 断言
self.assertIn("code", resp)
self.assertEqual(resp["code"], 2)
def test_login_sucess(self):
"""测试登录成功的情况"""
# 模拟客户端发送请求,返回响应对象
ret = self.client.post("/login", data={
"username": "admin",
"password": "python"
})
# 获取响应体的数据(是json)
resp = ret.data
resp = json.loads(resp)
# 断言
self.assertIn("code", resp)
self.assertEqual(resp["code"], 0)
if __name__ == "__main__":
# 启动测试
unittest.main()
测试结果
Testing started at 12:40 ...
D:\filepython\projects\flaskprojects\venv\Scripts\python.exe "D:\software\pycharm\dir\PyCharm Community Edition 2018.3\helpers\pycharm\_jb_pytest_runner.py" --path D:/filepython/projects/flaskprojects/application/test.py
Launching pytest with arguments D:/filepython/projects/flaskprojects/application/test.py in D:\filepython\projects\flaskprojects\application
============================= test session starts =============================
platform win32 -- Python 3.6.7, pytest-4.0.1, py-1.7.0, pluggy-0.8.0
rootdir: D:\filepython\projects\flaskprojects\application, inifile:collected 3 items
test.py ... [100%]
============================== warnings summary ===============================
D:\filepython\projects\flaskprojects\venv\lib\site-packages\jinja2\filters.py:24
D:\filepython\projects\flaskprojects\venv\lib\site-packages\jinja2\filters.py:24: DeprecationWarning: Flags not at the start of the expression '\\w+(?u)'
_word_re = re.compile(r'\w+(?u)')
-- Docs: https://docs.pytest.org/en/latest/warnings.html
==================== 3 passed, 1 warnings in 0.70 seconds =====================
Process finished with exit code 0