测试开发水货-测试平台系列-Httprunner3踩坑小记-关于setup_hook()的用法

136 阅读1分钟

踩坑 测试开发水货 联系博主

博主最近在用httprunner3做造数据的脚本工作。做过接口测试的同学都知道,接口的数据结构不光是string,int这些常见的,也可能是一个列表,字典等等,前两天我就遇到了一个这样的问题:

这个promotionIds的字段,应该是一个空的列表,但是却被识别成了一个叫[null]的列表,原因是我做了参数化,这个值是由上一个接口带过来的,可以看到这个接口并没有取到值:

由于我做的是参数化,每次执行并不能保证这个字段一定有值,那怎么区分让httprunner能够根据该字段的值是None就返回[],有值就返回[$promotionIds]对应的值呢?


首先我想到的就是在debugtalk.py里写一个方法去处理这个字段,如果是None就返回个空列表,如果不是就把取到的数据塞进一个列表去:

def none_handler(args):
    res = []
    if args == None:
        return []
    else:
        return res.append(args)
        

把这个方法通过setup_hook的方式写在了请求之前(坑):

实际运行发现,当promotionId没有取到值时,是没问题的,但是一旦promotionId有值,就变成了这个样子,然后服务端报错:

这说明,httprunner并没有将这个值处理成[$promotionId]这种形式,而是直接处理成了一个int值。为什么会这样呢?查了源码,没看出什么端倪,为什么没有像我预想的那样,返回一个列表呢:

    def setup_hook(self, hook: Text, assign_var_name: Text = None) -> "RunRequest":
        if assign_var_name:
            self.__step_context.setup_hooks.append({assign_var_name: hook})
        else:
            self.__step_context.setup_hooks.append(hook)

        return self

坑也只能想办法跳过去了

最后,还是在群内大神的点拨下,解决了问题:

把这个处理方法直接写在传参的对应value里,就实现了预想的效果,这么写可能不怎么“优雅”但却是有效的。至于为什么在前面使用setup_hook()方法没有生效,我个人猜测是跟变量赋值的逻辑有关系。但是碍于水平有限,源码不敢轻易改动。还是盼大佬们有机会再指点一二了。

以上です

本文使用 文章同步助手 同步