第二篇上一节的内容,我们在进行注册函数的逻辑测试时,写了6个测试函数,我们发现所有测试函数中只有data和expect_result不一样,其他内容都一样,那我们就想想函数的作用是什么?是实现一个功能,当不同参数函数的结果也不一样时,那我们就可以将这些参数可以作为函数参数传入
如上一节内容,既然只有data和expect_result不一样,那么我们就可以
1. 将所有的测试数据存在一个变量中
testcase = [[['Luji', '1234567'], {'code': 2, 'msg': '用户名长度须在6-15内'}],
[['1234567890123456', '1234567'], {'code': 2, 'msg': '用户名长度须在6-15内'}],
[['Lujier', '1234567'], {'code': 1, 'msg': '该用户名已被使用'}],
[['Lujier001', '12345'], {'code': 3, 'msg': '密码长度须在6-20内'}],
[['Lujier001', '123456789012345678901'], {'code': 3, 'msg': '密码长度须在6-20内'}],
[['Lujier001', '1234567'], {'code': 0, 'msg': '注册成功'}]
]
2. 在定义测试函数时,则将data和expect_result作为该函数参数(test_regiater.py)
class TestRegister(unittest.TestCase):
def setUp(self):
print("每一条用例执行开始")
def tearDown(self):
print("每一条用例执行开始")
def test_register(self, data, expect_result):
actual_result = register(*data) # 测试结果
try:
# 断言处理
self.assertEqual(actual_result, expect_result)
except Exception as msg:
print("用例执行失败,原因:{}!".format(msg))
raise msg
else:
print("用例执行成功")
3. 测试用例集文件run_suite.py如下内容:
import unittest
from CSDN.test_register import TestRegister
from HTMLTestRunnerNew import HTMLTestRunner
'''创建一个测试套件'''
suite = unittest.TestSuite()
# 用例测试数据,
testcases = [[['Luji', '1234567'], {'code': 2, 'msg': '用户名长度须在6-15内'}],
[['1234567890123456', '1234567'], {'code': 2, 'msg': '用户名长度须在6-15内'}],
[['Lujier', '1234567'], {'code': 1, 'msg': '该用户名已被使用'}],
[['Lujier001', '12345'], {'code': 3, 'msg': '密码长度须在6-20内'}],
[['Lujier001', '123456789012345678901'], {'code': 3, 'msg': '密码长度须在6-20内'}],
[['Lujier001', '1234567'], {'code': 0, 'msg': '注册成功'}]
]
for case in testcases:
suite.addTest(TestRegister('test_register', case[0], case[1]))
# 3. HTMLTestRunnerNew 测试报告
with open("test_report.html", "wb") as f:
runner = HTMLTestRunner(
stream=f,
verbosity=0,
title="test reports",
description="",
tester="Lujier")
runner.run(suite)
但是,存在一个问题那就是,我们一般进行测试时,会有很多的测试模块,这样就导致
1) run_suite.py文件可能内容过多;
2) 如果测试数据出错,就需要进入run_suite中,找到问题模块的数据,代码较多情况下,不好定位
那么如何解决呢?
在这里,我们就要开始引入ddt了, 我们可以将测试数据放在对应的测试模块中,测试模块内容如下:
test_register.py
import unittest
from ddt import data,ddt
@ddt
class TestRegister(unittest.TestCase):
# 用例测试数据,
testcases = [[['Luji', '1234567'], {'code': 2, 'msg': '用户名长度须在6-15内'}],
[['1234567890123456', '1234567'], {'code': 2, 'msg': '用户名长度须在6-15内'}],
[['Lujier', '1234567'], {'code': 1, 'msg': '该用户名已被使用'}],
[['Lujier001', '12345'], {'code': 3, 'msg': '密码长度须在6-20内'}],
[['Lujier001', '123456789012345678901'], {'code': 3, 'msg': '密码长度须在6-20内'}],
[['Lujier001', '1234567'], {'code': 0, 'msg': '注册成功'}]
]
def setUp(self):
print("每一条用例执行开始")
def tearDown(self):
print("每一条用例执行开始")
@data(*testcases)
def test_login(self, testcase):
datacontent = testcase[0] # 测试数据
expect_result = testcase[1] # 预期结果
actual_result = register(*datacontent) # 测试结果
try:
# 断言处理
self.assertEqual(actual_result, expect_result)
except Exception as msg:
print("用例测试失败,原因:{}!".format(msg))
raise msg
else:
print("用例执行成功")
那自然的,run_suite文件内容就跟上一节的内容一样喽
import unittest
from CSDN.test_register import TestRegister
from HTMLTestRunnerNew import HTMLTestRunner
'''创建一个测试套件'''
suite = unittest.TestSuite()
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(TestLogin))
# 3. HTMLTestRunnerNew 测试报告
with open("test_report.html", "wb") as f:
runner = HTMLTestRunner(
stream=f,
verbosity=0,
title="test reports",
description="",
tester="Lujier")
runner.run(suite)
运行结果如下: