前言

对于使用过 Python结合Unittest 框架来做自动化测试的同学,应该知道在 Unittest 中,有这样2个方法:setUp()tearDown() ,即前置和后置操作。通常 setUp() 主要用于测试准备工作,而 tearDown() 主要用于 测试后的数据清理。

在 HttpRunner 中,我们可以通过 hook机制 来实现 setUp()tearDown()

本人环境:HttpRunner V1.5.8

测试场景

我们将用一个登录的接口来进行说明,完整的 YAML 格式用例如下:

- config:
name: login test
request:
base_url: http://api.nnzhp.cn - test:
name: login case 1
request:
url: /api/user/login
method: POST
headers:
Content-Type: application/x-www-form-urlencoded
User-Agent: Fiddler
data:
username: test1010
passwd: aA123456
validate:
- eq: [status_code, 200]
- eq: [content.error_code, 0] - test:
name: login case 2
request:
url: /api/user/login
method: POST
headers:
Content-Type: application/x-www-form-urlencoded
User-Agent: Fiddler
data:
username: test1010
passwd: aA123456
validate:
- eq: [status_code, 200]
- eq: [content.error_code, 0]

对于 hook 函数的定义,我们一般在 debugtalk.py 中进行编写,然后在测试用例中直接调用 hook 函数,比如我在 debugtalk.py 做如下准备:

def hook_setup():
print("开始--------hook_setup") def hook_teardown():
print("结束--------hook_teardown")

在 config 中使用hook

如果在 HttpRunner 中使用hook机制,那么将用到关键字 setup_hooksteardown_hooks,且只会在当前 YAML/JSON 用例中执行一次。

  • setup_hooks: 在整个用例开始执行前触发 hook 函数,主要用于准备工作。
  • teardown_hooks: 在整个用例结束执行后触发 hook 函数,主要用于测试后的清理工作。

在 config 中引入 hook,修改如下:

- config:
name: login test
request:
base_url: http://api.nnzhp.cn
setup_hooks:
- ${hook_setup()}
teardown_hooks:
- ${hook_teardown()}

接着,运行用例,得到如下结果:

从上面的用例执行情况,我们可以看到,一共执行了 2 个用例,debugtalk.py 中的 hook_setup()hook_teardown() 都只执行了1次,这是因为在 config 中,hook机制的作用域是整个YAML用例

在 test 中使用hook

在 test 中,我们也可以使用关键字 setup_hooksteardown_hooks,在这里,它的作用域是针对当前 test,如果我们有多个 test,那么就会执行多次。

  • setup_hooks: 在 HTTP 请求发送前执行 hook 函数,主要用于准备工作;也可以实现对请求的 request 内容进行预处理。
  • teardown_hooks: 在 HTTP 请求发送后执行 hook 函数,主要用于测试后的清理工作;也可以实现对响应的 response 进行修改,例如进行加解密等处理。

我们可以在 debugtalk.py 中的函数增加传入参数的功能,简单修改如下:

def hook_setup(request=""):
print("开始--------hook_setup")
print("request请求:{}".format(request)) def hook_teardown(response=""):
print("结束--------hook_teardown")
print("response响应:{}".format(response))

我们可以在这里将 请求的request响应的response 打印处理,然后分别在 2 个 test 中引入 hook,如下:

- config:
name: login test
request:
base_url: http://api.nnzhp.cn - test:
name: login case 1
省略部分内容
setup_hooks:
- ${hook_setup($request)}
teardown_hooks:
- ${hook_teardown($response)}
省略部分内容 - test:
name: login case 2
省略部分内容
setup_hooks:
- ${hook_setup($request)}
teardown_hooks:
- ${hook_teardown($response)}
省略部分内容

这个时候,我们再去运行用例,得到如下结果:

对比之前的结果,可以发现,test 中的 setup_hooks 和 teardown_hooks 是针对单个 test

需要注意的地方

在使用 hook机制 的时候,我们需要注意一点,在上面的 test 中,我们使用了 teardown_hooks ,这里是在返回最终结果之前执行的,我们不能将从响应结果中提取到的数据,作为参数传入 hook_teardown 函数中。

我们需要简单修改一下 YAML 用例,将 第二个test 做如下修改:

- test:
name: login case 2
省略部分内容
extract:
- sign: content.login_info.sign
setup_hooks:
- ${hook_setup($request)}
teardown_hooks:
- ${hook_teardown($sign)}
省略部分内容

我们通过 extract 提取返回结果中的 sign ,并把它传入 hook_teardown() ,然后再去执行用例。

上面的结果,告诉我们找不到 sign 参数,这是因为 teardown_hooks 是在 最终数据返回前 的处理,而 extract 提取操作是在 返回数据之后 的处理。

HttpRunner学习10--hook机制的更多相关文章

  1. PostgreSQL的hook机制初步学习

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页    回到顶级页面:PostgreSQL索引页 本文的目的一是为了备忘,二是为了抛砖引玉,希望 ...

  2. httprunner学习12-hook 机制实现setup和teardown

    前言 unittest框架里面有个非常好的概念:前置( setUp )和后置( tearDown )处理器,真正会用的人不多. HttpRunner 实际上也是从用的unittest框架,里面也有前置 ...

  3. httprunner学习1-环境与登录接口案例

    前言 HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试. 具有以下优点: 继承 Requests 的全部特性,轻松实 ...

  4. Hook机制里登场的角色

    稍有接触过 WordPress 主题或插件制作修改的朋友,对 WordPress 的Hook机制应该不陌生,但通常刚接触WordPress Hook 的新手,对其运作原理可能会有点混乱或模糊.本文针对 ...

  5. 黄聪:WordPress 的 Hook 机制与原理(add_action、add_filter)

    稍有接触过 WordPress 主题或插件制作修改的朋友,对 WordPress 的Hook机制应该不陌生,但通常刚接触WordPress Hook 的新手,对其运作原理可能会有点混乱或模糊.本文针对 ...

  6. 【repost】JS中的hook机制

    hook机制也就是钩子机制,由表驱动实现,常用来处理多种特殊情况的处理.我们预定义了一些钩子,在常用的代码逻辑中去适配一些特殊的事件,这样可以让我们少些很多if else语句.举个高考加分的例子,比如 ...

  7. 浅谈svn的hook机制

    一.什么是钩子 所谓svn的hook机制,就是用户在管理数据仓库的时候,当特定的事件发生时,相应的hook会被调用,hook 其实就相当于特定事件的处理函数. 当前 Subversion 提供了5种可 ...

  8. Android插件化原理解析——Hook机制之动态代理

    转自 http://weishu.me/2016/01/28/understand-plugin-framework-proxy-hook/ 使用代理机制进行API Hook进而达到方法增强是框架的常 ...

  9. HttpRunner学习8--使用debugtalk.py辅助函数

    前言 在HttpRunner中,我们的测试用例都是写在 YAML/JSON 文件中,有时候我们想借助代码来实现某些较复杂的功能,但在 YAML/JSON 中是无法直接写代码来处理的,这个时候,我们可以 ...

随机推荐

  1. 解决无法定位软件包 或 install net-tools

    解决无法定位软件包  或  install net-tools  当我们安装好Linux后,因为里面有很多功能服务没有安装(如ifconfig.vsftpd) 所以出现一些command  '**** ...

  2. Redis集群同步问题

    之前被面试官问到:Redis集群中主从数据同步是从库异步读取主库,那么Redis集群其他主与主之间的数据是怎么共享的呢?或者说是怎么同步的? emmmm……当时我就懵逼了,这不是考试范围啊卧槽~只能老 ...

  3. sign in with apple后端校验(java)

    最近新开发的ios平台的app在提审的时候,被拒了,原因是app上如果有接第三方登陆(比如,微信,微博,facebook等),那就必须要接apple id登陆,坑爹~苹果霸权啊!然而没办法,靠他吃饭, ...

  4. vim的各项指令

    lesson1 <ESC> 保证进入正常模式 :q!回车   退出编辑器 x 删除光标所在的字母 i 添加内容 A 自动追加内容到行尾 :wq 保存文件并退出 lesson2 dw 删除某 ...

  5. day 39 盒模型 display 浮动

    一.盒模型 属性: width:内容的宽度 height:内容的高度 padding:内边距 内容到边框的距离 border:边框 margin:外边距 另一个边到另一个边的距离 盒模型的计算: 总结 ...

  6. Error : Program type already present: android.support.design.widget.CoordinatorLayout$

    背景 因为公司一个app项目需要扩展,因为功能较多且较完整的流程与业务,而且和以前的业务关系不大,所以我整合到了 另外一个分包中(代号:newFunc,请注意是代号)进行依赖. 当我写完这部分业务开始 ...

  7. 使用 cAdvisor 主机上的容器

    目录 前言 安装测试 安装 docker 安装docker-ce 启动 cAdvisor 容器 访问测试 prometheus 服务端配置 使用 promtool 检查配置文件 重新加载配置文件 前言 ...

  8. ansible roles 介绍和使用

    目录 roles roles 介绍 创建role的步骤 role内个目录中可用的文件 案例 roles roles 介绍 ansible 自1.2版本引入的新特性,用于层次性.结构化地组织playbo ...

  9. MySQL详解

    MySQL详解 什么是数据库 # 用来存储数据的仓库 # 数据库可以在硬盘及内存中存储数据 # 数据库与文件存储数据区别 # 数据库本质也是通过文件来存储数据, 数据库的概念就是系统的管理存储数据的文 ...

  10. js中this的使用及代表意义

    我们在js中经常看到this这个关键字,那么他是什么呢?它可以是全局对象.当前对象,也可以是任意对象,函数的调用方式决定了 this 的值. 1. 方法中的this. 在对象方法中, this 指向调 ...