运用jmeter做接口与性能测试

目录

接口概念

接口的作用

项目开发中,未采用接口时的缺点

使用接口时带来的优点

接口测试的概念

作用

 接口测试流程

接口测试类型

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

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

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

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

编写脚本,并导入用例

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


版权声明:本文为m0_60225699原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。