案例7-Unittest测试框架定制
需求描述
假设由你们公司的已有一套前辈开发的基于unittest的测试框架,现在交由你进行维护。领导另外提出了一些新的需求,比如:
提示
Unittest用例的本质是将继承unittest.TestCase的测试类的每一个test开头的测试方法,变成该测试类的对象,添加到测试套件中以批量运行。
用例标记
我们可以使用自定义的装饰器,为测试函数添加优先级、状态、负责任、版本等属性
然后通过自定义测试基类,重写__init__()方法来把测试函数的这些属性绑定到测试用例对象上。例如:
import unittest
def test(priority=None, status=None, owner=None, version=None):
# TODO: 返回一个装饰器,为测试函数添加指定属性
class TestBase(unittest.TestCase):
def __init__(self, methodName='runTest'):
super().__init__(methodName) # 调用父类方法以保留原有功能
testMethod = getattr(self, methodName) # 获取测试函数对象
# TODO: 拷贝测试函数属性到self
实际应用示例
class TestDemo(TestBase):
@test(priority='p1', status='ready', owner='Lilei', version='v1.0.0', tags=['demo', 'api'])
def test_a():
pass
用例筛选
筛选用例,可以先用unittest.defaultTestLoader.discover()
收集到所有的用例,然后递归遍历测试套件,得到所有的用例列表,然后根据需求(如priorities=['p0', 'p1'], 进行筛选。
并发运行
并发运行可以通过自定义TestSuite或TestRunner并结合线程池来实现。