单元测试
概述
- 测试方法
- 黑盒测试:不关注程序内部的机制和实现代码,
仅通过界面效果
来测试程序 - 白盒测试:基于接口文档和具体的代码逻辑,
编写测试代码
来测试程序
- 黑盒测试:不关注程序内部的机制和实现代码,
- 测量粒度:
- 单元测试:对
单独的代码块
(例如函数)分别进行测试,以保证他们的正确性 - 集成测试:对大量的程序单元的协同工作情况做测试
- 系统测试:同时对整个系统的正确性进行检查,而不是针对独立的片段
- 单元测试:对
断言
- 断言是编写单元测试时常用的
作物表现形式
- 断言格式
-
assert 表达式,提示信息
- 表达式为一个
程序员认定必须要成立的条件
- 如果条件成立(表达式返回值为true),那么继续往下执行
- 如果条件不成立,会抛出异常
AssertionError
,并显示提示信息
- 提示信息一般为对应
条件成立时的文字描述
断言代码实例:
-
def func_div(num1, num2):
"""除法"""
assert num2 != 0, "num2不能为0"
assert isinstance(num1, (int, float)), "num1应为数字类型"
assert isinstance(num2, (int, float)), "num2应为数字类型"
print(num1 / num2)
func_div("10", 10)
单元测试:
import json
import unittest
from login_demo import app
# 1. 创建单元测试类 继承unittest.TestCase
class LoginTestCase(unittest.TestCase):
# 2. 实现两个方法 分别完成测试 准备和收尾工作
def setUp(self):
# 每次执行测试用例前调用, 一般完成测试准备工作
# 开启测试模式 如果被测试代码测试没有通过, 会在控制台显示错误位置
app.testing = True
# 创建客户端对象 用于发起请求
self.client = app.test_client()
def tearDown(self):
# 每次执行测试用例后调用, 一般完成测试收尾工作
pass
# 3. 实现具体的测试用例(方法) 方法必须以test开头
def test_empty_username_password(self):
"""测试 用户名/密码 为空 时的情况"""
# 发起测试请求, 在用户名/密码 为空的情况下, 校验返回结果中errcode是否为-2
response = self.client.post("/login", data={"username": "itcast"})
# response = self.client.post("/login", data='{"username": "itcast"}', content_type='application/json')
# 获取响应内容
json_str = response.data
# 转为python类型
json_dict = json.loads(json_str)
# 单元测试一般使用断言来进行逻辑判断
self.assertIn("errcode", json_dict, "登录返回的json中应该包含errcode")
errcode = json_dict.get('errcode')
self.assertEqual(errcode, -2, "用户名/密码 为空时, 错误码应为-2")
# TODO 只传password的情况
# TODO username和password都不传的情况
# 3. 实现具体的测试用例(方法) 方法必须以test开头
def test_error_username_password(self):
"""测试 用户名/密码 错误 时的情况"""
# 发起测试请求, 在用户名/密码 为空的情况下, 校验返回结果中errcode是否为-2
response = self.client.post("/login", data={"username": "itcast", "password": "aaa"})
# 获取响应内容
json_str = response.data
# 转为python类型
json_dict = json.loads(json_str)
# 单元测试一般使用断言来进行逻辑判断
self.assertIn("errcode", json_dict, "登录返回的json中应该包含errcode")
errcode = json_dict.get('errcode')
self.assertEqual(errcode, -1, "用户名/密码 为空时, 错误码应为-1")