python + unittest + request + parameterized 参数化遇到中文名称testcase不显示的问题

最近使用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

 

posted @ 2019-09-11 16:57  石砾  阅读(492)  评论(0编辑  收藏  举报