接口概念
不同单元或某块之间进行通信的通道,他有一套规范一套标准(数据与数据之间的交互)(遵循既定规则,比如百度搜索的wd)接口规范会预定到文档,称之为api文档
接口的作用
项目开发中,未采用接口时的缺点
1、研发标准不统一,团队磨合难度高
2、研发周期短
3、可扩展性差
使用接口时带来的优点
1、统一设计标准,更易于团队磨合
2、缩短研发周期
3、扩展性灵活
4、前后端都可以使用自己熟悉的技术,只需保证最终产出符合规范即可
接口测试的概念
跨过前段,直接测试后端实现是否符合接口规范
作用
1、更精准的定位bug
2、发现程序中的安全隐患
3、提高测试效率(项目越复杂越明显)
接口测试流程
1、定位接口资源
2、提交测试数据
3、查看响应结果
接口测试类型
1、Web接口测试(b/s)
服务器接口测试
外部第三方接口测试(别人的接口)
2、模块之间的接口测试(c/s)
安装XXX系统
安装接口测试环境必须要在XXXX当前目录下执行依赖程序代码(XXX系统的安装依赖模块:pip install -r XXXX.txt)
当前目录下使用python启动命令(启动命令:python run_server.py)
浏览器输入url:http://127.0.0.1:8000/api/XXX
数据库文件
使用第三方的数据库文件,将数据库要使用的数据文件放到文件中,查看表的结构
RESTful架构风格
RESTful架构风格:接口设计架构风格,对API文档规范作用,保证API文档的易读性(一人编写,多人阅读)
三要素:定位接口资源、提交测试数据、查看响应结果
Post方法和get方法区别
1、提交方式不同(get提交的数据显示在地址栏,post时隐藏式的提交数据,后者更安全)
2、提交的数据量不同(get方法提交的数据量有限制,post没有)
3、执行效率不同(get方法要比post高)
4xx开头的基本上都是浏览器的资源请求错了(浏览器异常)
1xx开头的请求正常,服务器响应正常,浏览器无法正常显示(杜绝出现)
接口响应类型
1、响应html文档,如访问百度首页
2、响应JSON数据,比如学生管理系统响应的数据
实现
请求方式 定位资源 提交的数据 响应的数据
查 URL+DET 一般键值对提交数据 响应码200 响应体:单条或多条查询信息
增 URL+POST 一般键值对或者JSON提交数据 响应码201或200 响应体:新增后的数据
改 URL+PUT 一般键值对或者JSON提交数据 响应码201或200 响应体:修改后的数据
删 URL+DELETE 一般键值对提交数据 响应码204 响应体:无
Jmeter
作用
1、接口测试
2、性能测试
3、压力测试
4、web自动化测试
5、数据库测试
6、java程序测试
优点
1、开源、免费—>支持二次开发
2、跨平台
3、支持多协议
4、小巧—》50兆 不需要安装
5、功能强大
缺点
1、不支持ip欺骗
2、使用jmeter无法验证JS程序,也无法验证页面ui,所以要需要和Selenium配合来完成Web2.0应用的测试
组件与元件
组件:Jmeter中的功能点实现
元件:Jmeter中组件众多,为了方便管理,对于组建按照功能、性质分类归组,分组的结果就是元件,换言之,元件是组件的集合
进程、线程组、线程:一个进程包含多个线程组,一个线程组可以包含多个线程
进程:正在运行的程序
线程:进程中的执行线索
线程组:为了方便线程管理,对线程按照性质、作用,归类分组。
并发执行:多个线程同时执行
顺序执行:多个线程顺序执行
线程组的作用
1、方便管理线程
2、可以通过一系列属性控制线程的执行
实现(重点)
线程组的执行顺序及层级结构
测试计划(进程)------------------- 线程组---------------------线程
| |
勾选每个线程组独立执行 多个线程组是并发执行
|
多个线程组按顺序执行(先执行线程组1、然后线程组2.。。。)
线程组常见属性设置
线程数:如果设置成5,说明这个线程组有5个线程
Ramp-up时间(秒):如果设置成15,5个线程会在15秒内执行完成,每个线程执行间隔时间是均匀的3秒
循环次数:如果是2,当前5个线程会执行2次,相当于5个用户访问了两次。
如果勾选永远,会一直执行,死循环,点击stop停止
调度器:使用调度器,建议循环次数勾选永远。
持续时间:如果设置成5,所有线程持续执行5秒
启动延迟:如果设置成3,所有线程在3秒后执行
特殊线程组setup线程组和tearDown线程组
setup线程组:最先执行
tearDown线程组:最后执行
http请求默认值
当多条请求有相同请求内容可以通过http请求默认值封装起来,这样就不用在请求中重复编写了,可以提高脚本的编写效率。
例如:可以封装http协议、IP地址、端口号、编码集
Jmeter参数化
动态的获取、设置或生成数据,以程序驱动代替人工驱动的数据设计模式
作用提高脚本的编写效率和编写质量
四种实现方案:四种方案是互补的,我们可以根据参数化具体场景,选择实现方案
A、jmeter参数化之用户定义的变量
当http默认请求值无法封装资源路径下的相同部分,则可以使用用户自定义的变量设置
如:/api/XXX/—查、/api/XXX/T011/—改中的/api/XXX/部分则可以使用用户自定义的变量设置
B、jmeter参数化之CSV数据文件设置
Csv文件:都还分搁值,是一种简洁且常见的数据储存格式,储存语法如下
T001,葫芦山,大娃,救爷爷
T002,西游记,猴哥,救师父
T003,水浒传,武松,救大郎
Csv文档中,一行对应着一条信息,一条信息的不同字段使用英文,分隔
☑️实现思想:
1、使用Jmeter编写学院新增脚本模板<-----(写)------ 3、中间件关联程序与数据 ------(读)------> 2、使用csv文件储存测试数据
C、jmeter参数化之用户参数
与csv是基本一样的,使用组件-用户参数,如果想用户循环数据,需要设置线程数为3。
D、jmeter参数化之函数
第一步:方式一、打开函数助手对话框小图标
方式二、从程序选项里添加函数助手对话框
方式三、ctrl+shift+f1
第二步,生成所需函数
第三步,在需要添加函数的地方末尾加上生成的函数
常用函数
__counter(计数器函数):参数true:每个用户都独立拥有一个计数器;falus:所有线程公用一个计数器
__Random (随机数函数):参数1、一个范围的最小值
参数2、一个范围的最大值
例:参数1:1
参数2:10
则函数在1-10之间随机生成数字
__time(时间函数,生成当前时间):返回的是时间的毫秒值,距离1970/01/01 00:00:00的毫秒数
格式化设置:参数1:yyyy/MM/dd hh:mm:ss
A、直连数据库
作用:可以见接口响应的结果与直连数据库响应的结果做对比,判断接口实现是否符合预期
较之于人工访问数据库,更加高效快捷
实现:Jmeter不具备直连数据库,需要第三方jar包
B、断言:让程序代替人工判断响应结果是否符合预期
2、作用
1、更安全
2、更高效
3、功能更强大
实现:
响应断言=断言状态码和响应体(code(Equals)+body(substring))
大小断言=判断响应内容的字节长度(size)
断言持续时间=响应时间
接口业务测试之逻辑控制器
逻辑控制器
控制取样器执行顺序的组件实现,之前添加的取样器是无差异的都执行,使用逻辑控制器之后,可以控制取样器的执行顺序(分支+循环)
作用:
组织业务,测试接口业务(逻辑)
举例:测试登陆业务,如果登陆成功,那么访问页面,有分支实现,就需要使用逻辑控制器
实现
1、如果(if)控制器 == 分支实现
2、forEach控制器 == 循环往复实现
3、循环控制器 == 循环往复实现(循环频率)
如果(if)控制器 == 分支实现
步骤:
1、搭框架,测试计划,线程组,结果树,声明一个用户定义的变量
2、核心:添加if控制器,子级添加取样器(和之前实现不同,控制器和取样器存在父子级关系)
3、执行并查看结果
forEach控制器 == 循环往复实现
步骤
1、搭框架,测试计划,线程组,结果树,声明一个用户定义的变量,存储一组数据
2、核心:添加forEach控制器,子级添加取样器(和之前实现不同,控制器和取样器存在父子级关系)
3、执行并查看结果
循环控制器 == 循环往复实现(循环频率)
步骤
1、搭框架,测试计划,线程组,结果树
2、核心:添加while控制器,子级添加取样器(和之前实现不同,控制器和取样器存在父子级关系)
3、执行并查看结果
思考
线程组属性可以控制循环次数,那循环控制器有何作用?
两者控制精度不一样,循环控制器更好
关联:上一个请求的结果作为下一个请求的参数
xpath提取器
步骤:
1、搭框架,编写两个请求,传智播客+百度搜索
2、核心:取出传智播客页面源码的title值
3、传递给百度${变量名}的方式传值
正则表达式
如“dep_name”:”(.*?)”(如果不加?就是贪婪式提取,会提取到最后一个)
模版$1$,调用第几个正则表达式就写几
匹配数字,响应调用第几个包裹的字段就写几
步骤
1、搭框架,编写两个请求,传智播客+百度搜索
2、核心:从学院查询结过中通过正则表达式提取学院信息
3、传递给百度${变量名}的方式传值
跨线程组关联
1、线程组一的正则表达式出来的函数,想要在其他线程组中使用,需要使用函数_ setProperty导出到公共空间,相当于postman中设置环境变量
_ setProperty参数一:属性名称:out
参数二:正则表达式提取的变量用${myname}形式填写
2、添加专门组件beanshell取样器导入函数
在使用传参的线程中使用_Property函数
线程中传参应该是函数生成的变量
可以通过属性显示元件查看到处的变量
跨线程组关联与组内关联有啥区别?
区别变量的作用域不一样
Jmeter性能测试
性能测试:模拟各种正常的,峰值的测试环境,检测程序的各项性能指标是否能够达标
作用
1、技术选型
2、测试当前程序所能支持的最大负载
3、发现程序中性能的瓶颈,提高资源的利用率。有助于提高优化
4、提升用户体验
……
实现
同时100个同时访问学生管理系统,统计高并发情况下平均响应时间以及错误率(高并发)
步骤
1、搭框架,线程组,去延期,结果树(局限性),指定线程组的线程数属性值为100
2、核心:怎样实现100个用户同时访问?添加定时器的synchronizing time(集合点组件)
3、运行查看结果
运行过程
阶段一:启动后,并不会马上访问服务器,而是创建线程且打包(耗时)
阶段二:打包完毕批量执行
结果查看
聚合报告
同步定时器
属性1、打包同步执行的用户数
属性2、超时时间以毫秒为单位,当总用户数不能整除并发用户数,设置此属性,当超过这时间则剩余用户继续会被执行
常量吞吐定时器
QPS:query per seconds每秒查询数的查询率,每秒访问多少次服务器
属性一、公式QPS*60
分布式实现
架构:
控制机:负责任务分配
执行机:负责任务的执行
工作流程
1、控制机需要指定测试任务,并下发到执行机
2、执行机执行任务并将结果返回到控制机
3、控制机做结果汇总
演示
前提:分布式环境已经搭建完毕了
1、控制集群(控制机、执行机)
控制机:ApacheJmeter.jar
执行机:jmeter-server。bat
2、编写策四计划
线程数=总线程数/执行机台数
3、将测试计划下发到执行机(执行机会将结果自动返回给控制机)
如何分布式远程启动
1、执行机需要配置的端口号(server_port=1099)
2、控制机需要配置执行机的ip和端口号(格式,ip:端口号#remote_hosts=localhost:1099,localhost:2010)
3、无论控制机还是执行机都得设置远程访问相关属性:
将Jmeter配置信息server.rmi.ssl.disable=true
总结
作用域:组件和控制器在添加位置的作用范围
执行顺序
不同组件都有预定义的执行顺序(和添加位置无关)
各元件之间的执行顺序
1、配置元件 -两头
2、前置处理器 -核心
3、定时器 -核心
4、取样器 -中间
5、后置处理器 -核心
6、断言 -核心
7、监听器 -两头
先两头,再核心,最后中间
接口测试流程
步骤
1、指定测试计划,分配任务
2、从api文档中提取接口清单
3、设计测试用例并参数化覆盖测试用例
4、编写脚本的实现,并导入设计的测试数据(csv数据文件设置)
5、测试结果汇总,bug提交
项目实现之功能测试
功能测试:逐一测试所有接口,测试中模拟用户的多样性操作提交各种测试数据
1、覆盖所有的必选参数
2、组合可选参数
3、参数边界值
4、越界的数值
5、如果参数的取值范围是枚举变量,需要覆盖所有枚举值(性别,排序方式)
6、空数据
7、包含特殊的字符(敏感词汇)
8、错误数据(重复id,错误的数据格式、非法的常量值)
参数化覆盖测试用例
根据测试用例设计的数据类型,设计具体的测试数据,逐条设计,逐条覆盖
测试脚本编写
1、编写脚本模版
2、使用csv储存测试数据
路径使用相对路径
编码集UTF-8无BOM
关联脚本与数据
1、解析csv文件
2、将数据设置进脚本模版
3、设置循环次数
生成测试报告
逐条比对,找出与文档不符的数据,提交bug
项目实现之自动化测试
在新版本会加入新功能测试原有的功能(接口是否受影响),是否正常运行
设计原则
1、只需要测试重要的或者被重复调用的接口
2、只需设计正向用例
3、自动化脚本可以重复执行
4、一个线程组只设计一个取样器,方便单个接口测试
步骤
1、选择被测试的接口
2、分析应用组件
性能测试设计原则
1、线程组:增删改查每一个功能点,都需建立单独线程组,而避免在同一个线程组内添加多个取样器
2、参数化:参数化尽量避免采用外部读取参数(csv组件),而是使用前缀_函数生成测试数据
3、查看结果树:必须清除单个接口内或线程组内的查看结果树,建议一个测试计划就一个结果树
4、报告:性能报告可根据实际需求选择,建议保留添加聚合报告
5、分布式:如并发数量大,采用分布式测试
6、新增/修改/删除:建议不要采用时间模式(集合点、QPS…)来压测,直接使用线程数和循环
JMeter图形化生成报告
命令:jmeter -n -t 脚本文件 -l hello.txt -e -o 目录
注意,日志文件和目录必须为空
-n 无图形化
-t 被运行的脚本
-l 将运行信息写入日志文件
-e 生成测试报告
-o 指定报告输出目录
接口测试流程
指定接口测试计划
从API文档提取接口清单
设计测试用例,并且参数化覆盖测试用例
编写脚本,并导入用例
执行并结果比对,生成测试报告
版权归原作者 测试学徒 所有, 如有侵权,请联系我们删除。