Http 接口测试框架

目录

前言:

实际效果

框架的下一步

最新框架图(红色部分未完成)

部分代码

你需要做的


前言:

在进行HTTP接口测试时,使用一个可靠的测试框架可以提高测试效率和质量。HTTP接口测试框架是一种用于自动化测试HTTP接口的工具或库,它提供了一系列功能和方法,用于发送HTTP请求、验证响应结果、处理断言和报告等任务。

实际效果

  • 验证 1000 个接口平均耗时 6s(看机器配置及网速)
  • 第一次投入使用,马上发现 5 个接口异常并且该验证过程不到 30s 的时间

框架的下一步

  • 目前已兼容我们公司所有 app

  • response body 全字段验证(含字段类型)

    • 已有思路
  • 字段变化导致 2 个大问题

    • 由原本 int(0/1)变成了布尔型
    • 时间戳长度由 10 位突然变成 13 位
  • 尽量避免日常监控中跑接口对外网数据/用户的影响

    • 目前做法是屏蔽相关接口
    • 目前状态
    • 跑接口时创建的数据 id 有变化,然而删除接口还是调用老的 id 去删除,导致数据删除不到
    • 改进
    • 拦截创建数据的 response body 取出对于 id
    • 拦截删除接口 request body,传入上一步拦截的 id

最新框架图(红色部分未完成)

Http接口测试框架

部分代码

配置文件

http接口测试框架配置信息tester = tester
project = A
versionName = 2.2.2
versionCode = 237
host = a-webapi.test.b.com
getTokenHost = http://a-webapi.test.b.com/api/System/GetToken
loginHost = http://a-webapi.test.b.com/api/User/LoginV2
loginInfo = Phone=13750199962&Password=FGgIwe5oCdk%3D
SessionsPath = D:\Fiddler Sessions
ApiURL = http://apihelper.b.com/Home/API/c
# SpecialSessions >> 屏蔽的接口
SpecialSessions = ['GetToken', 'LoginV2', 'LogOut', 'BookingV2']

启动测试入口

"""
运行api测试总入口
"""import sessions.Requestdef launcher_api_test():"""1.获取接口列表2.与本地sessions对比3.差异化文件,是否继续3.1否 继续录制接口3.2是 开始跑接口:return:"""r = sessions.Request.Request(0)  # 0 >> A    1 >> Br.start()if __name__ == "__main__":launcher_api_test()

头部、登录接口

def __get_token_header(self):"""生成token头部:return:"""des = self.__get_token_des()arr = (des, self.conf['systemType'], self.conf['Model'], self.conf['Release'], self.conf['DeviceId'],self.conf['versionCode'], self.conf['versionName'], self.conf['AppBuild'], self.conf['DeviceOS'], "0")authorization = self.AUTHORIZATION_TOKEN % arrheaders = {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'Authorization': authorization}response = self.session.post(self.conf['getTokenHost'], headers=headers)if json.loads(response.text)['StatsCode'] == 200:data1 = json.loads(response.text)['Data']self.time = data1['Time']self.TOKEN_NAME = data1['TokenName']self.TOKEN_VALUE = data1['TokenValue']else:print("GetToken失败,请手动检查")utils.HandleJson.HandleJson.print_json(response.text)def __login_session(self):"""调用登录接口,这样后面的接口都能正常访问了:return:"""url_login = self.conf['loginHost']headers = self.__get_session_header(url_login.split('api/')[-1])data_login = r'%s' % self.conf['loginInfo']response = self.session.post(url_login, headers=headers, data=data_login)if json.loads(response.text)['StatsCode'] == 200:data1 = json.loads(response.text)['Data']self.uId = data1[self.head_uid]self.uName = data1['NickName']self.uPhone = data1['Phone']self.SessionId = data1['Sid']self.uType = data1['UserType']self.uuid = data1['UID']else:print("登录失败,请手动检查")utils.HandleJson.HandleJson.print_json(response.text)

接口片段

Request url: a-webapi.test.b.com/api/Circle/AddCancelCollectCircle
Request header: POST /api/Circle/AddCancelCollectCircle HTTP/1.1
Host: a-webapi.test.b.com
Accept: text/json
Authorization: Digest t="2016-08-04 16:41:19",SystemType="2",u="Circle/AddCancelCollectCircle",r="59e93eb1a6625adc6bff5ede5945a2f7",DeviceId="ffffffff-8416-49fe-3fdc-6ee400000000",Model="SM-N9100",DeviceOS="22",Release="5.1.1",VersionName="2.2.2",VersionCode="239",PushToken="",uId="3353",uName="123456ejz",uPhone="13750199962",SessionId="%2FZhckUf9%2Fd2soQZhYofjN021SdWUpLv0aW%2F3CJBr71vtOl1YHJda6J8p6P1hsQS0P3kqirm%2BtPs%3D",uType="1",bDChannelId="",bDUserId="",AppBuild="239",uUID="2255"
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 21
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.0.1Request body: CircleId=6418&IsAdd=1
Response code: 200
Response body: {"StatsCode":200,"Message":"收藏成功","Data":null,"Other":null}
Session endRequest url: a-webapi.test.b.com/api/Circle/AddCancelCollectCircle
Request header: POST /api/Circle/AddCancelCollectCircle HTTP/1.1
Host: a-webapi.test.b.com
Accept: text/json
Authorization: Digest t="2016-08-04 16:41:22",SystemType="2",u="Circle/AddCancelCollectCircle",r="26dcb55ee9ac79995c21656517c455e8",DeviceId="ffffffff-8416-49fe-3fdc-6ee400000000",Model="SM-N9100",DeviceOS="22",Release="5.1.1",VersionName="2.2.2",VersionCode="239",PushToken="",uId="3353",uName="123456ejz",uPhone="13750199962",SessionId="%2FZhckUf9%2Fd2soQZhYofjN021SdWUpLv0aW%2F3CJBr71vtOl1YHJda6J8p6P1hsQS0P3kqirm%2BtPs%3D",uType="1",bDChannelId="",bDUserId="",AppBuild="239",uUID="2255"
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 21
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.0.1Request body: CircleId=6418&IsAdd=0
Response code: 200
Response body: {"StatsCode":200,"Message":"取消收藏成功","Data":null,"Other":null}
Session end

接口列表

接口列表

你需要做的

  • 环境配置

    • Python 3.x
    • fiddler 一枚(配置抓取手机请求)
    • PyCharm
  • token/session 替换

    • 替换成你们项目对应的 token 等
    • 修改配置文件
    • 修改 response body json 判断逻辑
  • 替换 fiddler js

    • 项目根目录的 fiddler js 整个文件内容替换 fiddler 的 js
    • 打开 fiddler 的 Customize Rules 功能
    • 删除所有内容,并把 fiddler js 内容全部拷贝进去
    • 修改拦截的 host 等信息
    • fiddler 保存请求

fiddler js 自定义信息


//自定义参数设置
public static var filterUrl = "a-webapi.test.b.com";
public static var filePath = "D:\\Fiddler Sessions\\Api\\";
public static var filePathForRequested = "D:\\Fiddler Sessions\\Requested.txt";
public static var filePathForErrorResponse = "D:\\Fiddler Sessions\\ErrorResponse.txt";
public static var filePathForVerifyRequset = "D:\\Fiddler Sessions\\VerifyRequset.txt";
public static var filePathForRemoveSession = "D:\\Fiddler Sessions\\RemoveSession.txt";
public static var filePathForAddSession = "D:\\Fiddler Sessions\\AddSession.txt";

  作为一位过来人也是希望大家少走一些弯路

在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。

(软件测试相关资料,自动化测试相关资料,技术问题答疑等等)

相信能使你更好的进步!

点击下方小卡片

 

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

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

相关文章

vue 通过多组复选框来过滤数据

1.通过if else 来筛选数据 <template> <div><div><label><input type"checkbox" v-model"checkedNames" value"北京"> 北京</label><label><input type"checkbox" v-model"chec…

ubuntu 20.04 4090 显卡驱动安装 深度学习环境配置

1. 显卡驱动安装 准备工作&#xff1a; 换源安装输入法&#xff1a;重启的步骤先不管&#xff08;自选&#xff09;sudo apt update && sudo apt upgrade 禁用nouveau驱动&#xff08;这个驱动是ubuntu开源小组逆向破解NVIDIA的开源驱动&#xff0c;与英伟达的原有驱…

Flask_使用flask_marshmallow序列化数据

代码如下&#xff1a; from flask import Flask from flask_marshmallow import Marshmallow from flask_sqlalchemy import SQLAlchemy from marshmallow import fieldsapp Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] "mysqlpymysql://root:12…

网络协议栈介绍

一、网络协议栈 网络协议栈是计算机网络中的重要组件&#xff0c;负责处理网络数据包在不同协议层之间的传递和处理。常见的网络协议栈有以下几种&#xff1a; 1. 基于内核的协议栈&#xff1a;操作系统内核实现的网络协议栈&#xff0c;如Linux的TCP/IP协议栈。 实现原理&a…

Apikit 自学日记:私有云才有的测试文件库功能,该如何使用呢

在 APIkit 的私有云版本中&#xff0c;提供了测试文件库功能。不过目前该功能仅供私有云产品&#xff0c;线上SaaS产品不提供测试文件库功能 API自动化测试中可以添加文件参数。在这里统一管理所有测试文件。 在测试文件库界面&#xff0c;点击上传文件&#xff1a; 在私有云产…

ORACLE的循环

ORACLE的循环 LOOP循环 declare num number; begin num:1; loopdbms_output.put_line(yes);IF num > 10 THENEXIT;END IF;num : num 1; end loop; end;WHILE 循环 declare num stu_info.id%type; beginnum:0;while num<10 loopdbms_output.put_line(num);num:num1;en…

opencv -12 图像运算之按 《位或》 运算(图像融合图像修复和去除)

位或运算 或运算的规则是&#xff0c;当参与或运算的两个逻辑值中有一个为真时&#xff0c;结果就为真。其逻辑关系可以类比为如图 所示的并联电路&#xff0c;两个开关中只要有任意一个闭合时&#xff0c;灯就会亮。 3-5 对参与或运算的算子的不同情况进行了说明&#xff0c;…

7月19日,每日信息差

1、奔驰召回3.2万辆进口汽车&#xff0c;ESP存安全隐患.本次召回范围内车辆由于软件问题&#xff0c;车身电子稳定系统&#xff08;ESP&#xff09;内部监控程序可能会在驾驶循环开始时错误地判定故障&#xff0c;导致车辆动态控制系统的功能受限&#xff0c;存在安全隐患 2、…

Linux操作系统升级低版本的OpenSSH到9.3的高版本

OpenSSH 9.3之前的版本存在各种各样的安全漏洞&#xff0c;为此&#xff0c;我们需要将OpenSSH升级到最新的9.3的版本。 执行&#xff1a;ssh -V&#xff0c;我们可以查看当前的openssh版本 为了避免升级过程中出现意外而导致服务器无法正常使用&#xff0c;建议操作前先对服务…

力扣 406. 根据身高重建队列

题目来源&#xff1a;https://leetcode.cn/problems/queue-reconstruction-by-height/description/ C题解1&#xff1a;分别对h和k两个维度进行考虑&#xff0c;我这里是优先考虑k值&#xff0c;k值相同的时候h小的排前面。然后再一一遍历&#xff0c;对于people[i]&#xff0c…

Nacos报错Could not resolve placeholder ‘order.name‘ in value “${order.name}“怎么解决?

出现这个原因有两个&#xff1a; 1.首先在Nacos配置中心&#xff0c;写入yml配置文件的数据和后端服务在取数据的时候名称不一致 如下图&#xff0c;现在我的配置中心为order-service 看看其中的文件内容信息&#xff1a; 再看看后端是怎么取的&#xff1a; 看出上面错误了吗…

西安---高时空分辨率、高精度一体化预测技术之风、光、水能源自动化预测技术应用

能源是国民经济发展和人民生活必须的重要物质基础。在过去的200多年里&#xff0c;建立在煤炭、石油、天然气等化石燃料基础上的能源体系极大的推动了人类社会的发展。但是人类在使用化石燃料的同时&#xff0c;也带来了严重的环境污染和生态系统破坏。近年来&#xff0c;世界各…

vue写车牌号 自定义键盘

vue写车牌号自定义键盘 <template><div><div class"content-wrapper"><div class"content-top-wrapper"><van-radio-group v-model"radioCarType"><van-radio name"1">蓝牌<imgslot"icon…

什么是渲染?一文看懂,萌新赶紧收藏码住!

十四五规划提出“加快数字化发展&#xff0c;建设数字中国”&#xff0c;数字技术的快速发展&#xff0c;从起初的内容创建到最终的效果呈现&#xff0c;都离不开渲染技术。目前&#xff0c;渲染技术被广泛应用于教育、医疗、影视动画、建筑设计等多个领域。它能有效满足用户对…

ffmpeg的函数调用知识点

av_dump_format 打印的内容是什么意思&#xff1f; av_dump_format 会打印出AVFormatContext的内容&#xff0c;打印的内容是什么意思&#xff1f; 我们使用av_dump_format打印出如下信息&#xff1a; Input #0, mov,mp4,m4a,3gp,3g2,mj2, from https://demo.com/BigBuckBunny.…

Python版Day45

70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 完全背包解法 注意这是求排列问题&#xff0c;1、2步 和 2、1步都是上三个台阶&#xff0c;但是这两种方法不一样 先遍历背包再遍历物…

关于微信小程序 textarea 遇到的坑

1、获取到焦点 键盘弹出时 页面上拉 解决方法 设置adjust-position为false 参考官网&#xff1a;textarea | uni-app官网 textarea的abjust-position属性 例子&#xff1a;注意加&#xff1a; <textarea :adjust-position"false" /> 2、键盘弹出的时…

Java版企业工程项目管理系统源码+java版本+项目模块功能清单+spring cloud +spring boot

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…

ArcGIS、ENVI、InVEST、FRAGSTATS等多技术提升数据分析能力

专题一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 专题二、ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化&#xff1a;地图符号与…

在第二代SpringCloud中配置网关组件

我们接着上次的微服务的项目继续搭建网关组件: 搭建微服务项目 前提准备: 1.打开nacos服务注册中心,在浏览器通过这地址访问 http://10.48.185.7:8848/nacos/index.html 2.启动page和product的微服务 1.新建一个网关的项目 2.导入pom依赖 <!-- Spring Boot父启动器…