最近使用python+unittest+request+parameterized做接口测试,然后在利用parameterized做参数化时,发现测试用例的中文名称,感觉很奇怪,于是跟踪了parameterized的源码。
花了2小时之久,终于找到,是parameterized.expand函数中,使用了name_func对测试用例的名称进行定义。然后继续追踪发现
在我们不传入name_func的值时,系统会使用默认的函数去赋值
name_func = name_func or default_name_func
然后跟踪到default_name_func查看,发现调用了to_safe_name方法对字符串进行格式化
def default_name_func(func, num, p): base_name = func.__name__ name_suffix = "_%s" %(num, ) if len(p.args) > 0 and isinstance(p.args[0], string_types): name_suffix += "_" + parameterized.to_safe_name(p.args[0]) return base_name + name_suffix
进一步查看to_safe_name,发现to_safe_name中,格式化的pattern,过滤了中文
def to_safe_name(cls, s): return str(re.sub("[^a-zA-Z0-9_]+", "_", s))
所以问题找到了,是因为t_safe_name过滤了中文。
那么怎么解决呢,我们一般最好不要修改源代码吧,所以我们可以按照default_name_func自定义一个函数,然后调用自定义的to_safe_name方法
def to_safe_name(s): # 对所有非英文,数字,下划线和中文的字符都替换为"_" return str(re.sub("[^a-zA-Z0-9_u4e00-u9fa5]+", "_", s))
def test_name_func(func, num, p): base_name = func.__name__ name_suffix = "_%s" %(num, ) if len(p.args) > 0 and isinstance(p.args[0], string_types): name_suffix += "_" + to_safe_name(p.args[0]) return base_name + name_suffix
然后parameterized.expand的参数中写上自定义的方法名:test_name_func
class Test(unittest.TestCase): .... @parameterized.expand(iterator_data, test_name_func) def test01_xxx(self): ....
注意:以上代码只是为了演示思想,没有经过实际验证。
正则表达式来源:https://blog.csdn.net/weixin_42614447/article/details/89876335