Jmeter自动化工具

Jmeter自动化工具

1、简介

百度百科

Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。

JMeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP 服务器等等。JMeter 可对服务器、网络或对象模拟巨大的负载,在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter 能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证程序是否返回了期望结果。为了最大限度的灵活性,JMeter 允许使用正则表达式创建断言。

总结

JMeter是Apache组织使用Java开发的一款测试工具:

1、可以用于对服务器网络对象模拟巨大的负载

2、通过创建带有断言的脚本来验证程序是否能返回期望的结果

优缺点

优点

  1. 开源、免费
  2. 跨平台
  3. 支持多协议
  4. 小巧
  5. 功能强大

缺点

  1. 不支持IP欺骗
  2. 使用JMeter无法验证JS程序,也无法验证页面UI,所以要和Selenium配合来完成Web2.0应用的测试

2、安装

搭建Java环境

1)、JMeter是使用Java编写的,必须安装Java环境:
	1. JDK: Java SE Development Kit (java 开发工具包,为JAVA程序开发提供环境支持)
	2. JRE: Java Runtime Environment (java运行环境,为JAVA程序运行提供环境支持)
2)、下载并安装 JMeter
	下载:https://jmeter.apache.org/download jmeter.cgi
	安装: 直接解压缩即可

JMeter修改编码集

中文乱码问题,请先修改编码集

image-20220811142344193

image-20220811142447276

启动并运行JMeter

image-20220811142533890

3、项目简介

学生管理系统:对学生信息进行增删改查,对应的RESTful语法风格如下

image-20220811165237392

附件内容是相关接口清单,请根据清单描述,测试各个接口实现

PS:该系统是严格遵守RESTful架构风格的实现,通过练习以强化对RESTful架构风格的理解与认识

查询

1.1学院-查询所有 
    请求方法:GET 
    请求地址:http://127.0.0.1:8000/api/departments/ 
1.2学院-查询指定 
    请求方法:GET 
    请求地址:http://127.0.0.1:8000/api/departments/T02/ 
	(注:T02为学院ID;) 
1.3根据指定参数进行学院-List-$dep_id_list的相关查询 
    请求方法:GET 
    请求地址:http://127.0.0.1:8000/api/departments/?$dep_id_list=T01,T02,T03 
    (注:$dep_id_list:为参数名称;T01,T02,T03为:学院ID;) 
1.4学院-List-$master_name_list查询 
    请求方法:GET 
    请求地址:http://127.0.0.1:8000/api/departments/?$master_name_list=Java-Master,Test-Master 
    (注:$master_name_list:为参数名称;Java-Master,Test-Master为:院长名称;) 
1.5学院-模糊 
    请求方法:GET 
    请求地址:http://127.0.0.1:8000/api/departments/?blur=1&dep_name=C 
    (注:blur:为开启模糊查询参数1为开启;dep_name:为参数名称;C:学院名称包含字符;) 
1.6学院-组合 
    请求方法:GET 
    请求地址:http://127.0.0.1:8000/api/departments/?slogan=Here is Slogan&master_name=Test-Master&dep_name=Test学 
    院 
    (注:dep_name:学院名称;master_name:为院长名称;slogan:学院口号;三个条件可随意组合或单独使用)

新增

2.1学院-新增 
1) 请求方法:POST 
2) 请求地址:http://127.0.0.1:8000/api/departments/ 
3) 请求JOSN报文: 
4) 调用传入的json串如下(可新增多条,之间用,隔开): 
{ 
"data": [ 
{ 
"dep_id":"T01", 
"dep_name":"Test学院", 
"master_name":"Test-Master", 
"slogan":"Here is Slogan" 
} 
] 
} 
5) 新增成功返回报文: 
{ 
"already_exist": { 
"results": [], 
"count": 0 
}, 
"create_success": { 
"results": [ 
{ 
"dep_id": "T02", 
"dep_name": "Java学院", 
"master_name": "Java-Master", 
"slogan": "java" 
} 
], 
"count": 1 
} 
} 
6) 新增失败id已存在-返回报文: 
{ 
"already_exist": { 
"results": [ 
{ 
"dep_id": "T01", 
"dep_name": "Test学院", 
"master_name": "Test-Master", 
"slogan": "Here is Slogan" 
} 
], 
"count": 1 
}, 
"create_success": { 
"results": [], 
"count": 0 
} 
} 
7) 新增失败json格式错误: 
{ 
"status_code": 400, 
"detail": "请求体参数格式错误。" 
} 

更新

3.1学院-更新 
1). 请求方法:PUT 
2). 请求地址:http://127.0.0.1:8000/api/departments/T03/ 
(注:1:为学院ID) 
3). 请求JOSN报文: 
{ 
"data": [ 
{ 
"dep_id": "T03", 
"dep_name": "C++/学院", 
"master_name": "C++-Master", 
"slogan": "Here is Slogan" 
} 
] 
} 
4). 修改成功返回: 
{ 
"dep_id": "T03", 
"dep_name": "C++/学院", 
"master_name": "C++-Master", 
"slogan": "Here is Slogan" 
} 

删除

4.1学院-删除单个 
    请求方法:DELETE 
    请求地址:http://127.0.0.1:8000/api/departments/T03/ 
    (注:10为学院ID) 
4.2学院-删除多个 
    请求方法:DELETE 
    请求地址:http://127.0.0.1:8000/api/departments/?$dep_id_list=8,9,11 
    (注:$dep_id_list:为参数名称;8,9,11:为学院ID)

4、JMeter基本使用

小案例

打开JMeter

image-20220811172716061

image-20220811172909183

image-20220811173002746

image-20220811173137389

image-20220811173213438

image-20220811173316921

5、JMeter线程组相关

进程:正在运行的程序
线程:是进程中的执行线索
线程组:进程中有许多线程,为了方便管理,可以对线程按照性质分组,分组的结果就是线程组
PS:三者关系,一个进程可以包含多个线程组,一个线程组可以包含多个线程

JMeter工具举例

image-20220811201233331

6、JMeter并发执行和顺序执行

image-20220811201357417

并发执行

image-20220811201749966

顺序执行

image-20220811201828692

image-20220811201938063

7、JMeter两个特殊线程组

setUp和tearDown

image-20220811202120875

image-20220811202242298

JMeter测试案例

image-20220811202339357

8、JMeter线程组常用属性

image-20220811202615074

9、http请求默认值

image-20220811203018090

image-20220811203314035

10、信息头管理器

image-20220811203358794

新增操作必须在http信息头管理器配置属性值

image-20220811203644417

11、参数化

image-20220811203840863

用户定义的变量

image-20220811204017376

测试

image-20220811204151524

image-20220811204248900

image-20220811204319001

CSV数据文件设置

CSV :逗号分隔值,是一种简洁且常见的数据存储格式,存储语法如下图所示。

image-20220811204514050

实现步骤:
1、使用CSV文件存储测试数据
2、编写被复用的学院新增脚本模板
注意2:编码集使用UTF-8无BOM格式
3、关联脚本与数据(将文件数据导入脚本)

测试

image-20220811204818562

image-20220811204902192

image-20220811204943190

image-20220811205416942

image-20220811205336894

image-20220811205135795

用户参数

实现步骤:
1、编写被复用的学院新增脚本模板
2、使用用户参数存储测试数据
3、将数据导入脚本模板
4、设置执行次数

image-20220811205604760

测试

image-20220811205803488

image-20220811205932752

image-20220811210022606

image-20220811210154217

函数

_counter

常见函数:
_counter计数器函数TRUE(每个用户都有自己的计数器) FALSE(所有用户共用一个计数器)
_Random随机数函数参数1:取值范围最小值(包含)参数2:取值范围最大值(包含)
_time 获取当前时间的函数无参:获取的是距离1970/01/01 00:00:00 的毫秒值
参数1: yyyyMM_ dd HH:mm:ss格式化成年\月_日时:分:秒格式

image-20220811210720082

image-20220811210807385

_Random

image-20220811211018849

image-20220811211038636

_time

image-20220811211346866

image-20220811211258181

另一种写法,设置年月日的毫秒值

image-20220811211439564

image-20220811211501732

12、直连数据库

通过直连数据库让程序代替接口访问数据库,如果二者预期结果不一致,就找到了程序缺陷。
获取某条学院的名字,放在百度搜索:
1、JMeter不具备直连数据库功能,必须整合第三方(jar包)实现
2、配置数据库的连接
3、通过JDBC Request请求向数据库发送SQL语句并接收提取响应结果
4、结果获取规则可以通过Debug Sampler组件查看
5、将提取到的响应结果,在百度上

测试

image-20220811211858766

image-20220811211932825

image-20220811212016885

image-20220811212243234

image-20220811212449749

结果在百度搜索

image-20220811212719880

image-20220811212828712

image-20220811212950817

image-20220811213131239

image-20220811213225018

image-20220811213305891

13、断言

断言:让程序代替人工判断响应结果是否符合预期

  • 分类:

    • 响应断言=断言状态码和响应体

    • 大小断言=判断响应内容的字节长度

    • 断言持续时间=判断响应时间

  • 步骤:

    • 1、按照之前的实现编写测试脚本

    • 2、为被判断的取样器添加断言组件

    • 3、直接运行查看结果断言通过:无提示

断言失败:给出错误

响应断言

断言状态码和响应体

image-20220812144930380

image-20220812145346350

大小断言

判断响应内容的字节长度

image-20220812145755721

先运行一遍看出响应信息(这里报错是正常的,因为还没有给大小断言添加判断条件)

image-20220812145845537

image-20220812145933877

image-20220812145952904

注意:

image-20220812150155872

断言持续时间

判断响应时间

image-20220812150254738

image-20220812150425026

image-20220812150337828

注意

image-20220812150533355

14、逻辑控制器和关联

通过参数化可以实现单个接口的功能测试,而接口测试过程中,除了单个接口的功能测试之外,还会测试
接口业务实现,所谓业务,就是一套完整的业务逻辑或流程,这就必须要使用到逻辑控制和关联。

逻辑控制器

If逻辑控制器

需求1:测试计划中定义:一个http请求访问传智播客官网,但是该请求不是无条件执行的,声明一个用户定义的变量,如果变量是itcast才执行,否则就不执行
1、搭框架,测试计划,线程组,结果树,声明一个用户定义的变量
2、核心:添加if控制器,子级添加取样器(和之前实现不同,控制器和取样器存在父子级关系)

image-20220812151256868

image-20220812151715126

image-20220812151831155

运行

image-20220812151856567

forEach逻辑控制器

需求2:有一组关键字[hello,python,测试] (使用用户定义的变量存储)要依次取出,并在百度搜索
1、搭框架,测试计划,线程组,结果树,声明一个用户定义的变量存储一组数据
2、添加forEach控制器,子级添加取样器(和之前实现不同,控制器和取样器存在父子级关系)
3、百度搜索关键字

image-20220812152322910

image-20220812152835969

image-20220812152502282

image-20220812152707126

image-20220812152735196

循环逻辑控制器

需求3:循环访问学生管理系统10次
实现:
1、搭框架,测试计划,线程组,结果树
2、添加循环控制器,子级添加取样器(和之前实现不同,控制器和取样器存在父子级关系)

image-20220812153139777

image-20220812153206932

image-20220812153259274

image-20220812153340468

关联

关联:上一个请求的响应结果和下一个请求的数据有关系

image-20220812153604068

xpath提取器

需求:两个http请求,请求A访问传智播客官网,请求B访问百度,请求A将传智播客官网源码中的title标签的值取出,传递给请求B,在请求B中作为关键字搜索这个title 值
步骤:

1、搭框架,编写两个请求,传智播客+百度搜索

2、核心:取出传智播客页面源码的title值

3、传递给百度: ${变量名}的方式传值

image-20220812153939535

image-20220812154335033

image-20220812154527680

正则表达式提取器

image-20220812154800759

image-20220812155310987

15、跨越线程组关联

变量作用域局限于当前线程组,其他线程组不可以直接调用。可以将请求A中提取的结果导出到公共空间
(可以被不同线程组共享),请求B再从公开空间调用该变量,相当于全局变量。

image-20220812162206238

image-20220812162357997

image-20220812162419938

image-20220812162438735

image-20220812162520978

image-20220812162541893

image-20220812162601911

16、高并发

性能测试

模拟各种正常的、峰值的测试环境,检测程序的各项性能指标是否能够达标

image-20220812162811023

高并发

JMeter中内置了定时器,可以实现时间模式相关的性能测试
需求1:同一时刻100个同学去访问学 生管理系统的查询所有学院信息功能,统计高并发情况下平均响应时间以及错误率(高并发)
1、搭框架,测试计划,线程组,取样器,结果树(局限性),指定线程组的线程数属性值为100
2、添加定时器synchronizing timer(集合点组件)
3、运行并查看结果查看:聚合报告组件,可以对结果汇总分析

image-20220812163624524

image-20220812163341747

image-20220812163545047

image-20220812163719994

image-20220812163816677

17、高频率

image-20220812164152066
需求2:一个用户以20QPS( == 20次/s)的频率访问学生管理系统服务器,持续15秒,统计服务器的平均响应时间
QPS: Query per Seconds每秒查询数(查询率),每秒访问多少次服务器
1、搭框架,测试计划,线程组,取样器,聚合报告,根据题干计算数据:
	循环次数=访问频率 * 持续时间
2、添加QPS访问频率控制的相关组件:
	每分钟访问次数=访问频率 * 60

image-20220812164310749

image-20220812164616938

image-20220812164645078

image-20220812164710389

18、分布式

image-20220812164822261

环境搭建

image-20220812164934390

image-20220812165148312

image-20220812165332339

19、项目实战

接口测试流程

1、制定测试计划,分配任务
2、从API文档中提取接口清单:对API文档简化,提高测试效率,接口清单就是对API文档简化压缩,主要提取三要素
3、设计测试用例并参数化覆盖测试用例
4、编写脚本实现,并导入设计的测试数据
5、测试结果汇总,BUG提交

练习

image-20220812170528116

image-20220812211700434

image-20220812211837796

image-20220812211853565

image-20220812212035281

自动化测试流程套路

自动化接口脚本的设计:每次更新都要保证之前的代码没有受到影响,所以要把最基本的增删改查功能设计一套自动化执行的脚本,每次更新后执行这个脚本文件,查看是否老接口有影响(此时程序已经在执行了,测试的数据不能对现有的数据进行污染)

自动化脚本架构搭建

image-20220812213430927

image-20220812213757303

image-20220812213845559

image-20220812213919384

image-20220812213953579

image-20220812214039402

新增

image-20220812214128008

image-20220812214240560

修改

image-20220812214659819

查询

image-20220812214542350

删除

image-20220812215248163

性能测试

接口弱压力测试

根据实际需求是否进行性能测试:

场景1:模拟半小时之内1000个用户访问服务器资源,要求平均响应时间在3000ms内,且错误率为0

image-20220812215620985

高并发

场景2:模拟100个用户同时访问服务器资源,要求平均响应时间在3000ms内,且错误率为0

image-20220812215843552

image-20220812215811196

image-20220812215903909

高频率

场景3:模拟2个用户以20QPS的频率访问服务器资源持续10秒,要求平均响应时间在3000ms内,错误率为0

image-20220812220035356

image-20220812220309588

image-20220812220348491

生成图形化测试报告

在JMeter中可以以图形化(饼状图、柱状图..) 的方式显示脚本运行结果,较之于聚合报告或查看结果树组件实现更直观,用户体验更友好生成图形化测试报告
命令: jmeter -n -t脚本文件-|日志文件-e -0目录
    -n无图形化运行
    -t被运行的脚本
    -|将运行信息写入日志文件
    -e生成测试报告
    -0指定报告输出目录

image-20220812220736043

image-20220812220847278

image-20220812221218235

上面命令执行完毕后

image-20220812220948241

运行index.html

image-20220812221036345

posted @ 2022-08-12 22:27  海边蓝贝壳  阅读(648)  评论(0编辑  收藏  举报