案例7-Unittest测试框架定制

发布时间 2023-08-04 14:36:55作者: 韩志超

需求描述

假设由你们公司的已有一套前辈开发的基于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并结合线程池来实现。