目录
接口概念
接口的作用
项目开发中,未采用接口时的缺点
使用接口时带来的优点
接口测试的概念
作用
接口测试流程
接口测试类型
Post方法和get方法区别
接口响应类型
实现
Jmeter
作用
优点
缺点
组件与元件
线程组的作用
实现(重点)
线程组常见属性设置
http请求默认值
Jmeter参数化
A、jmeter参数化之用户定义的变量
B、jmeter参数化之CSV数据文件设置
C、jmeter参数化之用户参数
D、jmeter参数化之函数
常用函数
A、直连数据库
B、断言:让程序代替人工判断响应结果是否符合预期
接口业务测试之逻辑控制器
逻辑控制器
forEach控制器 == 循环往复实现
思考
xpath提取器
正则表达式
跨线程组关联
跨线程组关联与组内关联有啥区别?
Jmeter性能测试
作用
实现
步骤
运行过程
结果查看
同步定时器
常量吞吐定时器
分布式实现
工作流程
演示
如何分布式远程启动
总结
执行顺序
接口测试流程
项目实现之功能测试
参数化覆盖测试用例
测试脚本编写
关联脚本与数据
生成测试报告
项目实现之自动化测试
设计原则
步骤
性能测试设计原则
JMeter图形化生成报告
接口测试流程
不同单元或某块之间进行通信的通道,他有一套规范一套标准(数据与数据之间的交互)(遵循既定规则,比如百度搜索的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文档的易读性(一人编写,多人阅读)
三要素:定位接口资源、提交测试数据、查看响应结果
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 响应体:无
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协议、IP地址、端口号、编码集
动态的获取、设置或生成数据,以程序驱动代替人工驱动的数据设计模式
作用提高脚本的编写效率和编写质量
四种实现方案:四种方案是互补的,我们可以根据参数化具体场景,选择实现方案
当http默认请求值无法封装资源路径下的相同部分,则可以使用用户自定义的变量设置
如:/api/XXX/—查、/api/XXX/T011/—改中的/api/XXX/部分则可以使用用户自定义的变量设置
Csv文件:都还分搁值,是一种简洁且常见的数据储存格式,储存语法如下
T001,葫芦山,大娃,救爷爷
T002,西游记,猴哥,救师父
T003,水浒传,武松,救大郎
Csv文档中,一行对应着一条信息,一条信息的不同字段使用英文,分隔
☑️实现思想:
1、使用Jmeter编写学院新增脚本模板<-----(写)------ 3、中间件关联程序与数据 ------(读)------> 2、使用csv文件储存测试数据
与csv是基本一样的,使用组件-用户参数,如果想用户循环数据,需要设置线程数为3。
第一步:方式一、打开函数助手对话框小图标
方式二、从程序选项里添加函数助手对话框
方式三、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
作用:可以见接口响应的结果与直连数据库响应的结果做对比,判断接口实现是否符合预期
较之于人工访问数据库,更加高效快捷
实现:Jmeter不具备直连数据库,需要第三方jar包
2、作用
1、更安全
2、更高效
3、功能更强大
实现:
响应断言=断言状态码和响应体(code(Equals)+body(substring))
大小断言=判断响应内容的字节长度(size)
断言持续时间=响应时间
控制取样器执行顺序的组件实现,之前添加的取样器是无差异的都执行,使用逻辑控制器之后,可以控制取样器的执行顺序(分支+循环)
作用:
组织业务,测试接口业务(逻辑)
举例:测试登陆业务,如果登陆成功,那么访问页面,有分支实现,就需要使用逻辑控制器
实现
1、如果(if)控制器 == 分支实现
2、forEach控制器 == 循环往复实现
3、循环控制器 == 循环往复实现(循环频率)
如果(if)控制器 == 分支实现
步骤:
1、搭框架,测试计划,线程组,结果树,声明一个用户定义的变量
2、核心:添加if控制器,子级添加取样器(和之前实现不同,控制器和取样器存在父子级关系)
3、执行并查看结果
步骤
1、搭框架,测试计划,线程组,结果树,声明一个用户定义的变量,存储一组数据
2、核心:添加forEach控制器,子级添加取样器(和之前实现不同,控制器和取样器存在父子级关系)
3、执行并查看结果
循环控制器 == 循环往复实现(循环频率)
步骤
1、搭框架,测试计划,线程组,结果树
2、核心:添加while控制器,子级添加取样器(和之前实现不同,控制器和取样器存在父子级关系)
3、执行并查看结果
线程组属性可以控制循环次数,那循环控制器有何作用?
两者控制精度不一样,循环控制器更好
关联:上一个请求的结果作为下一个请求的参数
步骤:
1、搭框架,编写两个请求,传智播客+百度搜索
2、核心:取出传智播客页面源码的title值
3、传递给百度${变量名}的方式传值
如“dep_name”:”(.*?)”(如果不加?就是贪婪式提取,会提取到最后一个)
模版$1$,调用第几个正则表达式就写几
匹配数字,响应调用第几个包裹的字段就写几
步骤
1、搭框架,编写两个请求,传智播客+百度搜索
2、核心:从学院查询结过中通过正则表达式提取学院信息
3、传递给百度${变量名}的方式传值
1、线程组一的正则表达式出来的函数,想要在其他线程组中使用,需要使用函数_ setProperty导出到公共空间,相当于postman中设置环境变量
_ setProperty参数一:属性名称:out
参数二:正则表达式提取的变量用${myname}形式填写
2、添加专门组件beanshell取样器导入函数
在使用传参的线程中使用_Property函数
线程中传参应该是函数生成的变量
可以通过属性显示元件查看到处的变量
区别变量的作用域不一样
性能测试:模拟各种正常的,峰值的测试环境,检测程序的各项性能指标是否能够达标
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 -n -t 脚本文件 -l hello.txt -e -o 目录
注意,日志文件和目录必须为空
-n 无图形化
-t 被运行的脚本
-l 将运行信息写入日志文件
-e 生成测试报告
-o 指定报告输出目录
指定接口测试计划
从API文档提取接口清单
设计测试用例,并且参数化覆盖测试用例
编写脚本,并导入用例
执行并结果比对,生成测试报告