【测试】接口测试与接口自动化
壹、接口测试基础
一、接口测试概念
I、基础概念
是测试系统组件间接口的一种测试。
主要用于检测外部系统与系统间、内部子系统间的交互点;测试重点检查数据的交换、传递和控制管理过程,以及系统间的相互逻辑依赖关系。
内部接口调用相当于函数调用;外部接口调用大部分基于HTTP协议进行调用。
II、优势
对比UI测试,能更早发现问题、能发现更底层问题、问题发现和解决的效率更高
III、用例设计
原理:
1、模拟客户端向服务器发送请求;
2、服务器接受请求报文后对报文作出处理,返回应答;
3、客户端接受应答。
除了接口的功能测试外,还包括接口安全、接口性能等测试;
用例设计方法常用有等价类、边界值法等。
测试要点:
1、接口返回数据与预期结果一致性检查。
2、接口测试结果通常需要SQL语句从数据库查询确认。
3、接口容错性检查。如:传递错误数据类型的处理
4、接口参数边界值检查。
5、接口性能。响应时间、接口tps等
6、接口安全性检查。外部调用的接口,一般每个接口都需要access-token验证。
二、接口自动化实现接口关联的方式和提取变量的方式
HTTP URL组成:
安装requests:
pip install [ -i 源(清华源、阿里源、豆瓣源等,默认不填为官方源)] requests
导入requests模块:
import requests
I、发送请求
请求:请求方法、请求路径、请求参数、请求体
requests.get(url, params=None, **kwargs)
requests.post(url, data=None, json=None, **kwargs)
requests.put(url, data=None, **kwargs)
requests.delete(url, **kwargs)
# 上诉调用此函数
requests.request(method, url, **kwargs)
# 上诉调用此函数,可以自动关联有cookie关联的接口
session.request(method=method, url=url, **kwargs)
method=method 请求方法
url=url 请求路径
params=None get请求参数
data=None post或者put请求参数
json=None post请求参数
headers=None 请求头
cookies=None Cookie
files=None 文件上传
————————————
auth=None 鉴权(token)
timeout=None 超时处理
allow_redirects=True
proxies=None 设置代理
hooks=None 钩子函数
stream=None 文件下载
verify=None 证书验证
cert=None CA证书
# 生成一个session对象,帮助保存客户端的会话信息
requests.session()
II、接受响应
由response对象接收
响应:响应码、响应信息、响应内容、响应头
响应内容一般有两种格式:JSON格式和HTML格式
需要根据响应内容验证接口工作是否正常。
res = requests.get(url, params=None, **kwargs) print(res.text) 返回的文本信息 print(res.json()) 返回的json格式 print(res.url) 返回响应对象的实际请求地址 print(res.content) 返回的字节内容 print(res.status_code) 返回的状态码 print(res.reason) 返回的状态信息 print(res.cookies) 返回的cookie print(res.encoding) 返回编码格式 print(res.headers) 返回请求头 print(res.request.请求数据) 返回请求数据
III、cookie、session、token概念
cookie:存在于客户端;由服务端set-cookie方法设置。
session:存在于服务端内存中;用于和cookie一起验证客户端登陆状态。
token:服务端生成的一串字符串,用作客户端进行请求的一个令牌。
token运行原理:
1、Client第一次登录成功后,由Sever 生成,保存在Sever DB中,并返回Token值给Client。
2、Client收到Token后,进行保存(保存位置由Server指定)。
3、Client再次发送请求时,附带Token在请求参数中发送给Server进行验证。
4、Server收到请求后,取出Token值与保存在Server DB中的Token值进行比较。
若Token一致,说明用户登录成功,处于登录状态;
若Token不一致,说明登录信息失效,需重新登录;
若Server DB不存在Token值,说明用户没有登录过。
token认证的优缺点:
无状态性、可重用性、安全性
三、面试题:实现接口关联的三种方式和提取变量的两种方式
什么是JSON:
由{}和[]组成的数据
下一个接口的参数需要用到上一个接口的返回值:接口关联
实现接口关联的三种方式
①、通过类变量保存中间变量实现接口关联(如果类变量跨py文件就会出错)
②、通过单独的文件保存中间变量实现接口关联
③、极限封装成和工具一样只需要通过表达式实现接口关联
提取变量的两种方式(对接口响应内容的处理方式)
①、正则表达式提取(适用文本对象)或者 html的xpath方式提取(HTML格式)
re.search() 提取一个值,通过下标值
re.findall()提取多个值,通过下标值
②、JsonPath提取(适用JSON对象)
jsonpath.jsonpath()
jsonpath表达式规则:
$ 根节点
.子节点
.. 递归子节点
[] 代表列表中的值,下标从0开始
贰、接口测试工具
一、ApiFox
接口管理、开发、测试全流程集成工具。解决多个系统间数据同步问题。
ApiFox = Postman + Swagger + Mock + Jmeter
命令行中执行ApiFox测试
npm install -g apifox-cli
安装apifox-cli库
若出现报错:
unable to verify the first certificate
则执行npm config set strict-ssl false
导出用例:
ApiFox cli文件
通过命令执行测试:
apifox run (用例名称).apifox-cli.json -d data.csv -n 2 -r html
-d :数据文件
-n :循环次数
-r :生成测试报告,并指定报告格式
二、Jmeter
叁、Pytest接口自动化框架
接口自动化框架封装——统一请求封装
原因:
①、去除冗余代码
②、实现请求统一管理,如统一异常管理、统一日志管理
、接口自动化测试引入pytest用例管理框架
python:pytest,unitest
java: testng,junit
pytest作用:
1、找到用例
模块名必须以test_开头或者_test结尾
类名必须以Test开头,并且不能由init方法
用例方法必须以test开头
2、执行用例
3、判断结果
4、生成报告
pytest插件:
pip install -r requirements.txt:
-r
或--requirement
:这个选项告诉pip从一个文件中读取要安装的包列表;创建
requirements.txt
文件的一个常用方法是使用pip freeze > requirements.txt
命令pytest 本身
pytest-html 简单的html报告
pytest-xdist 多线程执行
pytest-ordering 控制用例执行顺序
pytest-rerunfailures 失败的用例重跑
pytest-base-url 设计基础路径(开发、测试、生产、预发布)
allure-pytest 生成allure报告
运行:
1、命令行运行
命令行输入pytest运行
-v输出更详细信息
-s输出调试信息
2、主函数调用
import pytestif __name__=="__main__":pytest.main()
3、结合pytest.ini全局配置文件执行
[pytest]#命令行参数 addopts = -vs --html=/reports/report.html --reruns 2 #--html产生html报告保存在/reports/report.html路径,--reruns失败用例重跑2次#配置执行的用例位置 testpaths = ./testcases #若没有,则将执行所有文件夹下用例#配置修改默认的模块规则 python_files = test_*.py #按照test_开头匹配执行用例#配置修改默认的类规则 python_classes = Test*#配置修改默认的用例规则 python_functions = test_*#配置基础路径 base_url = http://www.baidu.com#标记 markers =test_this:测试这条用例user_this:测试这条用例
、Pytest的前后置、固件、夹具
I、类似Jmeter和Postman:前置脚本和后置脚本
# 每个用例def setup(self):print("每个用例前:xxx")def teardown(self):print("每个用例之后:x")# 每个类def setup_class(self):print("每个类前:xx")def teardown_class(self):print("每个类之后:xxxx")
II、使用fixture固件结合contest.py文件实现前后置
装饰器:
@pytest.fixture(callable_or_scope=None,*args,scope="function",params=None,autouse=False,ds=None,name=None)
scope=“作用范围”
scope:function 函数
scope:class 类
scope:module 模块
scope:session 会话
autouse = “自动执行”
在一个文件设置的固件fixture只能在当前文件起作用。
若希望对所有py文件起作用,需要结合conftest.py文件
@pytest.fixture(scope='function', autouse=False, params=[["baili","baili123"]], ids=["data1"], name="sql") def exe_sql(request):print("请求之前:查询数据库")yield request.paramprint("请求之后:关闭数据库")
分层前后置:
最外层conftest.py先执行、里面层的conftest.py后执行
、接口自动化测试框架封装——通过文件保存中间变量实现
原因:
1、类变量不能跨py文件使用
2、统一管理中间变量
工具做不到的事情:
1、RSA,签名,自定义加密,混合加密……
2、生成美观的报告
3、复用性
4、团队协作
数据与业务分离
数据保存到:excel、csv、yaml、txt等
yaml简介:
一种数据类型,支持注释#、换行、字符串等
作用:
1、用于配置文件
2、用于编写测试用例
数据结构:
1、map对象:{键:空格 值}——这里的键值对,引号后面必须有空格,否则无法读取成功
2、list对象:[],可以用一组“-”开头表示,如:
-"name": 1
-"name": 2
可以和json完美转化
读写:
PyYaml模块
数据驱动
通过修改数据,从而驱动测试用例的执行,得到不同的结果。
一组数组执行一次用例,多组数据执行多次用例。
pytest数据驱动装饰器
@pytest.mark.parametrize(参数名,参数值)
生成Allure报告
1、下载allure、解压并配置环境变量
验证环境:
在dos窗口和PyCharm中分别验证:allure --version
2、生成临时的json报告
pytest.ini全局配置文件中:
addopts = -vs --alluredir=./temps --clean-alluredir3、生成HTML的allure报告
if __name__=="__main__":pytest.main()time.sleep(3)os.system("allure generate ./temps -o ./reports --clean")
问题
1、yaml(excel、csv、txt)中如何调用python函数
2、接口关联要处理
3、文件上传要处理
4、常规断言和数据库断言
多个用例间区别
1、yaml文件名不同
2、需要提取变量,多了提取代码
3、有关联处理关联,有文件上传处理文件上传
HTTPRunner环境搭建
安装:
pip install httprunner
pip install har2case
验证环境:
hrun -V
har2case -V
五个命令:
httprunner 主命令
hrun httprunner别名;用于运行yaml/json/pytest测试用例
hmake httprunner make别名;将yaml/json转化为pytest文件
har2case httprunner har2case别名;将har文件转换为yaml/json文件
locust 用于性能测试
相关文章:

【测试】接口测试与接口自动化
壹、接口测试基础 一、接口测试概念 I、基础概念 是测试系统组件间接口的一种测试。 主要用于检测外部系统与系统间、内部子系统间的交互点;测试重点检查数据的交换、传递和控制管理过程,以及系统间的相互逻辑依赖关系。 内部接口调用相当于函数调用&am…...
Android设置边框圆角
在Android开发中,圆角设计十分常见,那么实现边框圆角有几种形式呢? 文章目录 设置圆角边框样式使用ClipToOutline进行裁切最后 设置圆角边框样式 常见的方式是在drawable文件夹下设置一个xml文件的边框样式,比如 <shape andro…...

SpringBoot项目打成jar包,在其他项目中引用
1、首先新建一个SpringBoot工程 记得要将Gradle换成Maven 2、新建一个要引用的方法 3、打包的时候要注意: ① 不能使用springboot项目自带的打包插件进行打包,下面是自带的: ②要换成传统项目的maven打包,如下图: 依…...
【音频可视化】通过canvas绘制音频波形图
前言 这两天写项目刚好遇到Ai对话相关的需求,需要录音功能,绘制录制波形图,写了一个函数用canvas实现可视化,保留分享一下,有需要的直接粘贴即可,使用时传入一个1024长的,0-255大小的Uint8Arra…...
解决github每次pull push输入密码问题
# 解决git pull/push每次都需要输入密码问题 git bash进入你的项目目录,输入: git config --global credential.helper store然后你会在你本地生成一个文本,上边记录你的账号和密码。配置项写入到 "C:\Users\用户名\ .gitconfig" …...
Java重修笔记 第六十四天 坦克大战(十四)IO 流 - 标准输入输出流、InputStreamReader 和 OutputStreamWriter
标准输入输出流 1. System.in 标准输入流 本质上是一个InputString,对应键盘,表示从键盘输入。 定义:public final static InputStream in null; 所以 Scanner scanner new Scanner(System.in); 会从键盘中获取数据 2. System.out 标准输…...
prctl的函数和pthread_self函数
1.prctl的函数原型如下: #include<sys/prctl.h> prctl(PR_SET_NAME, “process_name”);第一个参数是操作类型,指定PR_SET_NAME(对应数字15),即设置进程名; 第二个参数是进程名字符串,…...
Vim 命令行模式下的常用命令
Vim 命令行模式下的常用命令 文件操作: :w :保存当前文件。:w filename :将当前内容另存为指定的 filename 。:q :退出 Vim,如果文件有修改但未保存,会提示错误。:q! :强制退出 Vim,…...
【动态规划-最长递增子序列(LIS)】力扣2826. 将三个组排序
给你一个整数数组 nums 。nums 的每个元素是 1,2 或 3。在每次操作中,你可以删除 nums 中的一个元素。返回使 nums 成为 非递减 顺序所需操作数的 最小值。 示例 1: 输入:nums [2,1,3,2,1] 输出:3 解释: …...

Elastic Stack--16--ES三种分页策略
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 方式一:from size实现原理使用方式优缺点 方式二:scroll实现原理使用方式优缺点 方式三:search_after实现原理使用方式优缺点 三…...
[LeetCode] 315. 计算右侧小于当前元素的个数
题目描述: 给你一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。 题目链接: . - 力扣(LeetCode) 题目主要思路&a…...

【hot100-java】二叉树展开为链表
二叉树篇。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …...
如何在在 YOLOv3模型中添加Attention机制
在YOLOv3模型中添加Attention机制需要以下几个步骤: 1. 规定格式 当添加新的模块(如Attention机制模块)时,需要像定义[convolutional]、[maxpool]等层在cfg文件中的格式一样,对新模块进行格式规定。例如对于SE模块&a…...
单点登录Apereo CAS 7.1安装配置教程
笔者目前正在做一个单点登录的课题,历时较长总算摸到一些门路,其中的辛酸不易按下不表。截至本文发布,CAS的最新版本为7.1。由于涉及到课题内容,而且内容比较新,整理试验不容易,暂时只对VIP开放,后续课题完成后会完全开放,敬请谅解。 CAS项目区别 在CAS的项目选择上,…...

windows C++-移除界面工作线程(一)
本文档演示了如何使用并发运行时将 Microsoft 基础类 (MFC) 应用程序中由用户界面 (UI) 线程执行的工作移动到工作线程。 本文档还演示了如何提高冗长绘制操作的性能。 通过将阻塞性操作(例如,绘制)卸载到工作线程来从 UI 线程中移除工作&am…...

Qt小bug — LINK : fatal error LNK1158: 无法运行“rc.exe“
Qt小bug —— LINK :fatal error LNK1158:无法运行"rc.exe" 环境 Qt 5.14.2 MSVC 2015 x64 现象 解决 在电脑上找到rc.exe 和rcdll.dll (一般在C:\Program Files(x86)\Windows Kits*\bin\x64下面)拷贝到 C:\Qt\Qt5…...
c++小游戏
目录 狼人杀 走迷宫 炸弹人 贪吃蛇 飞翔的小鸟 跑酷 吃豆人 飞机大战 人生模拟器 坦克大战 修仙模拟器 搜集了一些小游戏,名字下是个人是个人喜欢度,可供参考~ 狼人杀 ❤❤❤❤ #include<bits/stdc.h> #include<cstdio> #incl…...
k8s为什么用Calico
Calico是一种开源的网络和安全解决方案,主要用于容器、虚拟机、宿主机之间的网络连接。 它支持Kubernetes、OpenShift、Docker EE、OpenStack等PaaS或IaaS平台,提供高效的网络通信和安全控制功能12。 Calico的核心组件包括Felix、etcd、BIRD等。F…...
HashMap 和 Hashtable 有什么区别?
HashMap和Hashtable都是Java中常用的存储键值对的集合类,它们都实现了Map接口,但二者之间存在一些显著的区别。以下是对HashMap和Hashtable区别的详细归纳: 一、线程安全性 HashMap:是非线程安全的,即多个线程可以同…...

【机器学习】深度学习、强化学习和深度强化学习?
深度学习、强化学习和深度强化学习是机器学习的三个重要子领域。它们有着各自独特的应用场景和研究目标,虽然都属于机器学习的范畴,但各自的实现方式和侧重点有所不同。 1. 深度学习(Deep Learning) 深度学习是一种基于神经网络的…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...

【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...

STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...