接口自动化:requests
引言:目前软件测试对测试人员的能力要求
- 业务测试能力:占比5-6成
- 接口、自动化、性能测试能力:占比4-5成
- 流程规范:1成
(需要综合型的测试人才):业务能力、代码能力、开发思维(封装)
接口测试工具:
- postman+Newman+Jenkins
- jmeter+ant+Jenkins
- apifox+apifox-cli+Jenkins
接口测试框架
- python+requests+pytest+allure+yaml+logging+Jenkins框架
1、全面熟练Requests以及底层方法调用逻辑
1.1:导入requests第三方库
import requests
- python3中必须先安装requests模块,使用命令为
pip install requests
1.2:底层逻辑
第一层调用:
def get(url, params=None, **kwargs)url:接口地址params:参数,在get请求的url后面传的参数**kwargs:可变长度的字典def post(url, data=None, json=None, **kwargs)url:接口地址data:参数(表单/表格参数,对应postman的 x-www-form-urlencode)json:参数(raw,application/json)postman的四种传参方式:1.form-data(既有表单也有文件上传) files2.x-www-form-urlencode(纯表单格式)data3.raw(json:application/json)(传json格式的参数)json4.binary(application/octrent-stream)(二进制文件) data**kwargs:可变长度的字典def put(url, data=None, **kwargs):url:接口地址data:参数**kwargs:可变长度的字典
def delete(url, **kwargs):url:接口地址**kwargs:可变长度的字典
第二层调用:上面的4个方法其实都是调用的request方法,requests.request()
def request(method, url, **kwargs):
第三层调用:requests.request()调用的是session.request方法
session.request(method=method, url=url, **kwargs)
第四层调用:最终调用的是request()
def request(self, method, 请求方式url, 请求路径params=None, params参数data=None, data参数headers=None, 请求头cookies=None, cookies信息files=None, 文件上传auth=None, 鉴权timeout=None, 超时allow_redirects=True, 重定向proxies=None, 设置代理hooks=None, 钩子stream=None, 文件下载verify=None, 证书验证cert=None, CA证书json=None): json参数
1.3:requests.request() 和 session.request() 的区别:
我们实际工作中,一般都是用 session.request() 去进行接口测试
- 前者的每个请求都是独立的
- 后者会自动去关联所有请求的cookie信息。
class TestRequestApi():Authorization=""sess = requests.session()def test_login(self):url= "https://xxxx/wzlApp/usersLogin/login"headers ={"App-Version":"3.6.9"}data = {"phone":"RwP%2BH9D9DTgD1Qf0j7J%2B3A==","password":"kKe2zs5e7SF%2BuzDkBeFLLQ=="}# 通过session的方法调用res = TestRequestApi.sess.request("post",url=url,data=data,headers=headers)print(res.json())TestRequestApi.Authorization = res.json()['data']['token']
1.4:Requests响应部分:
res.text:返回字符串形式的结果res.json():返回字典形式的结果res.content:返回字节类型的结果res.status_code:返回状态码res.reason:返回状态信息res.cookies:返回cookie信息res.encoding:返回编码格式res.headers:返回响应头res.request.xxx:得到请求数据
2、requests接口自动化测试实战
2.1:接口关联的三个层次:
- 通过类变量保存中间变量实现接口关联 ----不建议用这个方式
- 通过单独的文件保存中间变量实现接口关联
- 极限封装成零代码的方式实现接口关联
2.2:接口关联的两种方式:
1. 正则提取
re.search() 通过正则匹配一个值,用下标[1]取值,如没有匹配到则返回None
re.findall() 通过正则匹配多个值,返回的是list,用下标取值,如没有匹配到则返回None
一般在text文本中,用正则提取:
第一个是正则:'token': '(.*?)',
第二个是字符串对象:res.json()
通过下标[1]提取对应的值
token = re.search("'token': '(.+?)'",res.text).group(1) print("这是正则提取出来的:"+token)
re 需要先导包,再引入
2. JsonPath提取
jsonpath.jsonpath() 返回的是list,用下标取值,如没有匹配到则返回None
$ 表示根目录
如:就在根目录下,则直接用.名称提取:res.json(),"$.data"
到前面的res.json()对象中,通过表达式:"$.data"取值
如:有嵌套的话:res.json(),"$.[data][token]"
通过下标提取对应的值
print(data[0])
jsonpath需要先导包,再引入
data = jsonpath.jsonpath(res.json(),"$.data[token]") # $ 表示根目录# 就在根目录下,则直接用.名称提取:res.json(),"$.data"# 到前面的res.json()对象中,通过表达式:"$.data"取值# 有嵌套的话:res.json(),"$.[data][token]"# 通过下标提取对应的值print(data[0])
import requests
import jsonpathclass TestRequestApi():Authorization=""def test_login(self):# self,代表当前类的对象# 方法通过对象调用 TestRequestApi().test_login()# method: posturl= "https://xxxx/wzlApp/usersLogin/login"headers ={"App-Version":"3.6.9"}data = {"phone":"RwP%2BH9D9DTgD1Qf0j7J%2B3A==","password":"kKe2zs5e7SF%2BuzDkBeFLLQ=="}res = requests.post(url=url,data=data,headers=headers)print(res.json())TestRequestApi.Authorization = res.json()['data']['token']# $ 表示根目录# 就在根目录下,则直接用.名称提取:res.json(),"$.data"# 到前面的res.json()对象中,通过表达式:"$.data"取值# 有嵌套的话:res.json(),"$.[data][token]"data = jsonpath.jsonpath(res.json(),"$.data[token]")print("-----登录-----哈哈哈哈哈哈哈哈")print("这是直接获取的token:" + TestRequestApi.Authorization)print(data[0])def test_notice(self):url= "https://xxxx/wzlApp/users/insertUserFeedback"headers ={"App-Version":"3.6.9","Authorization": TestRequestApi.Authorization}data = {"feedback":"通过接口自动化脚本提交的意见反馈,数字符--xxxx---测试。。通过接口自动化脚本提交的意见反馈,数字字符--xxxxx---测试。。"}res = requests.post(url=url,data=data,headers=headers)print("-----意见反馈-----哈哈哈哈哈哈哈哈")print(res.json())def test_upload(self):url = "https://xxxx/commonApi/upload/uploadPrivate"headers = {"App-Version": "3.6.9","Authorization": TestRequestApi.Authorization}data = {"file":open("D:/Scripts/workspace/demo/results/image/logo.png","rb")}res = requests.post(url=url, files=data, headers=headers)print("-----上传文件接口-----哈哈哈哈哈哈哈哈")print(res.json())
3、接口自动化测试框架的封装(统一请求封装)
1. 去重很多重复的、冗余的代码;
2. 实现统一的异常处理以及日志监控
PS: 封装的一般放在common包中~~~ requests_util.py(自定义)
---当该py文件被引用,或者类被其他模块引用时,意味着导入这个类的所有用例,会导致用例的执行冗余;
通过类变量保存中间变量实现接口关联 ----不建议用这个方式(见上 2.1)
解释:所以变量一般不要定义为类变量,如果该变量被其他模块导入并执行时,也会执行该类的用例。
---可能写的有点乱,但希望意思能表达清晰。
相关文章:
接口自动化:requests
引言:目前软件测试对测试人员的能力要求 业务测试能力:占比5-6成接口、自动化、性能测试能力:占比4-5成流程规范:1成(需要综合型的测试人才):业务能力、代码能力、开发思维(封装&…...
极简TypeScript教程--数据类型
TypeScript最大的特点就是有类型检测,格式为let/const 标识符: 数据类型 赋值;例子:let msg: string Hello World这样msg这个变量就有了字符串类型,如果再给他赋值为数字类型,就会在编译期报错。变量的类型推导在开发中,有时候为了方便起见…...
JAVA开发测试(jmeter如何测试性能与估算)
对C的业务网站或应用,进行性能测试来评估使用服务器情况是必不可少的一项工作。 一、测试工具: Apache JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能,是Apache组织开发的…...
【新解法】华为OD机试 - 求解连续数列 | 备考思路,刷题要点,答疑,od Base 提供
华为 OD 清单查看地址:blog.csdn.net/hihell/category_12199275.html 求解连续数列 | 备考思路,刷题要点,答疑,od Base 提供 题目 已知连续正整数数列{K}=K1,K2,K3… Ki的各个数相加之和为S, i = N (0 < S < 100000, 0 < N < 100000), 求此数列K。 输入 输…...
Python3 File(文件) 方法
Python3 File(文件) 方法 open() 方法 Python open() 方法用于打开一个文件,并返回文件对象。 在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。 注意:使用 open() 方法一定要保证关闭文件对…...
APP渗透抓包
APP渗透抓包1.APP渗透测试原理2.安装安卓模拟器抓包2.1.安装模拟器2.2.设置代理下载证书2.2.1.burp suite设置代理2.2.2.浏览器设置代理2.2.3.下载证书2.3.模拟器安装证书2.3.1.移动证书2.3.2.证书设置2.4.设置代理2.4.1.设置burp suite代理2.4.2.夜神模拟器代理2.5.抓包测试2.…...
力扣(LeetCode)414. 第三大的数(2023.02.16)
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。 示例 1: 输入:[3, 2, 1] 输出:1 解释:第三大的数是 1 。 示例 2: 输入:[1, 2] 输出:2…...
Spring底层
一、什么是Spring?谈谈你对IOC和AOP的理解。Spring: 是一个企业级java应用框架,他的作用主要是 简化软件的开发以及配置过程,简化项目部署环境。Spring的有点:1、Spring低侵入设计,对业务代码的污染非常低。…...
Cache-Control 常见字段
Cache-Control 常见字段 参考:https://blog.csdn.net/qq_41996454/article/details/108644436 Cache-Control 可以在请求头或者响应头中设置,并且可以组合使用多种指令 no-cache 和 no-store 用作控制缓存,被服务器通过响应头 Cache-Contro…...
Flink Checkpoint 中的通用增量Checkpoint
文章目录知识点状态Flink容错恢复周期性的 Checkpoint错误检测 Failure Detected重新调度 Re-scheduling状态恢复 State Recovery通用增量Checkpoint知识点 状态 算子需要记录之前数据处理的中间结果,把中间结果暂时缓存在算子的内部,这就是算子的状态…...
金三银四必看的软件测试面试题宝典,背完offer随便拿
怎么来设计测试方案根据测试需求(包括功能需求和非功能性需求),识别测试要点,识别测试环境要求,安排测试轮次,根据项目计划和开发计划做整体的测试安排。 被测试的特性:通过对需求规格说明书进行…...
企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点:对草稿进行编辑&#x…...
扬帆优配“数字经济+实体经济”融合发展,行业增长空间大!
组织以为,数字经济已经逐步成为工业商场和资本商场的共同主题。 2月16日,国家发改委在《求是》杂志发表文章《努力推进经济完成质的有效提升和量的合理增加》。文章指出要加速开展数字经济,加速实施“东数西算”等重大工程,推进数…...
分享82个HTML电脑主机模板,总有一款适合您
分享82个HTML电脑主机模板,总有一款适合您 82个HTML电脑主机模板下载链接:https://pan.baidu.com/s/13DGOCgvbxSksMPwJzi2z0g?pwdl0mi 提取码:l0mi Python采集代码下载链接:采集代码.zip - 蓝奏云 云虚拟主机运营商网站模板…...
.htaccess语法教程
RewriteEngine On RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ RewriteCond %{REQUEST_URI} !^/blog/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /blog/$1# 没有输入文件名的默认到到首页 RewriteCond %{HTTP_HOST} ^(w…...
C++ ——多态 下 (图解多态原理、虚函数的再认知)
目录 一、抽象类 1)抽象类定义 2)抽象类的继承 3)抽象类实现多态 4)抽象类的好处 二、多态的实现原理 1)虚函数的存储方式 2)子类中虚函数的存储方式 ① 子类将基类中的虚表原封不动的拷贝到自己的…...
cocos creater 3.x 构建QQ小游戏
一、目前 cocos creater 不支持直接构建QQ小游戏,需要构建成微信小游戏,然后修改成QQ小游戏 二、构建QQ小游戏不能勾选 分离引擎 的选项,勾选分离引擎的选项,需要安装cocos微信小游戏引擎插件,这个插件似乎目前只支持微…...
ArcGIS笔记3_如何编辑、修改和导出散点数据
本文目录前言Step 1 在ArcGIS中添加并显示坐标点Step 2 将坐标数据保存成shp文件Step 3 编辑或修改坐标数据Step 4 导出修改后的数据:法一:通过转换工具导出Step 5 导出修改后的数据:法二:通过dBASE表导出前言 本博文更多针对Arc…...
Computer Graphics From Scratch - Chapter 8
系列文章目录 简介:Computer Graphics From Scratch-《从零开始的计算机图形学》简介 第一章: Computer Graphics From Scratch - Chapter 1 介绍性概念 第二章:Computer Graphics From Scratch - Chapter 2 基本光线追踪 第三章:Computer Gr…...
金三银四”不香了?
“金三银四”不香了? “金三银四”这个词,放在三年前,勾勒的是无数踌躇满志的年轻人涌向职场,大中小企业血液更新与流动的鲜活画面。 尤其是互联网行业,这个在过去20多年里极大改变文化交流方式与商业形态的领域&…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...
