性能测试-Jmeter

前言

性能测试指标无外乎就是“多”、“快”、“好”、“省”4个方面

  • 多:并发数
  • 快:响应时间;客户感知的感应时间,是端到端的
  • 好:稳定性
  • 省:资源占用率

响应时间:对于一个Web系统,普遍接受的响应时间为2/5/8秒

2秒钟之内响应客户是非常好的

5秒钟之内响应客户是可以接受的

8秒钟是客户能接受的响应的上限

环境搭建

1.安装JDK

java的三个概念

  • JDK:java开发工具包
  • JRE:java运行时环境
  • JVM:java虚拟机

链接:https://pan.baidu.com/s/1US4ZsiMo4LVTyKylkA7QDQ

提取码:gqfq
下载后直接下一步,下一步,默认参数安装
配置环境变量:

然后增加到path系统变量中

 2.安装jmeter

官网下载:http://jmeter.apache.org/download_jmeter.cgi
找到apache-jmeter-5.1.1.zip并下载
或 链接:https://pan.baidu.com/s/1Wos73sS-hBkYHwe7kbIvlA
提取码:ctvf
解压后即可直接使用

配置环境变量:

修改配置文件:
修改bin目录下的jmeter.properties文件,设置中文、编码格式
37 language=zh_CN
1084 sampleresult.default.encoding=utf-8

打开方式:

双击C:\apache-jmeter-5.1.1\bin\jmeter.bat ;或者直接打开C:\apache-jmeter-5.1.1\bin\ApacheJMeter.jar;或者cmd中输入jemter即可启动jemter

3.抓包工具Fiddler

官网:https://www.telerik.com/download/fiddler

打开运行开关:

File-->勾选Capture Traffic

设置过滤条件,设置仅监控需要的网址,如47.113.206.175:

抓包完成后可以将此过程输出为jmx脚本:

#输出jmx脚本的话需要一个插件:

#链接:https://pan.baidu.com/s/1MRxPOp8W9W8VNZNehbjB5w
#提取码:jtv5

#在fiddler安装路径的ImportExport文件夹下添加这两个dll文件:

#重启fidder

抓包完成后点击File-->Export Sessions-->All Sessions...-->选择JMeter黑夜小怪研究v4.4.0.3--Next-->选择保存路径即可将抓包过程保存为jmx脚本

jMeter实战

使用Fiddler抓包(user001用户登录ecshop网站过程):

打开Fiddler切换仅抓包浏览器,然后在浏览器执行user001登录过程,Fiddler就会记录这些session,找到POST请求(即输入用户密码的那条请求)查看其消息头和body体信息

JMeter新建一个项目需要先创建线程组,然后创建请求,请求一般HTTP比较常见(测试计划-->添加-->线程(用户)-->线程组;线程组-->添加-->取样器-->HTTP请求):

HTTP请求的body体有三种方式:参数、消息体数据、文件上传

#参数的表单如下:

#消息体数据的表单(用&做分隔符):username='test'&password='123456'

将Fiddler抓取到的session信息放到JMeter中,并添加头部消息(HTTP请求-->添加-->配置元件-->HTTP信息头管理器),记得信息头必须加到这个HTTP请求下面,因为这个信息头只针对这个HTTP请求有效,放到HTTP请求外面就对整个线程组生效了

#将Fiddler抓取到的body体(表单格式)放到消息体数据中(utf-8转码网站:http://tool.chinaz.com/tools/urlencode.aspx)

配置消息头部信息:

添加监听器,展示接口调用结果(线程组-->添加-->监听器-->查看结果树):

点击执行脚本 :

查看结果,用户登录请求成功

#分享一个使用技巧:

查看结果树中选择json path tester,JSON Path Expression可以测试请求结果中的变量内容($.加变量名即可,如$.token),点Test按钮进行测试

$.xxxxx可以作为一个值去使用,如下图的Get_value就可以在其他请求中使用

使用方法是:HTTP请求-->添加-->后置处理器-->JSON提取器

Apply to:应用范围
Names of created variables :接收值的变量名,自定义,多个变量用分号分隔
JSON Path expression: json path表达式,也是用分号分隔
Match No.(0 for Random):0表示随机;n取第几个匹配值;-1匹配所有。若只要获取到匹配的第一个值,则填写1
Compute concatenation var(suffix_ALL):如果找到许多结果,则插件将使用' , '分隔符将它们连接起来,并将其存储在名为<variable name> _ALL的var中
Default Values: 缺省值,匹配不到值的时候取该值,可写error。

可以添加一个Debug PostProcessor去测试JSON取样器结果

JMeter元件

1.配置元件

1.1 HTTP信息头管理器

里面放HTTP请求的头部信息,上一节内容已经介绍过了

1.2 HTTP Cookie管理器

访问有些网址需要有Cookie,没有可能访问不成功

因此需要先访问一次网站首页获取Cookie,然后将这个Cookie传递给HTTP请求,JMeter有一个配置原件就可以做这个工作:HTTP Cookie管理器

操作方法:(线程组-->添加-->取样器-->HTTP请求;线程组-->添加--配置元件-->HTTP Cookie管理器)然后调整排列顺序

运行之后可以看到“HTTP请求-访问首页,获取Cookie”这一步获取到一个set-Cookie

再次查看HTTP请求结果,可以看到这次请求数据里面有Cookie了

1.3 HTTP请求默认值

如果一个JMeter脚本中有多个HTTP请求,无需多次写服务器名称或IP,只需要在HTTP请求默认值这个配置元件中写一次即可

操作方法(线程组-->添加-->配置元件-->HTTP请求默认值):

然后HTTP请求中就可以不用写服务器名称和IP了,这样做的好处是在其他环境执行此脚本只需要在HTTP请求默认值里面修改IP就相当于修改了所有HTTP请求的IP了:

2.监听器

2.1 查看结果树:

1.分析查看具体某一个请求详情

  请求头、请求体

  响应头、响应体

2.在做性能场景的时候

  分析错误请求的原因

#打开下面按钮错误看的更清楚

2.2 聚合报告:

1.汇总统计

  请求数、响应时间(平均的、90%的、95%的、99%的,min的,max的)单位ms

  错误率

  吞吐量

  发送\接收带宽

使用方法(线程组-->添加-->监听器-->聚合报告):

2.3 用表格查看结果

(线程组-->添加-->监听器-->用表格查看结果)可以显示每个请求的执行时间

2.4 图形结果

(线程组-->添加-->监听器-->图形结果)

3.其他常用元件

3.1.前置处理器

请求发出去之前执行的控制器(元件),如加密

3.2.后置处理器

请求(如HTTP请求)发出去之后执行的控制器(元件),如提取数据

3.3.定时器

思考时间--固定时间定时器

同步定时器--集合点

3.4.断言

#Apply to默认Main sample only(仅作用于父节点取样器)即可

#如果响应结果是200,查看结果树中不会报错,如果不是报错如下:

数据驱动(JMeter参数化)

1.参数化方式

1.1 CSV---需要配置的元件

使用场景:账号密码

模拟user001~user010用户登录:

先准备用户数据

增加CSV数据文件设置元件

线程共享模式代表这个csv文件的作用域,这选择的是仅作用于当前线程组

将刚设置的name和password变量替换到到HTTP请求的body中:

设置线程组

线程数:虚拟用户的数量,一个线程指一个线程或者进程
Ramp—Up Period(in seconds):准备时长。设置的线程数需要多久全部启动,比如上图,线程数为10,启动时间为10,那么需要10S内启动10个线程;
循环次数:每个线程发送请求的次数。如上图,6000个线程,每个线程发送1次,如果勾选了永远,那么它将永远发送下去,直到停止脚本;
设置合理的线程数对能否达到测试目标有决定性影响。比如在本例中,如果线程数太少,则无法达到设定的要求;
另外,设置合理的循环次数也很重要,除了给定的设置循环次数和永远,还可以通过勾选调度器,设置开始和结束时间来控制。

点击执行脚本后查看结果:

1.2函数式---随机数、time、计数器

比如注册用户的时候需要填写手机号,可以用随机数函数生成一个号码

Tools-->函数助手对话框-->选择__Random

 将post请求的body中的号码后8位替换为刚才的表达式,就可以在运行脚本的时候生成一个随机数

因为只注册1个用户因此线程组和时间改为1

执行脚本即可注册成功

1.3变量

添加-->配置元件-->用户自定义的变量

可以自定义一个IP

然后其余地方就可以直接调用,比如:

1.4后置处理器

之前说过的HTTP Cookie管理器,除了使用它之外还可以通过后置处理器传递Cookie值到下一个HTTP请求

先在获取Cookie请求的结果树里面切换为JSON Path Tester,然后在右下角找Cookie值的变量并测试,查找变量使用格式是$.+变量名

线程组-->添加-->后置处理器-->JSON提取器

将$.Set-Cookie的值作为getCookie变量提取出来,然后${getCookie}作为一个可以在JMeter其他地方使用的变量

JMeter关联技术

#获取到返回的值,保存起来,然后给其他请求用

1.正则表达式

#示例1:有一串字符,value = "vaon.txt",提取vaon.txt

value = “(.+?)”   #()表示提取""里面的内容,.表示匹配()里的所有字符,+表示不止一个字符,?表示点到为止找到第一个就可以了

#示例2:找一个网页标题里的内容,<title>ECSHOP演示站</title>

<title>(.+?)</title>  #一般就是把想提取的内容用()括起来,然后写上匹配语句.+?即可

#示例3:

如果要提取一段字符中的多个值怎么办?

例如name = "Tom" value = "vaon.txt",可以这么写:

name = "(.+?)" value = "(.+?)"      #这样就会有两个变量,在JMeter中有一个专门的变量去调用,名字是MYREF,MYREF调用一览表:

MYREF:Tomvaon.txt  #直接调用MYREF就是两个变量的组合

MYREF_g0:name = "Tom" value = "vaon.txt"   #g0代表整个内容

MYREF_g1:Tom  #g1代表第一个变量

MYREF_g2:g2代表第二个变量

#在需要引用的地方可以通过${MYREF}或者${MYREF_g1}...去调用

#在正则表达式提取器中的“模板”这一项,两个变量就写$1$$2$,如果是一个变量就写$1$

2.正则表达式提取器

 (添加-->后置处理器-->正则表达式提取器)

引用名称:就是变量名,自己设置

正则表达式:()括号里表示需要的值

模板:$$表示你要用那个正则表达式那个模板获取的值,只有一个正则一般填写1,即$1$

匹配数字:匹配到多个值取第几个(-1表示全部,0随机,1第一个,2第二个)

缺省值:如果上述条件没匹配到,给一个这里定义的内容

然后可以在其他请求中调用${title_value}

也可以在debug(在JMeter中点添加-->取样器-->调试取样器)工具里面查看变量的值:

3.JSON提取器

上一节介绍过,后置处理器那里

4.实战

 

附录

1.测试计划,注意这个选项

打上勾如果有多个线程组就会在前一个线程组执行完之后执行下一个线程组,例如碰到运行一个线程组的脚本之前需要先跑清理环境的线程组脚本就可以勾上。但是一般这个功能没人使用,可以使用setUp线程组(普通线程组之前执行)、tearDown线程组(普通线程组之后执行)代替清理环境和处理残留的功能,这两个线程组不受测试计划里面的这个打勾选项影响

2、做性能测试的时候如果只想一个用户登录一次获取一次token,然后循环执行其他线程组内的操作,则可以使用setUp线程组+json提取器(获取token)+BeanShell取样器(token作为全局变量),最后将token作为全局变量传给其他线程组使用。

posted on 2021-01-26 21:36  vorn  阅读(287)  评论(0)    收藏  举报

导航