最强整理,HttpRunner接口自动化框架-hook机制实战,一篇上高速...

news2024/12/29 0:28:44

目录:导读

    • 前言
    • 一、Python编程入门到精通
    • 二、接口自动化项目实战
    • 三、Web自动化项目实战
    • 四、App自动化项目实战
    • 五、一线大厂简历
    • 六、测试开发DevOps体系
    • 七、常用自动化测试工具
    • 八、JMeter性能测试
    • 九、总结(尾部小惊喜)


前言

对于使用 Python结合Unittest 框架来做自动化测试,应该知道在 Unittest 中,有这样2个方法:setUp() 和 tearDown() ,即前置和后置操作。

通常 setUp() 主要用于测试准备工作,而 tearDown() 主要用于 测试后的数据清理。

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

测试场景

我们将用一个登录的接口来进行说明,完整的 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_hooks 和 teardown_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()}

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

E1

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

在 test 中使用hook

在 test 中,我们也可以使用关键字 setup_hooks 和 teardown_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)}
    省略部分内容

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

E2

对比之前的结果,可以发现,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() ,然后再去执行用例。

E3

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

下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

燃起激情,跨越障碍,奋斗是追逐梦想的征程。不畏艰辛,坚持不懈,用努力绘就辉煌之画。相信自我价值,扬帆启航,每一次拼搏都是成长的动力,只要心怀勇气,必将创造属于自己的辉煌人生。

脚踏实地,追寻梦想,在奋斗中收获生命的芬芳。拥抱挑战,超越自我,勇敢书写辉煌的篇章。坚信自己的能力,燃烧热情,用汗水和努力点亮前行的路灯,成就未来的辉煌航程。

披荆斩棘,追求卓越,奋斗是成就自我的征途。勇往直前,锲而不舍,用汗水浇铸辉煌的舞台。相信无限可能,心怀信念。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/853234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谷歌广告(Google ads)如何投放?新手必看的超全教程

Google是公认的全球最大的搜索引擎,同时,Google还通过旗下的 YouTube、Gmail、Google Play、Android等产品,汇集了海量的海外用户。对于跨境出海商家来说,谷歌广告是提高销售额、提高产品流量、拓展全球市场的重要推广渠道。 那么…

从0开始搭建一个Monorepo模版,基于Turborepo+pnpm+changesets+dumi

Monorepo 前言开始一、使用turborepo初始化项目二、调整目录结构及文件1. 调整package.json文件2. 调整app目录3. 调整eslint包4. 调整ui包5. 调整eslint配置6. 调整.npmrc7. 使用commitizen规范代码提交8. 使用commitlinthusky进行 commit提交信息校验9. 使用husky进行commit前…

vue3 - 使用reactive定义响应式数据进行列表赋值时,视图没有更新的解决方案

文章目录 1,问题2,原因3,解决方案一、再封装一层数据,即定义属性名,在后期赋值的时候,对此属性进行直接赋值三、使用数组的splice来直接更改原数组三、使用 ref 来定义数据 1,问题 在Vue 3.0 中…

pythonocc进阶学习:投影projection

1.点 到 线, 直线,曲线,等上的投影 staticmethod # 点到Lin的投影 def Project_Pnt_To_Lin(p: gp_Pnt, lin: gp_Lin):Edge BRepBuilderAPI_MakeEdge(lin).Edge()curve BRep_Tool.Curve(Edge)proPnt GeomAPI_ProjectPointOnCurve(p, curve[0])NearestPoint proPnt.Nearest…

JVM虚拟机篇

JVM组成 面试题1:什么是程序计数器? 面试题2:你能给我详细的介绍Java堆吗? 面试题3:什么是虚拟机栈? 面试题4:垃圾回收是否涉及栈内存? 垃圾回收主要指就是堆内存,当栈帧弹栈以后…

全开源国外购物商城手机APP页面装修功能开发

搭建一个全开源国外购物商城手机APP页面装修功能开发需要以下步骤: 1. 确定需求:首先,需要明确页面装修功能的具体需求。例如,是否需要支持自定义布局、颜色、字体等;是否需要支持多种商品展示方式(列表、…

misc学习(1)Bugku-社工-进阶收集

新手一枚,参考文献如下: Bugku:社工-进阶收集_bugku 社工 进阶收集_FW_ENJOEY的博客-CSDN博客 照片如图所示: 线索线: 1.百度识图 发现是大雁塔 2.主角家距离大雁塔一共有七站地铁,其中要进行中转。 同时…

噼里啪啦 图像分类篇

1. LeNet初始化权重的问题 由于我使用的是torch 1.10.0的版本,其Conv2d的init是使用asqrt(5) 我将这里的torch默认初始化改为a1之后,acc的对比如下:可以看出:更改初始化之后,5个epoch,acc提高了3个点。改为…

数组相关练习

数组练习 将数组转化成字符串数组拷贝求数组元素的平均值查找数组中指定元素(顺序查找)二分查找冒泡排序数组逆序 将数组转化成字符串 import java.util.Arrays;public class Text1 {public static void main(String[] args) {int[] arr {5, 6, 4, 2};System.out.println(Arr…

机器学习中训练数据的重要性

人工智能技术发展至今,训练数据的重要性已经是我们老生常谈的问题。在重声训练数据为什么重要之前,我们先重新回顾下AI技术大爆炸的三大初始概念:机器学习是什么?人工智能是什么?训练数据又是什么? 机器学…

《Kali渗透基础》14. 无线渗透(四)

kali渗透 1:相关工具1.1:Aircrack-ng1.1.1:airmon-ng1.1.2:airodump-ng1.1.3:aireplay-ng1.1.4:airolib-ng1.1.5:bessid-ng 1.2:JTR1.3:Evil Twin Attacker1.4&#xff1…

Vue 中使用 WebWorker

目录 安装 loader 应用场景 打包时错误处理 安装 loader npm install worker-loader -D 如果直接把worker.js放到public目录下,则不需要安装loader vue.config.js const { defineConfig } require(vue/cli-service)module.exports defineConfig({transpileDe…

JS逆向系列之猿人学爬虫第14题-备而后动-勿使有变

文章目录 题目地址参数分析参考jspython 调用往期逆向文章推荐题目地址 https://match.yuanrenxue.cn/match/14题目难度标的是困难,主要难在js混淆部分。 参数分析 初始抓包有无限debugger反调试,可以直接hook 函数构造器过掉无限debugger Function.prototype.__construc…

C++异常体系

文章目录 一.C对运行时错误的处理方式函数调用链中的异常机制 二.异常的使用规范三.C异常体系C标准库中的异常体系 四.关于C异常的注意事项 一.C对运行时错误的处理方式 传统的C语言处理运行时错误采用的是assert或者错误码的方式,这种异常处理机制对错误信息的定位和描述能力…

ArcGIS Pro技术应用(暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合)

GIS是利用电子计算机及其外部设备,采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲,它是在一定的地域内,将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来,达到对地理和属性信息的综合管理。GIS的…

lc137. 只出现一次的数字 II

数组排序,既和前不一样又和后不一样的就是唯一的一个 public static int numberOnce(int[] nums) {Arrays.sort(nums);if (nums.length > 2 && nums[0] ! nums[1]) {//避免只有一个元素的数组return nums[0];}if (nums.length > 2 && nums[nu…

994. 腐烂的橘子

题目描述&#xff1a; 主要思路&#xff1a; 宽度优先搜索&#xff0c;利用队列实现。 需要注意的是放进队列的时候就需要标记&#xff0c;而不是取出的时候再标记。 class Solution { public:int orangesRotting(vector<vector<int>>& grid) {int ngrid.siz…

解决Spring Boot 2.6及之后版本取消了循环依赖的支持的问题

目录 1、问题&#xff1a; 2、报错&#xff1a; 3、解决方案&#xff1a; 1、问题&#xff1a; 循环依赖指的是两个或者多个bean之间相互依赖,形成一个闭环。直接表现为两个service层互相调用对方。 此时会遇到以下问题&#xff1a; 2、报错&#xff1a; 当启动项目时&…

Smartbi 权限绕过漏洞复现(QVD-2023-17461)

0x01 产品简介 Smartbi大数据分析产品融合BI定义的所有阶段&#xff0c;对接各种业务数据库、数据仓库和大数据分析平台&#xff0c;进行加工处理、分析挖掘和可视化展现&#xff1b;满足所有用户的各种数据分析应用需求&#xff0c;如大数据分析、可视化分析、探索式分析、复杂…

odoo-033 比较 float 浮点数大小之精度坑

文章目录 前提原因问题 前提 产品单位精确到6位小数生产制造模块&#xff0c;重写了完成的方法&#xff0c;在点击完成的时候报错如下&#xff1a; &#xff08;解释下&#xff1a;就是很奇怪&#xff0c;明明都是必填字段&#xff0c;也都赋值了但是就是拿不到值&#xff09;…