使用allpairspy时Content-Type作为参数名报错的原因及解决方法
问题分析:使用allpairspy时参数名含连字符报错的原因与解决办法
问题复现
使用以下代码时:
from allpairspy import AllPairs from collections import OrderedDict parameters = OrderedDict([('Content-Type', ['"application/json"', '"application/xml"'])]) test_cases = list(AllPairs(parameters))
出现如下报错:
Traceback (most recent call last): File "/home/nio/Documents/projects/ironball/pairwise_engine/gen_pairwise_cases.py", line 60, in <module> for i, pairs in enumerate(AllPairs(parameters, filter_func=is_valid_combination)): File "/home/nio/miniconda3/envs/kytest/lib/python3.9/site-packages/allpairspy/allpairs.py", line 60, in __init__ self.__pairs_class = namedtuple("Pairs", self.__param_name_list) File "/home/nio/miniconda3/envs/kytest/lib/python3.9/collections/__init__.py", line 390, in namedtuple raise ValueError('Type names and field names must be valid ' ValueError: Type names and field names must be valid identifiers: 'Content-Type'
将参数名改为Content_Type后代码可正常运行,请问问题原因是什么?如何直接使用Content-Type作为参数名?
问题原因
allpairspy库内部会用collections.namedtuple生成封装测试用例的结构,而Python的标识符规则不允许使用连字符(-),Content-Type里的-违反了这个规则,导致namedtuple初始化失败报错。换成下划线_的Content_Type符合合法标识符要求,因此能正常运行。
解决办法
方式一:指定返回类型为普通元组
调用AllPairs时设置return_type="tuple",让库返回普通元组而非namedtuple,跳过参数名的合法性校验:
from allpairspy import AllPairs from collections import OrderedDict parameters = OrderedDict([('Content-Type', ['"application/json"', '"application/xml"'])]) # 指定返回普通元组 test_cases = list(AllPairs(parameters, return_type="tuple")) # 使用时按顺序取值,第一个元素对应Content-Type的值 for case in test_cases: print(f"Content-Type: {case[0]}")
方式二:临时替换参数名,生成用例后还原
先将含连字符的参数名替换为合法标识符,生成测试用例后再把键名改回原名称:
from allpairspy import AllPairs from collections import OrderedDict # 用合法临时名替代原参数名 temp_params = OrderedDict([('Content_Type', ['"application/json"', '"application/xml"'])]) test_cases = list(AllPairs(temp_params)) # 还原参数名 restored_cases = [] for case in test_cases: restored_dict = {"Content-Type": case.Content_Type} restored_cases.append(restored_dict) # 查看还原后的结果 for item in restored_cases: print(item)
内容的提问来源于stack exchange,提问作者Jay Xiong
相关产品推荐
相关产品推荐

