0


运用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文档的易读性(一人编写,多人阅读)

三要素:定位接口资源、提交测试数据、查看响应结果

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文档提取接口清单

设计测试用例,并且参数化覆盖测试用例

编写脚本,并导入用例

执行并结果比对,生成测试报告


本文转载自: https://blog.csdn.net/m0_60225699/article/details/126367451
版权归原作者 测试学徒 所有, 如有侵权,请联系我们删除。

“运用jmeter做接口与性能测试”的评论:

还没有评论