首页 > 其他分享 >httprunner 4.x学习 - 11.hook 机制

httprunner 4.x学习 - 11.hook 机制

时间:2023-05-10 10:24:40浏览次数:44  
标签:11 body httprunner hooks request sign hook return

前言

前言

httprunner 4.x可以支持hook机制,在发送请求前做一些预处理或在请求完成后后置处理

  • setup_hooks :主要用于处理接口的前置的准备工作,也可以对请求 request 参数签名加密等操作
  • teardown_hooks:主要用于后置清理工作,也可以对返回 respone 解密等操作

测试步骤添加hook

在项目根目录新建 debugtalk.py,名称一定要一样

# debugtalk.py
# 作者-上海悠悠 wx:283340479
# blog地址 https://www.cnblogs.com/yoyoketang/

def hook_up():
    print("前置操作:setup!")

def hook_down():
    print("后置操作:teardown!")

只在第一个步骤添加 setup_hooks 和 teardown_hooks
test_h.yml

config:
    name: logincase
    variables: {}

teststeps:
-
    name: step1 login
    request:
        url: http://www.example.com
        method: GET
    setup_hooks:
      - ${hook_up()}
    teardown_hooks:
      - ${hook_down()}

执行用例

hrp run test_h.yml --gen-html-report

执行用例发现有报错

8:58AM ERR gRPC Call() failed error="rpc error: code = Unknown desc = Exception calling application: Function return type
 <class 'NoneType'> not supported!" funcArgs=[] funcName=hook_up
8:58AM ERR call function failed error="rpc error: code = Unknown desc = Exception calling application: Function return ty
pe <class 'NoneType'> not supported!" arguments=[] funcName=hook_up
8:58AM ERR run step end error="run setup hooks failed: rpc error: code = Unknown desc = Exception calling application: Fu
nction return type <class 'NoneType'> not supported!: call function failed" step="step1 login" success=false type=request
8:58AM ERR [Run] run testcase failed error="abort running due to failfast setting: run setup hooks failed: rpc error: cod
e = Unknown desc = Exception calling application: Function return type <class 'NoneType'> not supported!: call function f
ailed"

提示函数不能return NoneType (可能是go 引擎执行的时候不支持return None, 使用python的 pytest执行没问题)

稍微改下,给个return 即可

# debugtalk.py
# 作者-上海悠悠 wx:283340479
# blog地址 https://www.cnblogs.com/yoyoketang/

def hook_up():
    print("前置操作:setup!")
    return ""


def hook_down():
    print("后置操作:teardown!")
    return ""

请求 request 预处理

针对请求request 发出去的参数预处理,也可以用到 setup_hooks,需传一个内置 request 参数,debugtalk.py代码如下

def request_sign(request):
    """请求sign签名"""
    print("请求body:", request.get("body"))
    # 新增 sign 参数
    request["body"]["sign"] = "sign xxxxxxxxxxxxxxx"
    print("sign 签名后请求body:", request.get("body"))
    return request

test_h1.yml

config:
    name: logincase
    variables: {}

teststeps:
-
    name: step1 login
    request:
        url: http://www.example.com
        method: POST
        json:
           user: test
           psw: "123456"
    setup_hooks:
      - ${request_sign($request)}

执行用例

hrp run test_h1.yml --gen-html-report

查看报告,请求参数添加 sign 签名成功

这里请求预处理跟之前3.x 版本写法有一点点区别,如果想用执行的hrun去执行,需改下debugtalk.py 文件内容

# debugtalk.py
def request_sign(request):
    """请求sign签名"""
    print("请求body:",request.get("req_json"))
    # 新增 sign 参数
    request["req_json"]["sign"] = "sign xxxxxxxxxxxxxxx"
    print("sign 签名后请求body:", request.get("req_json"))
    return request

(获取请求参数的 body 改成 req_json)

返回 response 处理

如果需要在接口返回后,对返回的结果处理,可以添加respone请求参数,比如我把返回的body改成了"yoyo"

def response_status(response):
    """修改返回状态码"""
    print("返回response body:", response["body"])
    response["body"] = "yoyo"
    print("修改后返回response body:", response["body"])
    return response

这对于返回的body是加密的数据,可以自己去解密后返回解密内容很有帮助

config:
    name: logincase
    variables: {}

teststeps:
-
    name: step1 login
    request:
        url: http://www.example.com
        method: POST
        json:
           user: test
           psw: "123456"
    teardown_hooks:
      - ${response_status($response)}
    validate:
      - eq: [status_code, 200]
      - eq: [body, "yoyo"]

查看运行结果,body校验成功

标签:11,body,httprunner,hooks,request,sign,hook,return
From: https://www.cnblogs.com/yoyoketang/p/17387178.html

相关文章

  • 1211. 查询结果的质量和占比
    【题目】查询表Queries:+-------------+---------+|ColumnName|Type   |+-------------+---------+|query_name |varchar||result     |varchar||position   |int    ||rating     |int    |+-------------+---------+此表没有主......
  • 【11个适合毕设的Python可视化大屏】用pyecharts开发拖拽式可视化数据大屏
    你好,我是@马哥python说,一枚10年程序猿。一、效果演示以下是我近期用Python开发的原创可视化数据分析大屏,非常适合毕设用,下面逐一展示:(以下是截图,实际上有动态交互效果哦)以下大屏均为@马哥python说的个人原创,请勿转载。1.1影视剧分析大屏1.2豆瓣电影分析大屏A1.3豆瓣电影分......
  • Failed to open connection to "session" message bus: Using X11 for dbus-daemon au
    Failedtoopenconnectionto"session"messagebus:UsingX11fordbus-daemonautolaunchwasdisabledatcompiletime,setyourDBUS_SESSION_BUS_ADDRESSinstead4Failedtoopenconnectionto"session"messagebus:UsingX11fordbus-da......
  • httprunner 4.x学习 - 10.参数化(parameters)引用外部 csv 数据文件 和函数
    前言httprunner4.x实现参数化使用parameters关键字,数据源有三种方式1.在yaml文件中直接写测试数据源2.测试数据源写到csv文件3.自定义函数,函数返回列表形式数据独立参数对于已有参数列表,并且数据量比较大的情况,比较适合的方式是将参数列表值存储在CSV数据文件中。......
  • 每周总结回来啦!(11月27日起)
    上周忙着考试去了,这周一直在补上周的烂摊子,最后一门英语期中也终于考完了,后面的主旋律就是学算法学建模学英语,补笔记跟复习+写实验报告了写上大概一共要做些什么算法:Acwing蓝桥杯真题,周赛,算法课建模:学算法,以买的那本书作为目录去学英语:背单词吧,其他的暂时不知道咋安排笔记:生......
  • httprunner 4.x学习 -9.parameters 参数化
    前言httprunner4.x实现参数化使用parameters关键字,数据源有三种方式1.在yaml文件中直接写测试数据源2.测试数据源写到csv文件3.自定义函数,函数返回列表形式数据参数配置参数名称的定义分为两种情况:独立参数单独进行定义;多个参数具有关联性的参数需要将其定义在一起......
  • C++11 lambda表达式精讲
    lambda表达式是C++11最重要也最常用的一个特性之一,C#3.5和Java8中就引入了lambda表达式。 lambda来源于函数式编程的概念,也是现代编程语言的一个特点。C++11这次终于把lambda加进来了。 lambda表达式有如下优点:声明式编程风格:就地匿名定义目标函数或函数对......
  • C#设计模式11——代理模式的写法
    1.什么是代理模式?代理模式是一种结构型设计模式,它允许通过代理对象来控制对真实对象的访问,以提供额外的功能或控制访问权限。2.代理模式的作用是什么?代理模式可以为对象提供保护代理、远程代理、虚拟代理和智能引用四种不同的实现方式,以适应不同的应用场景。代理模式还可以用......
  • win11虚拟机安装测试
    1.环境本地环境:VmwareEsxi6.5其他适用环境:Vmware,kvm2.安装遇到报错:此电脑不符合最低安装要求  解决方法:shift+f10唤起cmdcmd界面输入regedit打开注册表编辑器 在HKEY_LOCAL_MACHINE\SYSTEM\Setup右击新建一个项,命名为LabConfig,在该项右击新建三个DWORD(32位)......
  • httprunner 4.x学习 -8.base_url 环境地址的使用
    前言config中有个base_url关键字可以设置环境地址,这样其它接口就只需写相对地址了base_url环境地址比如我要测试的API接口如下http://httpbin.org/get第一个是get请求http://httpbin.org/post第二个是post请求如果一个测试用例,有多个步骤中,测试环境地址不变http://......