拿我们之前的代码举个例子,在 TestMath 测试类中我们写了4个测试用例,对应了 Math 类的4个方法。但是做测试的都知道,对于每个功能我们不可能只用一条用例去覆盖,我们要充分考虑各种情况从各种角度甚至刁钻的角度来验证我们的程序的功能以及健壮度等情况。比如在 test_add() 中,我们要考虑 0 0 相加,正正相加,正负相加,负负相加,甚至传入非数值类型等情况(这只是举个例子,别太纠结...),那难道我们要为每种情况一条测试用例吗?
答案是否定的,和开发一样,我们要尽可能的提高我们测试用例的复用性,下面我们来采用一些方法来提高测试用例的复用性:
1. 先看下之前的测试用例: ↓↓↓↓↓↓
import unittest
from class_13.math import Math
class TestMath(unittest.TestCase):
"""Math的测试类"""
def test_add(self): # 测试加法
result = Math(15, 30).add()
expect = 45
self.assertEqual(result, expect)
print('加法用例执行完毕!')
2. 很明显,这种测试用例的复用性是很低的,我们需要改造下测试用例:↓↓↓↓↓↓
import unittest
from class_13.math import Math
class TestMath(unittest.TestCase):
"""Math的测试类"""
"""首先我们增加个初始化函数,传入两个相加的数及预期结果,
并且用super()来调用父类的__init__()来初始化和传入用例名"""
def __init__(self, a, b, expect, methodName):
self.a = a
self.b = b
self.expect = expect
super(TestMath, self).__init__(methodName)
def test_add(self):
""""然后将加法测试用例的参数改为动态传参"""
result = Math(self.a, self.b).add()
self.assertEqual(result, self.expect)
print(f'{self.a}+{self.b}的结果是{self.expect}')
3. 然后我们要构造测试数据,并且用 for 循环将测试数据传入测试用例,在添加到 测试套件suite中执行测试用例,输出测试报告:
import unittest # 导入单元测试框架
import HTMLTestRunnerNew # 导入测试报告模版
from class_13.test_math import TestMath # 导入测试类
if __name__ == "__main__":
"""首先将我们要测试数据添加到list中,
list中每个元素中都包含了[a, b, expect],然后用for循环来传入参数,
并用每个元素生成一条测试用例后加载到测试套件suite中,
最后执行用例,生成测试报告!"""
test_date = [[0, 0, 0], # 0 0 相加
[5, 5, 10], # 正正相加
[-5, -5, -10], # 负负相加
[5, -5, 0]] # 正负相加
suite = unittest.TestSuite()
for item in test_date:
suite.addTest(TestMath(item[0], item[1], item[2], 'test_add'))
with open('test_result.html', 'wb') as file: # html文件必须以二进制方式写入
runner = HTMLTestRunnerNew.HTMLTestRunner(stream=file,
title='测试报告',
description='这是第一次执行用例的测试报告!',
verbosity=2,
tester='C大调')
runner.run(suite)
4. 生成测试报告: