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初体验

项目结构

image

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()
posted @ 2023-03-13 18:08  一枚码农  阅读(106)  评论(0编辑  收藏  举报