httprunner 4.x学习 - 11.hook 机制
前言
前言
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
# 作者-上海悠悠 wx:283340479
# blog地址 https://www.cnblogs.com/yoyoketang/
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代码如下
# 作者-上海悠悠 wx:283340479
# blog地址 https://www.cnblogs.com/yoyoketang/
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是加密的数据,可以自己去解密后返回解密内容很有帮助
# 作者-上海悠悠 wx:283340479
# blog地址 https://www.cnblogs.com/yoyoketang/
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校验成功
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2022-05-10 aiohttp 异步http请求-12.aiohttp 请求生命周期(和requests库有什么不一样?)
2021-05-10 postman使用教程13-cookies 管理器
2021-05-10 postman使用教程12-预处理(pre-request) 发送请求
2021-05-10 postman使用教程11- sign 签名预处理(pre-request)
2021-05-10 postman使用教程10-请求前参数预处理(pre-request)
2019-05-10 appium+python自动化63-使用Uiautomator2报错问题解决
2018-05-10 appium+python自动化44-appium命令行模式