python单元测试-TestCase&TestSuite
目录
1.仅一条用例时单测【register单元测试】
users = [{'user': 'python26', 'password': '123456'}]
def register(username, password1, password2):
# 判断是否有参数为空
if not all([username, password1, password2]):
return {"code": 0, "msg": "所有参数不能为空"}
# 注册功能
for user in users: # 遍历出所有账号,判断账号是否存在
if username == user['user']:
# 账号存在
return {"code": 0, "msg": "该账户已存在"}
else:
if password1 != password2:
# 两次密码不一致
return {"code": 0, "msg": "两次密码不一致"}
else:
# 账号不存在 密码不重复,判断账号密码长度是否在 6-18位之间
if 6 <= len(username) >= 6 and 6 <= len(password1) <= 18:
# 注册账号
users.append({'user': username, 'password': password2})
return {"code": 1, "msg": "注册成功"}
else:
# 账号密码长度不对,注册失败
return {"code": 0, "msg": "账号和密码必须在6-18位之间"}
2.一条测试用例时【testcase】
import unittest
from learning.practice.register import register
class RegisterTest(unittest.TestCase):
# 重写init方法的作用:再父类的基础上进行扩展,导入参数
def __init__(self, methodName, case_data):
self.case_data = case_data
# 调用父类的init方法super超类调用父类方法
super().__init__(methodName)
def test_register_pass(self):
# 正常注册
# 第一步:准备用例数据
# 入参
data = self.case_data["data"]
# 预期结果
excepted = self.case_data["excepted"]
# 第二步:获取实际结果
# 实际结果(传入参数,调用待测试的功能函数)
# 元组进行拆包*
res = register(*data)
# 第三步:比较预期结果和实际结果(断言)
# 断言预期和实际是否相等 assertEqual
self.assertEqual(excepted, res)
3.运行该条用例【run_test】
import unittest
from learning.practice.demo1.testcase import RegisterTest
from HTMLTestRunnerNew import HTMLTestRunner
#单独一条用例数据
case1 = {"excepted": {"code": 1, "msg": "注册成功"},
"data": ('python27', '123456', '123456')}
# 创建测试套件
suite = unittest.TestSuite()
# 逐条加载
# 创建一条测试用例(一个测试用例对象)
case = RegisterTest("test_register_pass",case1) #需要重写init方法,才能导入参数
#通过类创建对象时,参数会传到类的哪个方法int
#加载用例套件
suite.addTest(case)
#创建一个测试运行程序
runner = HTMLTestRunner(stream=open("demo1_report.html", "wb"), title="demo1测试报告", description="baobao",
tester="想") # 以覆盖写入二进制方式
# 执行测试套件中的测试用例
runner.run(suite)
4.多条用例时单测testcase
【ps:文档注释"""正常注册"""】
import unittest
from learning.practice.register import register
class RegisterTest(unittest.TestCase):
# 重写init方法的作用:再父类的基础上进行扩展,导入参数
def __init__(self, methodName, case_data):
self.case_data = case_data
# 调用父类的init方法super超类调用父类方法
super().__init__(methodName)
def test_register_pass(self):
"""正常注册 """
# 第一步:准备用例数据
# 入参
data = self.case_data["data"]
# 预期结果
excepted = self.case_data["excepted"]
# 第二步:获取实际结果
# 实际结果(传入参数,调用待测试的功能函数)
# 元组进行拆包*
res = register(*data)
# 第三步:比较预期结果和实际结果(断言)
# 断言预期和实际是否相等 assertEqual
self.assertEqual(excepted, res)
5.测试用例运行run_test
import unittest
from learning.practice.demo1.testcase import RegisterTest
from HTMLTestRunnerNew import HTMLTestRunner
# 多条用例数据
cases = [{"excepted": {"code": 1, "msg": "注册成功"}, "data": ('python27', '123456', '123456')},
{"excepted": {"code": 0, "msg": "所有参数不能为空"}, "data": ('python28', '123456', None)},
{"excepted": {"code": 0, "msg": "两次密码不一致"}, "data": ('python29', '123456', '1234567')},
{"excepted": {"code": 0, "msg": "该账户已存在"}, "data": ('python26', '123456', '123456')}]
"""
# 单独一条用例数据
case1 = {"excepted": {"code": 1, "msg": "注册成功"},
"data": ('python27', '123456', '123456')}
"""
# 创建测试套件
suite = unittest.TestSuite()
# 通过循环来遍历用例数据,每遍历出来一条数据,就创建一个用例对象,将用例对象添加到套件中
for case_data in cases:
# 逐条加载
# 创建一条测试用例(通过测试用例类创建一个测试用例对象)
case = RegisterTest("test_register_pass", case_data) # 需要重写init方法,才能导入参数
# 通过类创建对象时,参数会传到类的哪个方法int
# 加载用例套件
suite.addTest(case)
# 创建一个测试运行程序
runner = HTMLTestRunner(stream=open("demo1_report.html", "wb"), title="demo1测试报告", description="baobao",
tester="想") # 以覆盖写入二进制方式
# 执行测试套件中的测试用例
runner.run(suite)