flask使用unittest 单元测试
unittest基本概念
unittest的几个核心要素:
TestCase: 测试用例类
Fixture: 测试固件,用于测试用例环境的搭建和销毁. setUP()前置条件 和 tearDown()后置条件
TestSuite: 测试套件,把需要执行的测试用例 集合在一起.
TextTestRunner: 测试执行器,执行测试用例。执行完用例之后会生成一个文字版的测试报告
report: 第三方的库 HTMLTestRunner(简陋),BeautifulReport(完善漂亮)。既然都是用第三方库,为什么不用个完善、漂亮的呢
unittest的语法规则:
1.用例类必须继承于unittest.TestCase
2.所有的测试用例,必须以test开头
3.运行的顺序与代码的位置无关,按照 ASCII 升序排列, 0-9,A-Z,a-z
常用断言方法
assertEqual 如果两个值相等,则pass
assertNotEqual 如果两个值不相等,则pass
assertTrue 判断bool值为True,则pass
assertFalse 判断bool值为False,则pass
assertIsNone 不存在,则pass
assertIsNotNone 存在,则pass
unittest测试flask初体验
项目结构
main文件是falsk应用
test文件夹下是单元测试代码
main.py
from flask import Flask, request
app = Flask(__name__)
@app.route('/login', methods=['POST'])
def login():
body = request.json
username = body.get('username')
password = body.get('password')
if not (username and password):
return {'code': -1, 'msg': '用户名或密码为空'}
print(1111, username, password)
return {'code': 0, 'msg': '成功'}
@app.route('/logout', methods=['get'])
def logout():
print(222, '退出登录')
return {'code': 0, 'msg': '成功'}
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
test/init.py
from unittest import TestCase
from main import app
class BaseCase(TestCase):
"""
自定义unittest测试基础类
"""
def setUp(self) -> None:
print('---------------setUp')
# 使能测试标志
app.testing = True
# 使用flask提供的客户端进行测试, 也可以使用其他模块如requests urllib等
self.client = app.test_client()
def tearDown(self) -> None:
print('---------------tearDown')
test/accesss.py
import json
from test import BaseCase
from unittest import main
class Login(BaseCase):
def test_success(self):
headers = {
'Content-Type': 'application/json'
}
data = {
'username': 'test',
'password': 'test@123'
}
res = self.client.post('/login', headers=headers, data=json.dumps(data))
self.assertEqual(res.status_code, 200, '登录成功测试失败')
res = res.json
self.assertEqual(res.get('code'), 0, '登录成功测试失败')
def test_empty_username(self):
headers = {
'Content-Type': 'application/json'
}
data = {
'password': 'test@123'
}
res = self.client.post('/login', headers=headers, data=json.dumps(data))
self.assertEqual(res.status_code, 200, '缺少用户名测试失败')
res = res.json
self.assertEqual(res.get('code'), -1, '缺少用户名测试失败')
def test_empty_password(self):
headers = {
'Content-Type': 'application/json'
}
data = {
'username': 'test'
}
res = self.client.post('/login', headers=headers, data=json.dumps(data))
self.assertEqual(res.status_code, 200, '缺少用户名测试失败')
res = res.json
self.assertEqual(res.get('code'), -1, '缺少用户名测试失败')
if __name__ == '__main__':
main()