Python 装饰器函数 create_case_with_case_data 解释
这段代码定义了一个装饰器函数 'create_case_with_case_data',它接受一个函数作为参数。该函数会遍历函数对象中的测试数据(通过装饰器 '@case_data' 提供),并根据测试数据生成对应的测试用例。
对于每个测试用例,它会根据测试数据的类型,使用 '_feed_data' 函数将测试数据传递给被装饰函数,并使用 '_handler' 函数处理被装饰函数的返回值。最终,该函数会返回一个字典,其中包含所有生成的测试用例及其执行结果。
代码解释:
def create_case_with_case_data(func):
result = dict()
for index, test_data in enumerate(getattr(func, CASE_DATA_FLAG), 1):
if not hasattr(func, CASE_SKIP_FLAG):
setattr(func, CASE_RUN_INDEX_FlAG, Tool.create_actual_run_index())
func_name = Tool.modify_func_name(func)
if isinstance(test_data, list):
func_name = Tool.general_case_name_with_test_data(func_name, index, test_data)
if getattr(func, CASE_DATA_UNPACK_FLAG, None):
result[func_name] = _handler(_feed_data(*test_data)(func))
else:
result[func_name] = _handler(_feed_data(test_data)(func))
elif isinstance(test_data, dict):
func_name = Tool.general_case_name_with_test_data(func_name, index, test_data.values())
if getattr(func, CASE_DATA_UNPACK_FLAG, None):
result[func_name] = _handler(_feed_data(**test_data)(func))
else:
result[func_name] = _handler(_feed_data(test_data)(func))
elif isinstance(test_data, (int, str, bool, float)):
func_name = Tool.general_case_name_with_test_data(func_name, index, [test_data])
result[func_name] = _handler(_feed_data(test_data)(func))
else:
raise Exception('无法解析{}'.format(test_data))
return result
- 装饰器定义:
def create_case_with_case_data(func):定义了一个装饰器函数,它接收一个函数 'func' 作为参数。 - 结果字典:
result = dict()初始化一个字典,用于存储生成的测试用例及其结果。 - 测试数据循环:
for index, test_data in enumerate(getattr(func, CASE_DATA_FLAG), 1):遍历函数对象 'func' 中的测试数据,'CASE_DATA_FLAG' 是一个常量,用于标识测试数据属性。 - 测试用例生成: 根据测试数据的类型 (
list,dict,int,str,bool,float) 生成不同的测试用例名称并执行相应的操作。- 列表数据:
if isinstance(test_data, list):使用 '_feed_data' 函数将测试数据传递给被装饰函数,并根据 'CASE_DATA_UNPACK_FLAG' 是否为真来决定是否解包测试数据。 - 字典数据:
elif isinstance(test_data, dict):类似于列表数据处理,但使用 '**' 来解包字典。 - 基本类型:
elif isinstance(test_data, (int, str, bool, float)):将测试数据包装成列表后处理。
- 列表数据:
- 执行结果处理:
result[func_name] = _handler(_feed_data(test_data)(func))使用 '_handler' 函数处理被装饰函数的返回值,并将结果存储到 'result' 字典中。 - 返回值:
return result返回包含所有生成的测试用例及其执行结果的字典。
总结:
该代码利用装饰器模式,通过遍历函数对象中的测试数据,动态生成多个测试用例,并执行测试用例,最终返回所有测试用例的执行结果。这可以帮助开发者方便地进行测试用例管理和执行。
原文地址: https://www.cveoy.top/t/topic/jqCO 著作权归作者所有。请勿转载和采集!