unittest是Python自带的单元测试框架,在unittest库中,它自己封装 一些校验返回的结果方法和一些用例执行前的初始化操作
接下来,我们需要了解下unittest的几个概念:
1. TestCase 也就是测试用例
2. TestSuite 多个测试用例集合在一起,就是TestSuite
3. TestLoader是用来加载TestCase到TestSuite中的
4. TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息
接下来,我们以一个简单例子来说明,用户注册:
1. 用户注册函数的逻辑代码在:register.py模块中
"""
用户注册要求如下:
1. 不允许注册相同用户名的账号,即:用户名唯一
2. 用户名长度在[6,15]之间,包含6和15
3. 密码长度不能小于6,且不能超过20;
"""
userinfo = {'Lujier': '123456', 'Lujier02': '234567'}
def register(username, password):
if len(username) < 6 or len(username) > 15:
return {'code': 2, 'msg': '用户名长度须在6-15内'}
elif len(password) < 6 or len(password) > 20:
return {'code': 3, 'msg': '密码长度须在6-20内'}
elif username in userinfo.keys():
return {'code': 1, 'msg': '该用户名已被使用'}
else:
userinfo[username] = password
return {'code': 0, 'msg': '注册成功'}
2. 那我们开始设计测试用例:
1. 用户名长度小于6:
测试数据:username = 'Luji' password='1234567'
预期结果: {'code': 2, 'msg': '用户名长度须在6-15内'}
2. 用户名长度大于15:
测试数据:username = '1234567890123456' password='1234567'
预期结果: {'code': 2, 'msg': '用户名长度须在6-15内'}
3. 用户名已被注册:
测试数据:username = 'Lujier' password='1234567'
预期结果: {'code': 1, 'msg': '该用户名已被使用'}
4. 密码长度小于6:
测试数据: username = 'Lujier001' password='12345'
预期结果: {'code': 3, 'msg': '密码长度须在6-20内'}
5. 密码长度大于20:
测试数据: username = 'Lujier001' password='123456789012345678901'
预期结果: {'code': 3, 'msg': '密码长度须在6-20内'}
6. 成功注册:
测试数据: username = 'Lujier001' password='1234567'
预期结果: {'code': 3, 'msg': '密码长度须在6-20内'}
3. 接下来,我们开始定义一个测试类:TestRegister
import unittest
from register import *
class TestRegister(unittest.TestCase):
def setUp(self):
# 每一条用例执行前都会进行该操作,一般用于做初始化处理
pass
def tearDown(self):
# 跟setUp()对应,每一条用例执行完成后都会进行该操作
pass
def test_register_001(self):
# 用户名长度小于6
data = ['Luji', '1234567'] # 测试数据
expect_result = {'code': 2, 'msg': '用户名长度须在6-15内'} # 预期结果
actual_result = register(*data) # 测试结果
try:
self.assertEqual(actual_result, expect_result)
except Exception as msg:
print("test_register_001测试失败,原因:{}!".format(msg))
raise msg
else:
print("test_register_001用例执行成功")
def test_register_002(self):
# 用户名长度大于15
data = ['1234567890123456', '1234567'] # 测试数据
expect_result = {'code': 2, 'msg': '用户名长度须在6-15内'} # 预期结果
actual_result = register(*data) # 测试结果
try:
self.assertEqual(actual_result, expect_result)
except Exception as msg:
print("test_register_002测试失败,原因:{}!".format(msg))
raise msg
else:
print("test_register_002用例执行成功")
def test_register_003(self):
# 用户名已被注册
data = ['Lujier', '1234567'] # 测试数据
expect_result = {'code': 1, 'msg': '该用户名已被使用'} # 预期结果
actual_result = register(*data) # 测试结果
try:
self.assertEqual(actual_result, expect_result)
except Exception as msg:
print("test_register_003测试失败,原因:{}!".format(msg))
raise msg
else:
print("test_register_003用例执行成功")
def test_register_004(self):
# 密码长度小于6
data = ['Lujier001', '12345'] # 测试数据
expect_result = {'code': 3, 'msg': '密码长度须在6-20内'} # 预期结果
actual_result = register(*data) # 测试结果
try:
self.assertEqual(actual_result, expect_result)
except Exception as msg:
print("test_register_004测试失败,原因:{}!".format(msg))
raise msg
else:
print("test_register_004用例执行成功")
def test_register_005(self):
# 密码长度大于20
data = ['Lujier001', '123456789012345678901'] # 测试数据
expect_result = {'code': 3, 'msg': '密码长度须在6-20内'} # 预期结果
actual_result = register(*data) # 测试结果
try:
self.assertEqual(actual_result, expect_result)
except Exception as msg:
print("test_register_005测试失败,原因:{}!".format(msg))
raise msg
else:
print("test_register_005用例执行成功")
def test_register_006(self):
# 成功注册
data = ['Lujier001', '1234567'] # 测试数据
expect_result = {'code': 0, 'msg': '注册成功'} # 预期结果
actual_result = register(*data) # 测试结果
try:
self.assertEqual(actual_result, expect_result)
except Exception as msg:
print("test_register_006测试失败,原因:{}!".format(msg))
raise msg
else:
print("test_register_006用例执行成功")
4 . 用例写好了,那么就到该如何运行用例了
第一种:可以直接在测试用例文件中运行
if __name__ == "__main__":
unittest.main()
结果如下:
第二种:
将多个用例集合在一起,然后再进行运行
1) 新建一个py文件,用来做运行用例文件:run_suite.py
2) # 创建一个测试套件
suite = unittest.TestSuite()
# 加载测试用例, 共有4种方法
# 第一种,单个添加:接受的参数是测试用例对象
suite.addTest(TestRegister("test_register_001"))
suite.addTest(TestRegister("test_register_002"))
suite.addTest(TestRegister("test_register_003"))
suite.addTest(TestRegister("test_register_004"))
suite.addTest(TestRegister("test_register_005"))
suite.addTest(TestRegister("test_register_006"))
# 第二种,一次添加多条用例
suite.addTests([TestRegister("test_register_001"), TestRegister("test_register_002"),
TestRegister("test_register_003"), TestRegister("test_register_004"),
TestRegister("test_register_005"), TestRegister("test_register_006")])
# 第三种:一次添加一个测试类(类名不需要加引号)
# 创建一个加载测试测试用例对象
loader = unittest.TestLoader()
# 加载整个测试用例类
suite.addTest(loader.loadTestsFromTestCase(TestRegister))
# 第四种,模块添加
# 加载测试用例所在模块
suite.addTest(loader.loadTestsFromModule(test_register))
3) 用例加载完成之后,就是执行用例了:
先创建一个runner对象: runnerr =unittest.TextTestRunner()
运行: runner.run(suite)
# 运行测试集合
runner = unittest.TextTestRunner() # 创建一个runner对象
runner.run(suite)
运行结果如下:
以上,就是最基本的单元测试的过程,后续还会继续优化单元测试相关信息