unittest设计之初是为了做单元测试,但实际它也可用于接口等自动化测试,接下来就尝试去使用这个框架完成一次简单的测试。
为了使用这个框架,首先设计一个功能点:判断两个数据的值是否相等,
class CheckData: def is_equal_check(self, param01=None, param02=None): """判断param01和param02的值是否相等""" if all([param01, param02]): if param01 == param02: return {'code': 0, 'message': '参数值相等!'} else: return {'code': 0, 'message': '参数值不相等!'} else: return {'code': 1, 'message': '参数不能为空!'}
为了验证上面这个功能点,我们再设计几个简单的用例数据和期望结果,
用例编号 | 用例名称 | 测试数据 | 期望结果 |
1 | 参数相等 | (1, 1) | {'code': 0, 'message': '参数值相等!'} |
2 | 参数不相等 | (1, 2) | {'code': 0, 'message': '参数值不相等!'} |
3 | 参数为空 | (1,) | {'code': 1, 'message': '参数不能为空!'} |
假设上面的数据已经覆盖了所有的场景,接下来我们就可以正式开始使用Unittest了。
第一步:
导入unittest模块,创建测试类,类中根据设计好的用例来声明对应的测试方法(ps:测试方法一定要以test开头,否则无法被识别),测试类继承于unittest.TestCase类,
import unittest class CheckDataTest(unittest.TestCase): """CheckDataTest继承了unittest模块的TestCase类""" def test_equal(self): """测试参数相等""" pass def test_not_equal(self): """测试参数不相等""" pass def test_param_is_none(self): """测试参数为空""" pass
第二步:
1、导入待测试的类,
from checkdata import CheckData
2、完善测试用例方法,由于每个测试方法都对应一个测试用例,所以在方法中先准备各自的测试数据和期望结果,以test_equal为例,
data = (1, 1) expected = {'code': 0, 'message': '参数值相等!'}
3、有了测试数据和期望结果,接着就可以验证功能点实现是否正确,并获取响应结果,
result = CheckData().is_equal_check(*data) # '*'将元组拆成两个数据
4、最后断言期望结果和实际结果是否一致
self.assertEqual(expected, result)
这里的断言是unittest.TestCase继承的。
既然测试用例已经写好了,那么怎么去执行呢,如果说单个测试用例,我们手动执行,如果有大批量的用例呢,又比如这些用例不在同一个类中, 同一个模块中,又该怎么处理,这就涉及到下面的操作,关于Unittest框架的测试套件,测试套件可以根据实际所需的场景对大批量测试用例做不同粒度的划分。
第三步:
首先创建一个专门用于执行用例的文件run_testcase.py,导入unittest,然后在文件内做用例执行规划,
1、实例化测试套件对象;
suite = unittest.TestSuite()
2、实例化测试用例加载对象
loader = unittest.TestLoader()
3、通过加载对象往测试套件添加测试用例;
suite.addTest(loader.loadTestsFromTestCase(CheckDataTest))
除了上面这种方法外,还可以通过模块加载、测试用例文件所在路径加载,甚至可以加载单条用例。
4、创建测试套件运行对象
runner = unittest.TextTestRunner()
5、通过运行对象执行套件
runner.run(suite)
第四步:
直接运行run_testcase.py文件,看看会有什么结果,
可以看到,一共运行了3个测试用例,结果OK,说明用例均执行通过。
我们还需要掌握:
前置处理
- setUp(self) 每个测试用例执行之前运行
- setUpClass(cls) 整个个测试用例类执行之前运行,要使用@classmethod装饰
后置处理
- tearDown(self) 每个测试用例执行之后运行
- tearDownClass(cls) 整个测试用类例执行之前运行,要使用@classmethod装饰