jmeter

Jmeter

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

Apache jmeter 可以用于对静态的和动态的资源(文件,Servlet,Perl脚本,java 对象,数据库和查询,FTP服务器等等)的性能进行测试。它可以用于对服务器、网络或对象模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能。你可以使用它做性能的图形分析或在大并发负载测试你的服务器/脚本/对象。

JMeter 的特性

a) 能够对HTTP和FTP服务器进行压力和性能测试,也可以对任何数据库进行同样的测试(通过JDBC)。 
b) 完全的可移植性和100%纯Java。 
c) 完全 Swing 和轻量组件支持(预编译的JAR使用 javax.swing.*)包。 
d) 完全多线程框架允许通过多个线程并发取样和通过单独的线程组对不同的功能同时取样。 
e) 精心的GUI设计允许快速操作和更精确的计时。 
f) 缓存和离线分析/回放测试结果。 
g) 高可扩展性: 
h) 可链接的取样器允许无限制的测试能力。 
i) 各种负载统计表和可链接的计时器可供选择。 
j) 数据分析和可视化插件提供了很好的可扩展性以及个性化。 
k) 具有提供动态输入到测试的功能(包括Javascript)。 
l) 支持脚本变成的取样器(在1.9.2及以上版本支持BeanShell)。 

安装与配置

 使用环境

JMeter 可以运行在solaris,macos, linux, windows等操作系统上. 而本地环境安装的jdk版本需要根据你要安装的jmeter版本的要求而定。比如说:我安装的jmeter5.1.1版本,需要的jdk版本必须是jdk1.8以上。还要注意的是您所安装的操作系统对jdk版本的要求,比如说:windows7最高只能安装到jdk1.8版本。所以选择软件版本需要和操作系统一起结合起来考虑。主要介绍使用JMeter测试windows环境的web server 和DB server的环境搭建步骤。

  如果你想执行JDBC测试,你当然需要从厂商得到适当的JDBC驱动。JMeter没有提供任何JDBC驱动。其它你可能需要下载的软件:

      · BeanShell

      · Java Activation Framework - JavaMail需要

      · Java Mail - mail 显示 和 SOAP 测试需要

      · JMS - JMS 取样器

      · General Java download page

 软件下载

JDK:  http://java.sun.com/javase/downloads/index.jsp

Jdk版本的选择首先要考虑操作系统对djk版本的限定要求,然后选定jdk版本后再选择jmeter版本。

Jmeter:  http://jmeter.apache.org/download_jmeter.cgi

 jmeter_第1张图片

打开链接,会有两种可选择的下载版本:

1)Binaries 是可执行版,直接下载解压就可以用;已编译好的版本;

2)source 是源代码;需要自已来编译;(大神的选择,哈哈)

所以,这里下载Binaries版本。

 JDK安装  

以在windows操作系统上安装jdk为例进行安装:

注意事项:如果操作系统是64位的,则下载的jdk版本必须也是支持64位的,反之是32位的,则下载的jdk是支持32位的。

 jmeter_第2张图片

下载jdk-8u202-windows-x64.exe,点击默认安装,一般默认路径安装至C:\Program Files\Java目录下。

电脑桌面----》“计算机”图标----》鼠标右键选择“属性”----》点击高级系统设置----》高级---》环境变量页面

 jmeter_第3张图片

在“系统变量”--->“新建”, 在变量名中输入:CLASSPATH,变量值中输入:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

再按“新建”,在变量名中输入:JAVA_HOME,变量中输入:C:\Program Files\Java\jdk1.8.0_202

修改PATH变量,添加%JAVA_HOME%/bin;然后确定即可;

 jmeter_第4张图片

 Jmeter安装
Windows配置

解压apache-jmeter-5.1.1.zip文件至D盘,本文解压至D:\ apache-jmeter-5.1.1目录下。

电脑桌面----》“计算机”图标----》鼠标右键选择“属性”----》点击高级系统设置----》高级---》环境变量页面

在“系统变量”--->“新建”, 在变量名中输入:JMETER_HOME,变量值中输入:D:\apache-jmeter-5.1.1 ,

配置classpath变量,没有的话也要按照上面步骤进行新建,有的话直接进行选中,点击编辑即可。变量值固定为:

%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\logkit-2.0.jar;

做完之后一定要保存,不确定的话可以直接点击确定按钮直到退到我的电脑页面

 jmeter_第5张图片

在path变量后面追加:%JMETER_HOME%\bin 

 jmeter_第6张图片

完成后完成后打开cmd,输入jmeter -v查看jmeter当前版本信息

 jmeter_第7张图片

Linux配置

1)将jmeter下载的安装压缩包放到/usr/local/目录下,然后解压成文件夹apache-jmeter-5.1.1

2)vim /etc/profile追加jmeter系统环境变量

#jmeter

export JMETER_HOME=/usr/local/apache-jmeter-5.1.1

export CLASSPATH=.:${JMETER_HOME}/lib/ext/ApacheJMeter_core.jar:${JMETER_HOME}/lib/jorphan.jar

export PATH=$PATH:${JMETER_HOME}/bin

 jmeter_第8张图片

3)执行source /etc/profile ,让配置文件生效

4)检验安装是否成功:jmeter –v

 jmeter_第9张图片

Jmeter运行

图形界面的运行jmeter脚本主要是用于debug调试脚本用的,等脚本调休没问题后,再通过非图形化界面,即命令行模式去运行脚本来进行性能测试,这样的目的是降低对负载机的硬件资源利用率的损耗。

如果是做接口测试,需要当场看到测试结果是否正确,一般都是用图形化界面运行测试接口的脚本。

运行jmeter.bat方式

以后可以直接在cmd里了输入jmeter,会自动打开jmeter界面。也可以直接进到你的jmeter安装路径,找到bin文件夹,点击进去,找到jmeter.bat,鼠标右键用管理员方式运行,或者直接双击打开,此时会弹出2个界面:1.个是命令窗口,使用jmeter的时候此命令窗口不能关,你缩小到电脑任务栏即可。2.还有一个界面是jmeter工作页面,你可以在里面进行相关的操作.具体如图

 jmeter_第10张图片

确认安装是否成功,双击jmeter.bat或者以管理员方式运行,页面如下:

注:默认打开是英文版本的,如果需要改成中文版本,请先修改配置文件:jmeter.properties里的语言改成:language=zh_CN

 jmeter_第11张图片

 

 

 jmeter_第12张图片

运行ApacheJMeter.jar方式

也可以直接打开D:\apache-jmeter-5.1.1\bin中双击运行ApacheJMeter.jar来使用jmeter工具

 jmeter_第13张图片

 

 

 jmeter_第14张图片

这种方式打开jmeter工具是不会出现cmd命令提示符弹出框的。

注:在测试https协议的时候,此方式打开的GUI界面运行脚本是没问题的,而使用jmeter.bat启动GUI界面运行脚本是有可能出现问题的,获取不到相关请求数据。建议在使用GUI界面的时候使用此方式打开。

使用命令行运行JMeter脚本

JMeter -n -t my_test.jmx -l log.jtl

-n告知JMeter采用非图形化运行JMeter脚本

-t指定要运行的脚本文件

-l指定保存执行结果的文件名

-r 运行在 jmeter.properties 文件里所有的远程服务器 (或者通过在命令行覆盖属性指定远程服务器)

这个脚本也允许我们指定可选的防火墙/代理服务器信息:

-H [代理服务器主机名或者 ip 地址]

-P [代理服务器端口]

例如 : jmeter -n -t my_test.jmx -l log.jtl -H my.proxy.server -P 8000

执行命令前要检查当前目录是否是%JMeter_Home%\bin 目录;

如果 JMeter 脚本不在当前目录,需要指定完整的路径;如果要把执行的结果保存在其他地方也要指定完整的路径。

 

 

 

jmeter_第15张图片 

命令行选项目录

调用 JMeter 的 "jmeter -?"命令将打印所有命令选项的一个列表。列表如下:

 jmeter_第16张图片

-e,        在脚本运行结束后生成html报告

-o,        保存html报告的地址

-h, --help 打印使用信息并退出

-v, --version 打印版本信息并推出

-p, --propfile {argument} 使用的 JMeter 属性文件

-q, --addprop {argument} 附加的属性文件

-t, --testfile {argument} 运行的 JMeter 测试文件(.jmx)的绝对本地路径

-l, --logfile {argument} 日志取样文件

-n, --nongui 非用户界面运行 JMeter

-s, --server 运行 JMeter 服务器,等价于启动jmeter-server.bat或jmeter-server.sh文件

-H, --proxyHost {argument} 设置 JMeter 使用的代理服务器主机名或者ip地址

-P, --proxyPort {argument} 设置 JMeter 使用的代理服务器端口

-u, --username {argument} 设置 JMeter 使用的代理服务器用户名

-a, --password {argument} 设置 JMeter 使用的代理服务器密码

-J, --jmeterproperty {argument}={value} 定义附加的 JMeter 属性

-S, --systemPropertyFile {filename} 一个属性文件被做为系统属性添加

-L, --loglevel {argument}={value} 定义日志等级: [category=]level

-l:JTL文件去保存结果,路径+xxx.jtl

-r: 使用远程执行

-j:保存执行log

jmeter_第17张图片

 

 

 jmeter_第18张图片

-D, --systemproperty {argument}={value} 定义附加的 System 属性;表示传递properties变量给jmeter;脚本中是通过函数_P来接收properties变量的值。

 jmeter_第19张图片

 

 

 jmeter_第20张图片

 

 

 jmeter_第21张图片

注:一旦线程组或循环次数等用变量方式替代后的脚本做了这样处理,就基本不能在GUI界面运行脚本,只能通过命令行模式运行脚本。

 jmeter_第22张图片

利用XSLT分析JMeter结果文件

将结果文件的扩展名改为xml,例:将log.jtl改为log.xml。

在log.xml的文件头

中添加

使之变成

其中href指定xsl文件的路径,如果与xml文件在同一目录,则只写文件名即可,否则要写明详细路径。

将修改后的xml文件用浏览器打开即可得到统计结果

 jmeter_第23张图片

最简单的方法查看命令行运行脚本后生成的jtl等结果文件,可以打开图形界面的jmeter工具,所有的“监听器”里的每个可以查看结果报告的都有打开本地结果文件的功能。例如:

 jmeter_第24张图片

注:

1)在GUI模式下不要重复打开同一个测试结果文件,这样显示的数据会翻倍,是不对的。

2)命令执行脚本时,结果文件名称不要重复,否则测试结果会追加到已存在的结果中。

3)命令执行脚本时,对于结果的存储,都是通过jmeter的bin目录的配置文件jmeter.properties来实现的。根据自己想要的测试结果文件类型及内容,则自行修改结果文件配置项。这里的#一行内容表示的是默认的,不是说linux里的注释语句

 jmeter_第25张图片

注意事项:

1)解压之后压缩包叫apache-jmeter-5.1.1.zip,如是src.zip后缀的都不对,打开之后会报错不可用,因为里面缺少我们下一步将要配置的环境变量.jar文件。因此建议下载Binaries类型的包,不要下载源代码source类型的包。

jmeter_第26张图片

2)对应的jdk版本不可太低,一般jmeter3.0的对应jdk1.7,jmeter4.0和jmeter5.0对应jdk1.8以上,否者启用jmeter也会报错。

3)一定要确保环境变量配置正确(包括jdk的与jmeter的环境变量配置)。

Jmeter运行环境调优配置

修改jmeter内存配置(以适应高并发测试)

修改文件:D:\apache-jmeter-5.1.1\bin\jmeter.bat

jmeter_第27张图片

本机内存总共8G,将最大分配4G内存给jmeter运行。修改成:set HEAP=-Xms1g -Xmx4g -XX:MaxMetaspaceSize=256m
然后必须启动jmeter服务之后再进行如下操作,才能选择到进程:ApacheJMeter.jar

win+r -> jconsole.exe

 jmeter_第28张图片

 

 

 jmeter_第29张图片

点击【连接】

 jmeter_第30张图片

安装插件管理工具

https://jmeter-plugins.org/install/Install/

下载plugins-manager.jar插件管理工具(可以对jmeter已安装插件、可用插件和更新插件管理工具)

放进目录lib/ext
重启JMeter

 

 

 jmeter_第31张图片

Installed Plugins(已安装的插件):即插件jar包中已经包含的插件,可以通过选中勾选框,来使用这些插件;

Available Plugins(可下载的插件):即该插件扩展的一些插件,可以通过选中勾选框,来下载你所需要的插件;

Upgrades(可更新的插件):即可以更新到最新版本的一些插件,一般显示为加粗斜体,可以通过点击截图右下角的Apply Changes and Restart Jmeter按钮来下载更新;

:一般不建议进行更新操作,因为最新的插件都有一些兼容问题,而且很可能导致jmeter无法使用(经常报加载类异常)!

调整JMeter界面-元素-比例

修改文件:D:\apache-jmeter-5.1.1\bin\jmeter.properties

 jmeter_第32张图片 

添加代码

jmeter.hidpi.mode=truejmeter.hidpi.scale.factor=1.2

说明:
factor=1,放大1倍
factor=1.2,放大1.2倍

jmeter_第33张图片

调整JMeter界面-工具栏图标-比例

修改文件:D:\apache-jmeter-5.1.1\bin\jmeter.properties

 

jmeter.toolbar.icons.size=32x32

说明:

工具栏图标默认size: 22x22

可用size: 22x22, 32x32, 48x48

调整JMeter界面-目录树图标-比例

修改文件:D:\apache-jmeter-5.1.1\bin\jmeter.properties

 jmeter_第34张图片

jmeter.tree.icons.size=24x24

说明:
工具栏图标默认size: 19x19
可用size: 19x19, 24x24, 32x32, 48x48

 

服务器资源监控器插件

https://jmeter-plugins.org这个网站上,对于每个插件都有详细的介绍。

Jmeter Plugins提供了五类组件:

  Standard Set:对线程组进行了扩展,扩充了监听器,更丰富了图标的展示;

  Extras Set:监听器进一步扩展,支持远程监控,图表展示更加丰富;

  Extras with Libs Set:提供了对JSON的支持,新增了JMS取样器;

  WebDriver Set:与WebDriver进行了集成,来进行自动化测试;

  Hadoop Set:提供了Hadoop测试组件。

通过PerfMon Metrics Collector监听器进行服务器性能数据显示

PerfMon Metrics Collector监听器这个工具本身是不自带的,需要通过安装插件添加:

下载安装配置插件

下载插件JMeterPlugins-Standard和JMeterPlugins-Extras是客户端的,ServerAgent是服务端的。

JMeterPlugins-Standard和JMeterPlugins-Extras下载地址:https://jmeter-plugins.org/downloads/old/

ServerAgent下载地址:https://jmeter-plugins.org/wiki/PerfMonAgent/

jpgc-perfmon下载地址:(从插件管理里搜索PerfMon)

 jmeter_第35张图片

MeterPlugins-Standard和JMeterPlugins-Extras安装配置

下载完成之后,解压客户端的.zip两个文件,,进入其路径JMeterPlugins-Extras(Standard)-1.4.0\lib\ext,复制JmeterPlugins-Extras.jar(JmeterPlugins-Standard.jar)两个文件,放到JMeter客户端的lib\ext文件夹中, 然后重新启动JMeter可在监听器中看到出现了很多的jp@gc-开头的文件.这里监控内存我们使用的是:jp@gc - PerfMon Metrics Collectot

 jmeter_第36张图片

ServerAgent安装配置

您不需要任何root / administrator权限。您只需将ServerAgent-2.2.3.zip解压缩到服务器上的某个位置即可。然后使用startAgent.sh在 Unix操作系统或者startAgent.bat在Windows操作系统上的脚本启动代理。

代理程序是用Java编写的,运行它需要JRE 1.5+。请注意,您可以自己创建包含其自己的JRE的代理程序包,这样您就不必在服务器上安装java(我们在Windows平台上对其进行了测试)。为此,只需在代理文件夹中创建一个JRE文件夹,然后在其中复制一个已安装的JRE。将.bat文件中的java命令更改为java可执行文件的路径,它将起作用。

特别是对于PerfMon Metrics Collector测试一定要启动serverAgent服务

将ServerAgent-2.2.3.jar上传到被测服务器,解压,进入目录,Windows环境,双击ServerAgent.bat启动;linux环境执行ServerAgent.sh启动,默认使用4444端口,出现如下情况即服务端成功:

 jmeter_第37张图片

 

 jmeter_第38张图片

 

 

PS:若端口被占用  1、杀掉该端口的相关进程,然后再启动

 jmeter_第39张图片

当前前提是必须知道该进程是否能关闭,最好是换成其他未被占用的端口,如1234则添加如下参数:

./startAgent.sh --udp-port 0 --tcp-port 1234           0代表不开启该端口 

用法

要启动代理,只需运行startAgent.bat/sh文件即可。它将打开UDP / TCP服务器端口,客户端可以在其中连接和查询指标。一些信息将打印到标准输出,通知您收集指标的问题(记录详细程度--loglevel parameter)。

您可以将侦听端口指定为参数(0禁用侦听),默认为4444:

$ ./startAgent.sh --udp-port 0 --tcp-port 3450
INFO    2011-11-25 19:02:14.315 [kg.apc.p] (): Binding TCP to 3450

您可以--auto-shutdown在启动代理时使用该选项,以便在最后一个客户端断开连接后自动停止它。建议仅对TCP连接使用此功能:

$ undera@undera-HP:/tmp/serverAgent$ ./startAgent.sh --udp-port 0 --auto-shutdown
INFO    2011-11-25 19:48:59.321 [kg.apc.p] (): Agent will shutdown when all clients disconnected
INFO    2011-11-25 19:48:59.424 [kg.apc.p] (): Binding TCP to 4444

您可以使用该--sysinfo选项查看可用的系统对象:

$ ./startAgent.sh --sysinfo
INFO    2011-11-25 19:51:25.517 [kg.apc.p] (): *** Logging available processes ***
INFO    2011-11-25 19:51:25.542 [kg.apc.p] (): Process: pid=24244 name=bash args=-bash
INFO    2011-11-25 19:51:25.543 [kg.apc.p] (): Process: pid=25086 name=dash args=/bin/sh ./startAgent.sh --sysinfo
INFO    2011-11-25 19:51:25.543 [kg.apc.p] (): Process: pid=25088 name=java args=java -jar ./CMDRunner.jar --tool PerfMonAgent --sysinfo
INFO    2011-11-25 19:51:25.549 [kg.apc.p] (): *** Logging available filesystems ***
INFO    2011-11-25 19:51:25.551 [kg.apc.p] (): Filesystem: fs=/dev type=devtmpfs
INFO    2011-11-25 19:51:25.551 [kg.apc.p] (): Filesystem: fs=/ type=ext4
INFO    2011-11-25 19:51:25.551 [kg.apc.p] (): Filesystem: fs=/var/run type=tmpfs
INFO    2011-11-25 19:51:25.551 [kg.apc.p] (): Filesystem: fs=/home type=ext4
INFO    2011-11-25 19:51:25.552 [kg.apc.p] (): Filesystem: fs=/var/lock type=tmpfs
INFO    2011-11-25 19:51:25.552 [kg.apc.p] (): Filesystem: fs=/proc type=proc
INFO    2011-11-25 19:51:25.553 [kg.apc.p] (): *** Logging available network interfaces ***
INFO    2011-11-25 19:51:25.554 [kg.apc.p] (): Network interface: iface=lo addr=127.0.0.1 type=Local Loopback
INFO    2011-11-25 19:51:25.554 [kg.apc.p] (): Network interface: iface=eth0 addr=192.168.0.1 type=Ethernet
INFO    2011-11-25 19:51:25.555 [kg.apc.p] (): *** Done logging sysinfo ***
INFO    2011-11-25 19:51:25.555 [kg.apc.p] (): Binding UDP to 4444
INFO    2011-11-25 19:51:26.560 [kg.apc.p] (): Binding TCP to 4444

--interval 参数可用于更改度量标准收集频率。

验证使用情况

测试服务端使用情况

 ServerAgent启动的校验

1) 在笔记本电脑打开telnet监听(控制面板-程序-打开或关闭Windows功能-telnet客户端勾选打开)

2) cmd进入命令框,输入如下内容:

telnet yourip  4444   #连接ServerAgent

test                  #发送test进行测试

exit                  #退出,即断开连接

3) 观察server端是否有接收到消息,出现如下情况说明ServerAgent打开成功

[root@bjdhj-120-215 ~]# /opt/soft/ServerAgent-2.2.3/startAgent.sh

INFO    2016-02-18 10:52:51.749 [kg.apc.p] (): Binding UDP to 4444

INFO    2016-02-18 10:52:52.749 [kg.apc.p] (): Binding TCP to 4444

INFO    2016-02-18 10:52:52.754 [kg.apc.p] (): JP@GC Agent v2.2.0 started

INFO    2016-02-18 10:56:55.198 [kg.apc.p] (): Accepting new TCP connection        #成功连接

INFO    2016-02-18 10:57:00.830 [kg.apc.p] (): Yep, we received the 'test' command #接收到test消息

INFO    2016-02-18 10:57:05.185 [kg.apc.p] (): Client disconnected           #断开连接

测试客户端(Jmeter端)使用情况

Jmeter客户端的监听测试

1、随便添加一个HTTP请求的sampler,把线程组设为无限循环

2、添加“jp@gc - PerfMon Metrics Collector”监听器

3、添加要监控的项目,如CPU、内存等,一行选择一种添加监听项

4、最后运行jmx测试计划就行啦

 jmeter_第40张图片

打开JMeter.bat,添加监听器Permon Metrics Collector;Add Row添加一行monitor配置(修改Host/IP为测试IP)-运行-观察server日志即chart图标内容。

 jmeter_第41张图片

ServerAgent端的日志:
INFO    2016-02-18 11:02:14.197 [kg.apc.p] (): Accepting new TCP connection

INFO    2016-02-18 11:02:14.243 [kg.apc.p] (): Yep, we received the 'test' command

INFO    2016-02-18 11:02:14.246 [kg.apc.p] (): Starting measures: cpu:

INFO    2016-02-18 11:02:14.402 [kg.apc.p] (): Client disconnected

b 运行jmeter时,成功连接然后立刻断开了,并没有获取我们想要的数据。猜想需要一个时间控制的元器件,使其能够获取一段时间的数据。

i 步骤:添加线程组(不添加发送请求),设置循环次数为永远,点击运行。

  结果:成功连接然后立刻断开

ii 添加线程组,设置循环次数为"永远";为线程组任意添加一个Sampler取样器(并不设置参数);添加一个PerfMon Metrics Collector监听器;点击运行。

  结果:成功获取chart图,点击stop,即结束监听数据。全部配置图如下

jmeter_第42张图片

 

 jmeter_第43张图片

 

 jmeter_第44张图片

jpgc-perfmon安装配置

当在服务器启动ServerAgent时,我们可以通过JMeter上的一个插件来收集服务器的信息,关于CPU、Memory、Swap、Disk I/O和Networks。

 jmeter_第45张图片

然后重启JMeter,我们就能看到我们安装的插件了,如下图所示:

 jmeter_第46张图片

注意:必须在服务器上启动ServerAgent,我们再JMeter上使用PerfMon Metrics Collector才能收集到数据哦!

在负载测试期间,了解加载的服务器的运行状况非常重要。如果正确分派负载,也很高兴看到您是否以群集为目标。为了解决这个问题,插件包现在支持服务器监控!使用它,您可以在几乎所有平台上监控CPU,内存,交换,磁盘I / O和网络I / O!

这是插件的样子。它显示了负载测试中涉及的4个服务器的CPU使用率:

 jmeter_第47张图片

收集的度量标准

从版本0.5.0开始,Server Agent工具支持收集超过75个系统指标。 

概念

默认情况下,JMeter无法检索除Tomcat之外的服务器指标。为了克服这种情况,我们开发了一个服务器代理,它将获取JMeter的性能数据。代理使用SIGAR开源库。它由每个操作系统的Java公共部分和本机库组成。

 jmeter_第48张图片

安装

服务器代理工具详细说明放在这里。

用法

GUI模式

在GUI模式下,只需添加侦听器,定义要监视的服务器和度量标准类型,确保代理程序在远程服务器上运行且未被防火墙阻止,然后运行测试。这些值将显示在实时图表中。

非GUI模式

如果在非GUI模式下运行JMeter并希望将监视数据保存到文件,只需像在其他侦听器中一样在GUI中配置结果文件保存。运行测试后,您可以将保存的文件加载到GUI中并查看值时间轴。

JMeter属性

jmeterPlugin.perfmon.interval - 指标收集间隔(以毫秒为单位)

jmeterPlugin.perfmon.useUDP - true / false,在尝试TCP连接失败后尝试启用UDP连接

jmeterPlugin.perfmon.label.useHostname - true / false,启用“短”主机名,默认模式为([\ w \ - ] +)\ .. *

jmeterPlugin.perfmon.label.useHostname.pattern - 字符串(转义),用于提取主机名的正则表达式(第一个组匹配)

例如,默认模式为:jmeterPlugin.perfmon.label.useHostname.pattern =([\ w \ - ] +)\ .. *

例如EC2 us-east / west子域匹配的模式:jmeterPlugin.perfmon.label.useHostname.pattern =([\ w \ - ] + \ .us-(east | west) - [0-9])。*

forcePerfmonFile - true / false,启用它使JMeter在当前目录中写入带有perfmon指标的JTL文件

常见的考虑因素

PerfMon服务器代理仅支持最高0.4.2版本中的少数指标。PerfMon Metrics Collector版本0.5.0+ 仍支持旧代理。但是,0.5.0版本提供了新的ServerAgent,它提供了超过75个单独的指标,支持每个进程的CPU和内存指标,甚至可以自定义指标,用于衡量您想要的任何内容:文件大小,数据库行数,Java堆大小和垃圾收集。

指定度量参数

PerfMon Metrics Collector具有特殊的“度量参数”列,用户可以在其中指定要收集的度量子类型,指定应监视哪个进程(哪个文件系统,网络接口)。度量参数字符串里面可能有几个参数,用冒号`:`分隔。要将冒号包含在char inside参数中,请使用反斜杠转义`\:`。请注意,您不能在度量参数字符串中使用制表符,所有制表符都将以静默方式转换为空格。

大多数指标都接受称为“类型”的单个参数。此参数指定要收集的特定数字。如果未指定“type”参数,则将收集每个度量标准类别的默认度量标准类型(请参阅下面的列表,每个类别中的粗体第一项)。

有些指标类型常用,并认为主,留下了一些很少使用的类型作为附加。请注意,并非所有平台上都提供所有指标,我们在 此处依赖于SIGAR API功能。

某些指标允许指定要监视的特定对象,您可以指定 selector参数来仅监视此对象的值:

进程的名称,pid和ptql选择器

核心选择器,用于监控多核系统的特定CPU

文件系统的fs选择器

用于网络接口的iface选择器

请注意,每个进程的度量标准类型和CPU和内存的总指标都不同。

一些示例度量参数字符串:

``### CPU ### combined - 测量总CPU使用率,等于100-idle值core = 2:user - 测量用户进程系统中第三个核心的CPU使用率(核心编号从0开始)name = java# 2:user - 将监视第二个java进程实例用户花费的时间pid = 14523:percent - 将使用PID 14523监视进程的总CPU使用百分比name = httpd - 省略度量标准类型将使用默认的'percent'

###磁盘IO ### fs = / home:writes - 将监视/ home文件系统的写操作次数

###网络IO ### iface = eth0:tx - 将监视接口eth0以获取传输的数据包速率```

安装文件目录介绍

 jmeter_第49张图片

 

 jmeter_第50张图片

注:backups在jmeter文件夹里初始化是没有的,只有当你保存一个脚本的时候,它会自动将上一次点击保存按钮的快照的脚本备份在此文件夹里,这样的好处是可以随时使用之前任何一个保存的快照版本进行重新优化脚本或者找回自己想要的某一个脚本版本。

jmeter_第51张图片

 

 jmeter_第52张图片

 

 jmeter_第53张图片

 

 jmeter_第54张图片

 

 jmeter_第55张图片

JMETER_HOME/lib - 用来放使用的 jar 文件

JMETER_HOME/lib/ext - 用来放 JMeter 组件和扩展

如果你开发新的 JMeter 组件,你可以压缩它们成 jar 包并拷贝到 JMeter 的/lib/ext 目录。JMeter 将会自动发现在这里的任何 jar 文件中的 JMeter 组件。

支持的 jar 文件(类库)应该放在 lib 目录.如果你不想把扩展 jar 包放到 lib/ext 目录, 可以在 jmeter.properties 中定义search_paths 属性。

不要使用 lib/ext 给那些公用的 jar 包;它仅仅是存放JMeter 组件。其他 jar 包 (例如 JDBC, 和任何 JMeter 代码需要支持的类库)应该被代替放在lib 目录,而不是 lib/ext 目录。

bin目录介绍

 jmeter_第56张图片

jmeter.bat - 运行 JMeter(默认在 GUI 模式)

jmeter-n.cmd - 使用一个 JMX 文件运行非 GUI 测试

jmeter-n-r.cmd - 使用一个 JMX 文件远程运行一个非 GUI 测试

jmeter-t.cmd - 在 GUI 模式使用一个 JMX 文件

jmeter-server.bat - 以服务器模式启动 JMeter

注意

JMeter 会发现.jar 文件,而不是.zip 文件。你可以在$JAVA_HOME/jre/lib/ext安装有用的jar文件, 或者(自从 2.1.1版本)你可以在 jmeter.properties 中设置 user.classpath 属性。注意设置 CLASSPATH 环境变量将不起作用。这是因为 JMeter 使用"java --jar"启动,并且 java 命令无记录忽略 CLASSPATH 变量,并且当使用-jar 选项时-classpath/-cp 选项也被使用。 [所有的 java程序都是这样, 不仅仅是 JMeter]自从 2.1.2,你能够通过 JMeter 属性 user.properties 在文件中定义附加的JMeter 属性,user.properties 默认值是 user.properties。

如果在当前目录被发现,这个文件被自动加载。类似的,system.properties 被用来更新系统属性。

Jmeter.bat

启动JVM虚拟机需要使用的内存大小

 jmeter_第57张图片

关掉cmd弹出框时,jmeter程序不退出

 jmeter_第58张图片

Jmeter.properties

 

 

 jmeter_第59张图片

 

 jmeter_第60张图片

jmeter.properties的GUI方式

jmeter_第61张图片

 

 jmeter_第62张图片

JMeter主要组件介绍

v  测试计划(Test Plan)是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器。

v  线程组(Thread Group)代表一定数量的并发用户,它可以用来模拟并发用户发送请求。

v  取样器(sampler)定义实际的请求内容,被线程组包含,我们主要用HTTP请求。

v  监听器(Listener)

v  逻辑控制器(Logic Controller)

v  断言(Assertions)

v  配置元件(Config Element)

v  前置处理器(Pre Processors)和后置处理器(Post Processors)

v  定时器(Timer)

快捷键列表

【Ctrl+-】:测试计划树全部折叠起来;

【Ctrl+Shift+-】:测试计划书全部展开;

【Ctrl+e】:清空“察看结果树”里的内容;

【Ctrl+q】:弹出提示框是否保存当前测试条目成本地jmx文件;

【Ctrl+r】:运行当前测试计划数脚本;

【Ctrl+o】:打开上一次访问过的本地文件路径;

【Ctrl+f】:查找测试计划树功能;

【Ctrl+g】:截取当前组件界面,然后另存到本地的图片文件;

【Ctrl+h】:打开当前组件所对应的web网页帮助文档;

【Ctrl+l】:彻底删除测试计划树里的所有内容;

【Ctrl+x】:彻底删除当前展示的组件;

【Ctrl+m】:打开jmeter的bin目录;

【Ctrl+?】:当光标在测试计划树里,则相当于【Ctrl+A】全部选中的功能;

工具组成(场景)和线程组(虚拟用户生成器)

测试计划(场景)

一个测试计划描述了一系列 Jmeter 运行时要执行的步骤。一个完整的测试计划包含一个或者多个线程组,逻辑控制器,取样发生控制,监听器,定时器,断言和配置原件。

 

v  测试计划(Test Plan)是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器。测试计划里面的元素的作用域是全局的。

v  名称:你可以为你的测试计划取一个有意义的名字。

v  注释:对测试计划的注释。

v  Add directory or jar to classpath:向类路径即%JMETER-HOME%\lib中添加目录及jar包。

 jmeter_第63张图片

测试计划对象有一个叫做"函数测试模式"复选框。如果被选择,它会使 JMeter记录来自服务器返回的每个取样的数据。如果你在测试监听器中选择一个文件,

这个数据将被写入文件。如果你尝试一个较小的测试来保证 JMeter 配置正确并且你的服务器正在返回期望的结果,这是很有用的。这样的后果就是这个文件会

快速的增大,并且 JMeter 的效率会影响。如果你不做压力测试这个选项应该关闭(默认关闭)。如果你不记录数据到文件,这个选项就没有用了。

 jmeter_第64张图片

停止 (Control + '.') - 立刻停止所有的线程

关闭 (Control + ',')- 请求所有线程在当前任务结束后停止

线程组(虚拟用户生成器) 【Ctrl+0】

线程:表示的是虚拟用户

线程组:所有的任务都是基于线程组,开通多少个线程就代表有多少个并发用户;

线程组元件是任何测试计划的起点。 一个测试计划的所有元件必须在一个线程组下。由名字可以看出,线程组元件控制 JMeter 运行测试时使用的线程数。

jmeter_第65张图片

 

 jmeter_第66张图片

 

 jmeter_第67张图片

 

 jmeter_第68张图片

If loop count is not -1 or forever,duration will be min(duration,loop count*iteration duration)

如果循环计数不是-1或永远,则“持续时间(秒)”将为分钟(持续时间=循环计数*迭代持续时间)

 jmeter_第69张图片

 

 jmeter_第70张图片

1)名称:可以随意取,我们保持创建是自动分配的名称

2)注释:随意

3)在取样器错误后要执行的动作:我们选择继续,错误之后依然继续执行

4)线程数:一般我们用来表示多少个用户,即我们测试时的用户并发数,通俗的说就是表示召集多少人。

5)线程属性之Ramp-up Period(in Seconds):线程间的时间间隔,单位是秒。即所有线程在多少时间内启动。

(理解成LR里的初始化虚拟用户数设置的每秒几个用户启动。)

表示每个用户启动的延迟时间,上述我设为1秒,表示系统将在1秒结束前启动我设置的1000个用户,如果设置为1000秒,那么系统将会在1000秒结束前启动这1000个用户,开始用户的延迟为1秒,那么1000秒的时候可能并发用户数不是1000,因为可能之前启动的用户已经迭代完一次脚本,因此如果测试具体的并发用户数,要结合集合点设置功能,即同步计时器。 如果我设置为0秒,则表示立即启动所有用户。

6)线程属性之循环次数:请求的重复次数,如果选择后面的forever(默认),那么 请求将一直继续,如果不选择forever,而在输入框中输入数字,那么请求将重复指定的次数,如果输入1,那么请求将执行一次,如果是0,会出现问题。如果你要限定循环次数为10次的话,可以取消永远的那个勾,然后在后面的文本框里面填写10;在这里我们勾上永远,表示如果不停止或者限定时间将会一直执行下去, 是为了方便调度器的调用。

7)调度器的配置:我们勾选调度器时,将会出现这个面板

启动时间:表示我们脚本开始启动的时间,当你不想立即启动脚本测试,但是启动脚本的时间不会在电脑旁的时候,你可以设定一个启动的时间,然后再运行那里点击启动,系统将不会立即运行,而是会等到你填写的时间才开始运行。测试计划什么时候启动,启动延迟会覆盖它。

结束时间:与启动时间对应,表示脚本结束运行的时间。测试计划什么时候结束,持续时间会覆盖它。

  持续时间:表示脚本持续运行的时间,以秒为单位,比如如果你要让用户持续不断登录1个小时,你可以在文本框中填写3600。如果在1小时以内,结束时间已经到达,它将会覆盖结束时间,继续执行。测试计划持续多长时间,会覆盖结束时间。

  启动延迟:表示脚本延迟启动的时间,在点击启动后,如果启动时间已经到达,但是还没有到启动延迟的时间,那么,启动延迟将会覆盖启动时间,等到启动延迟的时间到达后,再运行系统。测试计划延迟多长时间启动,会覆盖启动时间。

  注意:如果我们需要用到调度器来设定持续时间,如果线程数不够多到持续时间结束,我们就必须将循环次数勾选为永远,特别地,如果线程组里面有其他的循环,我们也需将该循环次数勾选为永远,否则,按我如上配置,将“永远”去掉勾选,文本里填1,那么无论你将持续时间启动时间结束时间等设置多少,系统运行1000次后,将会停止不再运行。

测试片段

 

 

 jmeter_第71张图片

可执行元件

作用域规则:JMeter 测试树包含元件总是分等级和顺序的。在测试树中的一些元件是严格分级(监听器,配置元件,后置处理器,前置处理器,断言,定时器),

一些主要是有序的(控制器,取样器)。当你创建测试计划时,你将创建一个有序的取样请求(通过取样器)列表,那些请求描述了一组步骤的执行。

那些请求常组织在也有序的控制器中。

配置元件(读取数据的来源)

 jmeter_第72张图片

配置元件配合取样器工作。虽然它不发送请求(除了 HTTP 代理服务器),但是它可以添加或者修改请求。

一个在树枝内部的配置元件比在父支的同样元件有更高的优先级。而且每个配置元件的作用域范围不相同,作用域的范围在其所属的同级树范围内有效。

 jmeter_第73张图片

在我们的测试计划中我们使用的都是HTTP请求,在HTTP请求中常常会提交一些参数,我们为了不想在每一次请求中都使用相同的参数值,就要想办法让每一次请求的参数的值都是不一样的,我们就需要进行参数化设置,这里我们介绍两种参数化设置的方法。

一种是利用函数助手中的_Random函数进行参数化设置;

一种是利用配置元件中的CSV Data Set Config进行参数化设置。

用户定义的变量

用户定义的变量:用户可以自己定义变量,在用到此变量的时候直接用${变量名}引用即可。例:变量名=url,值=http://www.baidu.com,在需要http://www.baidu.com时直接用${url}即可。引用变量的时候是区分大小写的,必须一模一样。

 jmeter_第74张图片

注:用户定义的变量元件不管放到什么位置,它的作用域都是整个测试计划里的任何引用它里面设置的参数的元件。

HTTP属性管理器

 jmeter_第75张图片

 

 jmeter_第76张图片

注:1)manager即管理器的配置元件在一个线程组里同一个管理器最多只能有一个,否则jmeter会出错。

    2)http请求默认值正常也是在一个线程组里最多只能有一个,如果出现多个且配置的是同一个域名或IP地址,jmeter会将其的其他设置的参数等叠加合并成一个去使用,这样使用很少见,一般对于同一个域名或者IP地址使用一个http请求默认值配置元件即可。反之,如果两个HTTP请求默认值配置的域名或者IP地址不是相同的,则不会叠加,只会使用按线程组里的从上到下的顺序中的遇到的第一个http请求默认值,其他的不会执行了。

HTTP请求默认值

 

   如果其放在某个取样器的子节点,那么它的作用域就是只对这个取样器有效,而对于其它和其父节点取样器同级的取样器无效。反之如果其和多个取样器同层级,那么其对这些采样器都其作用。

 

注:

主要作用是当做一个全局的配置用,比如说:URL地址的根域名配置在HTTP请求默认值里。而其下方的其它的“http请求”都只需要配置“路径”,即相对路径即可。这样的好处在于根域名信息变了,只需要修改http请求默认值里的配置即可。如果是某些相对路径的页面相对路径变了,就只需要修改对应的页面的相对路径即可。包括参数有通用的,也可以在这里设置,总之只要是多个http请求相同的设置都可以通过http请求默认值来设定后供后续的http请求复用。如果你在http请求里又填写了http请求默认值里的设置,那么优先以你个人的http请求设置为准。

HTTP授权管理器

 

 

HTTP缓存管理器

 

 

 

HTTP Cookie管理器

 

 

如果自定义cookie参数设置,那么表示的意思是整个线程组里的所有线程都使用的,反之不设置任何参数,则表示的是每个线程使用的都是程序里自己设定的cookie

 

 

 

注:当你把http cookie管理器放在整个测试计划树的顺序第一的位置,且什么参数都不需要手工去加,表示全局范围内都自动存储各种cookie值,当运行脚本后续的过程中需要用到对应的cookie值的时候直接在这里取。如果需要设置局部的cookie取值的时候,可以使用“正则表达式”去获取需要的对应的cookie值,然后在需要引用的取样器里添加单独的http cookie管理器且进行手工cookie变量参数的设置,包括作用域范围及相对路径。

HTTP信息头管理器

 

 

 

User-Agent:在jmeter里“Http信息头管理器”里需要添加此参数,表示的是当有多个取样器子节点下有信息头管理器的时候,为了模拟每个取样器发出去的请求都是同一样浏览器(或者说是同一个客户端)发过来的,需要参加此参数。

函数助手

JMeter中有一个函数助手的功能,里面内置了多个函数,我们可以利用其中的_Random函数来进行请求中的参数化设置。

在JMeter中选择“工具-函数助手对话框”打开函数助手对话框,选择“_Random”函数

 

v  选择一个功能_Random。

v  设定最小值为1。

v  设定最大值为100。

v  函数名称设为func1。

v  点击生成将生成一个引用字符串${_Random(1,100,func1},在需要的请求参数中拷贝该字符串即可。

v  其中函数名称用来在引用中作区别,即我们可以设定不同的名称在不同的地方引用同一个函数的功能。

 

例如:我们生成了两个串${_Random(1,100,func1)}、 ${_Random(1,100,func2)},在添加图书的请求中,我们在bookName的参数值中引用${_Random(1,100,func1)},

在bookConcern的参数值中应用${_Random(1,100,func2)},见截图,这样测试运行时不同的线程将产生不同的bookName和bookConcern。

 

函数介绍

 

 

注:大括号{}里的下划线有两个。

__BeanShell

BeanShell 函数执行通过它的脚本并返回结果。

请注意 BeanShell 的 的  jar  文件并没有包含在 JMeter中;它需要单独下载。使用 BeanShell 的全部详细信息,请参见 BeanShell 站点

http://www.beanshell.org/

 

__counter

counter 每次调用产生一个新数字,从 1 开始每次增加 1。counter 可以配置来保持单独模拟每个用户的值,或者对于所有的用户使用同一个 counter。

如果每个用户的值是单独增加的,那在整个测试计划过程中就像记录数字迭代一样。一个全局的 counter 就像记录请求运行了多少次。

counter 使用一个数字变量来计数,它有一个最大值 2,147,483,647.

 

counter 函数实例现在完全是单独的。

 

 

__CSVRead

CSVFile 函数从 CSV 文件返回一个字符串 (c.f. StringFromFile)

当一个文件名第一次遇到时,文件会被打开,并读取到一个内部数组。如果一个空行被发现,这被认为是文件的结尾 - 这允许使用跟随注释

所有接下来同样文件名的参考使用相同内部数组。 N.B. 文件名大小写对于函数是有效的,甚至 OS 不关心,所以 CSVRead(abc.txt,0) 和 CSVRead(aBc.txt,0)

会指向不同的内部数组。

*ALIAS 特性允许同样的文件被打开多次,并允许使用更短的文件名。

每个线程都有它自己的内部指针指向文件数组的当前行。 当一个线程第一次指向这个文件,它会被分配到数组的下一个空行 ,所以每个线程会和其他线程访问不同的行。

 

 

 

 

 

__StringFromFile

首先本地创建一个待测试的同一个域名服务器下的多个相对路径地址集合式的文件:

 

 

 

__intSum

intSum 函数用来计算两个或者更多 int 值的和。

 

__javaScript

javaScript 函数执行一个 JavaScript 代码片段,并返回它的值。JMeter 的 Javascript 函数调用一个单独的 JavaScript 解析器。Javascript 是一种脚本语言,

所以你可以做计算等。

语言详细,请参考 Mozilla Rhino 概述

下列变量对于脚本是可用的:

  ctx - JMeterContext 对象

  vars - JMeterVariables 对象

  threadName - 字符串

  sampler - 当前取样器对象 (如果有的话)

  sampleResult - 前一个 SampleResult 对象 (如果有的话)

  props - JMeter Properties 对象

 

__log

log 函数把一条信息记入日志,并返回空字符串

 

__logn

logn 函数把一条信息记入日志,并返回空字符串

 

__longSum

longSum 函数用来计算两个或者更多 long 值的和。

 

__machineName

machineName 函数返回本地主机名。

 

__md5

 

__property属性

property 返回 JMeter 的属性的值。如果这个属性值没找到,没有默认值提供,它会返回属性名。当提供一个默认值时,就不需要提供一个函数名 - 参数可以为空,并它被忽略。

For example:

  ${__property(user.dir)} - 返回 user.dir 值

  ${__property(user.dir,UDIR)} - 返回 user.dir 值并保存在 UDIR 中

  ${__property(abcd,ABCD,atod)} - 返回属性 abcd 的值(如果未定义, 返回"atod") 并保存在 ABCD 中

  ${__property(abcd,,atod)} - 返回属性 abcd 的值 (如果未定义,返回"atod")但并不保存它

 

__Random随机参数化

random 函数返回在最小值和最大值之间的一个随机数。

 

举例:生成1-100的随机数函数,然后将生成的函数引用到“http请求”的对应的参数里。

 

 

 

_RandomString随机字符串函数

 

__regexFunction

正则函数用来解析使用任何正则表达式的前响应(通过用户提供)。这个函数返回使用填充的变量值的模板字符串。__regexFunction 存储值以备以后使用。

在第六个参数中,你可以指定一个参考名。在以后这个函数执行时,同样的值会在稍后使用自定义值规则时被得到。

例如,如果你输入"refName"作为第六个参数,你将可以这样使用:

  ${refName} to refer to the computed result of the second parameter ("Template for thereplacement string") parsed by this function

  ${refName_g0} to refer to the entire match parsed by this function.

  ${refName_g1} to refer to the first group parsed by this function.

  ${refName_g#} to refer to the n th group parsed by this function.

  ${refName_matchNr} to refer to the number of groups found by this function.

 

_setProperty

setProperty 函数设置 JMeter 属性的值。来自函数的默认返回值是空字符串。所以这个函数调用可以在任何函数可用的地方使用。

原始值可以通过设置第三个可选参数为"true"来返回。

属性对于 JMeter 是全局的,所以可以用来在任何线程和线程组之间传递。

 

_split

split 函数按照分隔符分隔字符串,并返回原始字符串。如果任何分隔符相邻,返回"?"。这个分隔的字符串返回在变量${VAR_1},${VAR_2}等中。变量的数量返回在${VAR_n}中。自从JMeter 2.1.2 以后,一个连续的分隔符被作为一个缺少的变量处理,并以"?"返回。同时,允许它和ForEach 控制器一起工作的更好

 

__StringFromFile

StringFromFile 函数用来从文本文件读取字符串。对于运行需要许多变量数据的测试非常有用。例如当测试一个银行程序时,100 个或者 1000 个不同的帐号

数字可能是需要的。另见 CSV 测试配置元件,它很容易使用。然而,那个元件现在不支持多个输入文件。每次调用,它会从文件读取下一行。当文件到达最后,

它会从开头再次开始读取,如果没有到达最大循环数。如果在一个测试脚本对于函数有多个参考名,每个都会单独打开文件, 甚至文件名是相同的。

[如果这个值在其他任何地方再次使用,对于每个函数的调用使用不同的变量名。]

如果打开文件或者读取文件发生错误,函数返回字符串"* ERR*"

 

 

_time

这个时间函数以不同的格式返回当前时间

 

__threadNum

thread number 函数简单返回当前执行的线程数量。那些数字是单独的线程组,意味着从函数的视角来看线程组1的线程 #1和在另一个线程组的线程#1是不可

区分的。这个函数没有参数。这个函数不可以运行在那些任何运行在一个单独线程的配置元件中(例如:自定义变量)。

 

_XPATH

XPATH 函数读取一个 XML 文件并匹配 XPath,每个节点的匹配都是迭代遍历,就像 CVSReader。

例如:

${__XPath(/path/to/build.xml, //target/@name)}

这会匹配在 build.xml 文件的所有 target 元素,并返回 name 变量

 

前置处理器(发出请求之前需要做什么操作)

前置处理器(Pre Processors)和后置处理器(Post Processors)负责在生成请求之前和之后完成工作。前置处理器常常用来修改请求的设置,后置处理器则常常用来处理响应的数据。

 

 

 

JSR223 预处理程序【Ctrl+7】
用户参数

 

 

 

 

定时器(思考时间)

默认,JMeter 线程发送请求时不在请求间暂停。我们建议你通过添加一个可用的定时器到你的线程组来指定一个延迟。如果你不添加延迟,JMeter 会在短时

间内产生太多请求,可能会压倒你的服务。定时器会使 JMeter 在一个线程开始每个请求间延迟一段时间。如果你选择添加多于一个定时器到一个线程组,

JMeter 会在执行取样器前获得定时器数量并暂停那个时间量。

定时器(Timer)负责定义请求之间的延迟间隔。

 

 

但是又有区别。因为JMeter中的定时器有一个作用于的概念,如下图所示:

 

 

固定定时器(用户思考时间)【Ctrl+4】

固定定时器放在多个取样器的同层级的时候,其作用域是对同层级的所有取样器都有效,即:先执行思考时间后,再执行第一个取样器,然后再执行思考时间后,再执行第二个取样器,以此类推。所以说定时器元件必须放在同层级的取样器的前面。如果在某个取样器子节点里,则作用域只对此取样器有效。

同步定时器(集合点)

集合点的位置

因为集合点是在取样器sampler(例如HTTP访问)之前,所以同一节点下的同步定时器也在取样器之前执行,无论位置在前或后都一样。建议放在采样器前面。

一个线程组中存在多个取样器,如果同步计时器和这些取样器都在同一节点下,则同步计时器同时作用于这些取样器。

如果想让定时器单独作用于某一个取样器,那么请在这个取样器的子节点上添加定时器。

 

注意:“同步定时器”必须放在“取样器”的前面。换句话说就是要放在需要测试的集合点功能的协议的同层级的前面。

 

 

 

 

高斯随机定时器

 

高斯随机定时器的设置更适合实际用户思考时间的行为,因为每个人操作的思考时间不完全相同。

常数吞吐量定时器(控速器:TPS每秒事务请求数)

 

表示:比如此定时器所处的线程组设置的希望1000个线程并发,但是多长时间达到1000人并发?此定时器主要是用来控制请求速度,即每秒钟发出的事务请求数。

如果设置此定时器功能,那么线程组设置的1000个线程并发,事务的请求,每秒钟请求事务数是随机的,不可控的。而此定时器设置的100表示每分钟最大的请求事务数。通俗的说就是不管你要召集多少人,我这里设置的就是每秒钟必须要发出多少个请求,即:每秒钟我们要完成多少量的工作。

控制器

 

取样器(协议类型|动作型元素)

 

 

Sampler:所有的测试任务都是Sampler,即任何测试任务的类别都是Sampler,比如HTTP请求、JDBC请求、FTP请求;

定义实际的请求内容,被线程组包含。取样器告诉 JMeter 发送请求到服务器,我们主要用HTTP请求。

 

注意 JMeter 发送请求按照同层级的取样器出现在线程组树中的从上到下的顺序执行。

HTTP请求【Ctrl+1】

 

 

 

 

注:

1)如果是http协议,可以不用填写,但是是https协议,必须在协议框中填写,建议都填写,养成好习惯。

2)“参数”和“body Data”标签页是互斥的,意思是每次只能选择其中一种进行参数值设置。在切换的时候,必须保证当前标签页里的已有的参数删除干净,即为空后才能切换成功到另一个标签页。

GET请求方法

 

 

POST请求方法

 

 

 

file协议

 

从HTML文件嵌入资源

 

 

 

 

注:一般如果只想解析当前设置的URL地址,那么上图中的就不要打钩,反之,如果要解析当前设置的URL地址的时候,发现连带含有其它URL地址的时候,想一并获取这些URL地址的信息,则需要打钩。至于“网址必须匹配”是否设置,即是否过滤一些不需要的URL资源信息,看需求。它是受到“从HTML文件获取所有内含的资源”是否启用而是否生效的。只有在“从HTML文件获取所有内含的资源”打钩后,“网址必须匹配”不设置过滤的话,那么就获取所有URL资源,如果设置了的话,则只在匹配设置的URL的资源才获取。

IP欺骗

 

BeanShell 取样器

 

 

 

 

 

注:路径里的双斜杠表示的是第一个是转义字符反斜杠,第二个反斜杠才是真正路径里的反斜杠

 

MD5加密用户登录密码的例子:

 

 

 

下图是一个事先输入设定了参数值:a b c,然后代码里的去使用这些参数值的变量的例子:

 

 

Dummy Sampler虚假调试接口取样器

这个取样器的作用是当某个接口未开发完成或者未调通之前,为了配合其他相关接口的联调接口测试,而使用它来充当此接口进行接口联调测试。通过在此取样器里配置响应状态码、请求参数及响应数据。一般最主要的是根据响应数据的测试用例,来进行接口测试。比如假定此测试用例的响应数据是:a=1,需要对此取样器添加后置处理器,比如说正则表达式来提取响应数a=1来给作为下一个取样器的请求参数来使用的目的。

 

测试活动【Ctrl+5】

Debug Sampler调试取样器【Ctrl+8】

 

获取所有脚本里的所有变量当前执行后的取值结果在“察看结果数”里打印出来展示。

 

注:当jmeter属性设置成False时,察看结果树里显示的变量是内置的变量,每次都会显示这些变量。反之设置成true之后,用户定义的变量也会显示出来,目的是用来调试用户定义的变量用的。

逻辑控制器

 

 

逻辑控制器让你定制当发送请求时 JMeter 使用的判断逻辑。例如,你可以添加交替控制器来在两个 HTTP 请求取样器之间交替。

可以自定义JMeter发送请求的行为逻辑,它与Sampler结合使用可以模拟复杂的请求序列。

逻辑控制器还可以作为下列任何元件的子元件:取样器(请求)、配置元件、和其他逻辑控制器。逻辑控制器可以改变来自它们的子元件的请求顺序。

它们可以修改请求本身,导致 JMeter 重复请求等。

理解逻辑控制器在测试计划中的效果,考虑下列测试树:

 

 

仅一次控制器

如果不是为了测试登录操作,一般而言登录操作是希望只运行一次的,因此我们需要添加“仅一次控制器”:

 

 

注:

1)仅一次控制器无论线程组设置迭代N次,在这个逻辑控制器下的请求始终只会执行一次,不受迭代N次的影响。这就是它的特点:仅执行一次:

 

2)当仅一次控制器父节点是循环控制器,不管循环控制器设置循环N次,而线程组设置迭代N次,此时仅一次控制器下的请求会被执行N次,循环控制器设置的N次对其无效。

 

循环控制器

循环控制器可以设置请求的循环次数或永远循环(如果选中永远的话)。

 

ForEach控制器(提交变量)

 

 

 

 

 

 

 

 

Include控制器

 

如果(If)控制器

作用:根据给定表达式的值决定是否执行该节点下的子节点,默认使用javascript的语法进行判断(如下图红框内的文字)。

 

  • Interpret Condition as Variable Expression?:选中这一项时表示:判断变量值是否等于字符串true(不区分大小写)
  • Evaluate for all children:如果选中这一项,在每个子结点执行前都会计算表达式是否为真。

 

 

 

交替控制器

 

 

 

随机控制器

每次执行时,从其子节点中随机选取一个来执行。

 

随机顺序控制器

 

 

Switch控制器

 

 

 

While控制器

 

 

 

 

 

 

RunTime运行控制器

 

吞吐量控制器

 

 

模块控制器

 

随机顺序控制器

 

事务控制器

 

 

事务控制器可以将多个请求放在同一个事务中。如果选中Gegerate parent sample,则聚合报告中只显示事务控制器的数据,而不会显示其中的各个请求的数据,反之则全部显示。

 

 

 

 

 

注:建议大家使用事务控制器时,务必将“Generate parent sample”此项打钩。

 

 

后置处理器(关联)

在HTTP请求的参数中经常会遇到一些参数的值是从服务器响应的动态数据,这些数据需要进行关联才能使得每一次请求都能成功得被服务器接受,在JMeter中采用正则表达式提取器来获取这些动态的数据。

正则表达式允许用户从服务器响应中获取数据,作为一个后置处理器,正则表达式提取器会在每一个请求执行后再执行,正则表达式提取请求的参数值,产生模板字符串,并将结果保存到给出的变量中。

意思是测试计划下的有多个线程组(即:多个测试接口),将上一个测试接口返回值作为下一个测试接口的参数使用。主要用到的是:正则表达式提取器和JSON提取器。


 

一般关联采用最多的就是“正则表达式提取器”。

Json提取器

 

 

 

 

 

 

 

正则表达式提取器【Ctrl+2】

 

 

 

比如我们想要获得从服务器相应的TOKEN,就可以使用下面的正则表达式提取器。

 

引用名称:下一个请求要引用的参数名称,如填写:token,则可用${token}引用它;

正则表达式:()括起来的部分就是要提取的内容字符串;.点表示匹配任何字符串;+加号表示一次或者多次;?:表示在找到第一个匹配项后停止

模板:用$$引用起来,如果在正则表达式中有多个正则表达式(多个括号括起来的内容),则可以是$2$,$3$等等,表示解析到的第几个值被引用。能匹配到多个正则表达式的情况,就是设置的左右边界字符串匹配个数多。如果为了更精准的匹配,可以设置左右边界更明确些,如果实际情况确实存在多次使用,那就是实际存在多个此值。

如:$1$表示解析到的第1个值被脚本中使用此值。但是$0$表示解析到的所有表达式匹配的值。

匹配数字(0代表随机):0:代表随机从正则表达式的括号里的内容字符串里取子字符串值,-1:代表将括号里的内容字符串全部被提取出来。

缺省值:如果参数没有取得到值,那默认给一个值让它取。

 

 

 

注:模板之间可以随便输入串连的字符串,比如:$1$abc$2$   表示的是获取到的第一个变量的值+“abc”+获取到的第二个变量的值

 

 

 

 

 

注:正则表达式的左右边界字符串必须具有唯一性

JSR223 后置处理程序【Ctrl+6】

 

断言(检查点)

 

断言(Assertions)可以用来判断请求响应的结果是否如用户所期望的。它可以用来隔离问题域,即在确保功能正确的前提下执行压力测试。

这个限制对于有效的测试是非常有用的。

 

在web测试中,有的时候,即使我们测试返回的response code为200,也不能保证该测试是正确的,这时候,我们可以用到响应断言,通过对比响应的内容来判断返回的页面是否是我们确定要返回的页面。

 

选择我们要判断的页面,点击添加断言----响应断言,将会出现如下图:

 

响应断言【Ctrl+3】

 

1)名称:随意,这里我们不做改动

2)注释:随意

3)Apply to:这里我们选择默认值

4)要测试的响应字段:这里我们选择响应的文本,即返回的页面信息

5)模式匹配规则:这里我们选择包括,即响应的文本是否包括我们验证的信息

 

6)要测试的模式:“开发者名称”即我们需要验证,开发者名称是否在响应文本中存在,也可以添加更多的字段来验证。

  其他还有文件大小和响应时间等的断言,后面介绍。

大小断言

 

JSON断言

 

断言持续时间

 

监听器(查看测试结果)

监听器(Listener)负责收集测试结果,同时也被告知了结果显示的方式。我们常用的包括:聚合报告、查看结果树、用表格查看结果,都支持将结果数据写入文件。其他的添加上去看看就行。聚合报告前面我们介绍过,后面是查看结果树和用表格查看结果的截图。

 

 

 

察看结果树(只在调试脚本时用)【Ctrl+9】

用鼠标右键单击“测试计划”,添加监控组件“查看结果树”,该组件是给我们调试脚本用的,在正式运行压力测试时,请记得删除该组件。

通过结果树组件,我们可以看到执行每项操作时,服务器的返回结果,从而确定检查点需要设置的值。"查看结果树"监听器显示了请求和响应取样器的

细节,并且以基础的 HTML 和 XML 显示响应表现。

Jmeter运行后,结果树中的响应数据出现中文乱码问题解决方法

 

  在Jmeter安装目录下 bin/jmeter.properties中,查找到sampleresult.default.encoding=ISO-8859-1,将ISO-8859-1更改为utf-8,即sampleresult.default.encoding=utf-8。

 

注:

1.将语句前面的注释符号 # 去掉;

2.修改配置后,需要重启Jmeter才能生效。

 

注:jmeter所有监听器界面的“文件名”都是用来保存到本地的结果报告文件的本地绝对路径。其格式目前只有CSV和XML两种。

聚合报告                                                                     

 

 

Label:每个 JMeter 的 element (例如 HTTP Request )都有一个 Name 属性,这里显示的就是 Name 属性的值

#Samples:表示你这次测试中一共发出了多少个请求,如果测试计划模拟10个用户,每个用户迭代10次,这里就会显示100

Average:平均响应时间 — 默认情况下是单个 Request 的平均响应时间,当使用了事务控制器时,也可以以事务为单位显示平均响应时间

Median:中位数,也就是 50 %用户的响应时间

90% Line: 90 %用户的响应时间

Min:最小响应时间

Max:最大响应时间

Error%:错误率,本次测试中出现错误的请求的数量 / 请求的总数

Throughput:吞吐量 —— 默认情况下表示每秒完成的请求数( Request per Second )

KB/Sec:每秒从服务器端接收到的数据量

汇总报告

 

 

保存响应到文件

 

 

 

自动生成的响应文件的内容,包括文件格式,都是“查看结果树”里运行一次脚本后列表清单显示的内容。

 

 

 

测试计划里的元件执行先后顺序

 

1. 配置元件

2. 前置处理器(运行在取样器之前,多用于设置取样器,和更新从上一个响应获得的变量值)

3. 定时器

4. 取样器

5. 后置处理器 (运行在取样器之后,多用于对响应数据进行处理,可以设置统一解码的格式。如果 SampleResult取样器结果不为空)

6. 断言 (如果 SampleResult 取样器结果不为空,验证服务器返回的信息是否正确)

7. 监听器 (如果 SampleResult 取样器结果不为空)

注:

1)如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序依次执行。

2)前置处理器、后置处理器和断言等元件功能对取样器作用,因此,如果在它们的作用域内没有任何取样器,则不会被执行。

组件作用域

 

 

Jmeter常用层次结构及常用组件

常用的层次结构为:

 

常用的组件有:

  HTTP请求:模拟HTTP请求;

  查看结果树:对于每个请求,可以查看HTTP请求和HTTP响应;

  图形结果:可以图形显示吞吐量、响应时间等;

聚合报告:总体的吞吐量、响应时间;

日志查看:

 

脚本录制

1)使用Badboy或者blazemeter谷歌浏览器插件或者fiddler软件进行录制,Badboy软件支持导出jmx脚本;

2)使用jmeter自带的http代理服务器组件进行录制;

3)手动编写脚本;

注:BlazeMeter是一款可以安装在chrome浏览器的脚本录制工具,是可以辅助Jmeter完成脚本的创建的chrome插件。

三种方式的优劣:

badboy:

  1、有时候录制不了,兼容性较差 。因为badboy是使用的内置浏览器进行的录制,内置的浏览器的内核是IE浏览器的内核,可能会出现兼容性问题,导致无法录制。 

  2、post请求的时候,如果链接中有参数、body里面也有参数,都会放在body里面

jmeter 自带http代理录制:

  1、请求抓取过多   

  2、配置代理等操作比较繁琐

手工编写:

  要一个个请求手工去写

手工编写脚本

一般通过fiddler抓包或者开发提供的接口设计文档的形式,在Jmeter的GUI界面操作进行脚本生成,还可以使用编写java代码打包成jar包进行生成等方式。 

在Jmeter手工制作脚本之前,先要获取HTTP请求的相关信息,如请求地址、请求参数、 请求类型等,一般情况下,有两种方法获取这些相关信息:

  1、根据开发提供的接口设计规范文档;

  2、使用第三方抓包工具如Fiddler、 Charles等抓包, 然后从中提取信息。

使用Badboy进行录制脚本
开始录制脚本

点击录制按钮之后,开始记录做的操作,输入需要测试的地址,在这里以csdn做为主要的登录需求

 

百度搜索csdn,点击csdn官网,注意:这里虽然以新页面弹出的形式出现,但是在新页面做的操作同样会被记录到目录树里(6)

添加帐号和密码之后点击视图里的登录按钮完成登录操作:

 

下图为登录成功的页面。

 

点击写博客

 

填写信息之后点击发表博客,等待发布成功之后结束此次录制。

 

随后点击停止按钮,脚本录制到此结束。此时,step1的红点会变成紫色。说明录制已经停止。

参数化脚本

在目录树里找到csdn的登录请求,可以看到提交的数据

 

选择username右键点击(Add as Vaviable)选项

 

添加变量数据,点击保存之后variables中会出现添加的变量,再次选择右键点击保存,变量替换为${username}

 

再对密码做参数化,重复username的操作参数化

注:如果是为了导出给jmeter用,建议不要参数化和断言。因为不兼容于jmeter,而且jmeter自身的断言和参数化比其更强大,

因此导入到jmeter之后再进行断言和参数化。

生成jmetet脚本

保存

选择File–>Export to Jmeter保存,我们可以导出jmx文件:保存为“badboy.jmx”。

 

Badboy与jmeter使用注意事项:

1 导出jmeter脚本的时候,脚本不被导出,因为jmeter无内嵌浏览器,jscript元素无法执行.

2 data sources不被导出.

 

使用

在jmter中选择文件打开

打开JMeter会有一个默认的测试计划,点击文件-打开,选中录制的脚本文件如:badboy.jmx,打开脚本进行测试。

 

 

注意事项:使用badboy的“Export to JMeter”,生成jmx文件,使用jmeter打开,却报错如下图;

 

原因:badboy 与 jmeter版本不兼容

解决办法:

1. 降低jmeter版本

2.获取最新badboy 版本。

Badboy录制的时候已经帮我们建立好了统一的Cookie管理器和头文件管理器,必要的时候,可以自己在每个HTTP请求下建立单独的cookie管理器和头文件管理器。

 

Badboy录制的脚本cookie策略在导入jmeter之后不兼容,需要改成下图所示:

 

 

使用BlazeMeter进行录制脚本
BlazeMeter Chrome插件官方简介

BlazeMeter是一款可以记录所有HTTP流量并在10分钟内创建一个负载测试并且与Apache JMeter兼容的chrome插件。目前普通的使用方法就是一种脚本录制工具可以辅助Jmeter完成脚本的创建。BlazeMeter扩展提供了两种测试模式:一种是FollowMe模式,在这种模式下不需要设置和脚本。 只需浏览您的网站,一群虚拟用户就会按照您的操作 - 模拟即时测试的负载。 查看实时报告并即时调整您的测试,一键即可进行动态测试;另一种模式是为您为您创建JMeter脚本,记录所有浏览活动以创建JMeter脚本并自动将其上传到BlazeMeter。 单击执行或将其导出为JMeter .jmx文件。

插件下载安装

离线安装插件

下载地址:http://www.cnplugins.com/devtool/blazemeter-the-load-testi/download.html 下载好BlazeMeter插件,放到桌面。

此插件基于谷歌浏览器进行使用的,所以需安装好该浏览器后,再把下载好的插件导入。

打开chrome浏览器,按照下面的截图步骤:点击右上角的菜单按钮---更多工具---扩展程序

 

到扩展程序添加页面,然后把你下载的插件直接拖到扩展插件页面,如下所示:

 

我们看到chrome浏览器的右上角有这个标志,就说明你安装成功了。

 

点击插件图标弹出工具如下图所示:

 

使用过程中发现,需要注册一个账号才能把脚本导出,因此可以到https://www.blazemeter.com/网页,进行账号的注册。

 

使用插件录制脚本

1)用Chrome浏览器打开你要录制的网页,找到插件点击,可以为本次录制取一个名字,然后点击红色原点,开始录制脚本,然后开始录制你需要测试的功能。

 

2)当你在网页上开始操作的时候,每一次服务器请求,BlazeMeter插件的图标上的数字都会加一,可以清楚的看到你录制的步骤。你看到右上角的图标的数字一直在变化,说明你的操作事件被录制到了。

 

3)当录制完成后,再次点击BlazeMeter的图标,然后点击黄色的停止按钮。接着点击那个“jmx”按钮,将测试脚本导出。

注意:这里会要求你先注册,然后才能够导出脚本。

 

4)找到导出的Jmeter脚本,放到桌面来,只是为了方便你自己寻找和后面的操作。打开Jmeter,并导入刚刚你从chrome导出的脚本,看到你刚刚录制的脚本。

最新插件版本

目前最新插件是4.5.1,功能做了不小调整,界面如下:

 

启动录制:

 

录制结束:

 

编辑脚本:

 

 

导出脚本:

 

使用Fiddler生成Jmeter脚本
Fiddler安装JmeterExport.dll插件

首先需要下载2个dll扩展文件:FiddlerExtensions.dll及FiddlerExtensions.pdb(这2个文件是为了扩展Fiddler的导出功能,支持导出JMeter使用的.jmx格式文件)也可以下载JmeterExport.dll就可以,拷贝至Fiddler\ImportExport目录下: 

将下载的插件拷贝到Fiddler的ImportExport文件夹中:

 

 

重启Fiddler

使用Fiddler生成Jmeter脚本

我这里只对我选择的请求,生成Jmeter脚本
选择请求:

 

导出选择的接口:File → Export Session → Selected Session(导出选中的url请求)

当然如果你设置好过滤控制之后,会话窗口都是你想要的http(s)请求,可以选择“All Sessions”导出所有请求。

 

接口导出,前提是按照步骤三,安装了JmeterExport.dll,选择Jmeter Script → 输入保存的文件名 → 保存,保存成功会弹出一个提示保存成功的弹框

 

脚本导入

1、打开Jmeter(Windows系统,打开方式为:双击bin目录下的jmeter.bat文件)

2、导入脚本:文件→打开→选择刚才从Fiddler导出的脚本

 

使用jmeter自带的http代理服务器进行录制脚本

通过模板的方式添加HTTP代理服务器之后,默认会生成标配的元件,且很多设置的地方也默认有了,比如过滤参数等。

 

 

 

 

以上是一种途径,也可以单独的一项一项的添加,如下所示:

 

在测试计划中添加线程组,在线程组中添加逻辑控制器-录制控制器。

 

 

在测试计划中添加非测试元件-HTTP代理服务器。

 

端口:即代理服务器的监听端口,我们设为8080。

 

目标控制器选择:测试计划>线程组;

分组选择:每个组放入一个新的控制器。

 

注:1)“不对样本分组”:表示在代理执行过程中,所有抓取到的每个url请求都分别会生成HTTP取样器;

    2)“只存储每个组的第一个样本”表示的代理执行过程中,只会对每个线程组里的抓取到的第一个url请求地址生成http取样器;

 

注::type默认选择httpClient4录制脚本时录制不下去的时候,弹出提示语报错的时候,建议换成java来实现。


 

注:.*表示的匹配任意的字符串,而反斜杠\表示的是转义字符,比如:\.png表示的是后缀名是.png格式的,反斜杠就是原样输出。中杠线|表示的是或者的关系。

在HTTP代理服务器中添加定时器-高斯随机定时器(用于告知Jmeter来在其生成的HTTP请求中自动的增加一个定时器)。定时器将会使相应的的取样器被延迟。 延时的规则是,在上一个访问请求被响应并延时了指定的时间后,下一个被定时器影响的取样访问请求才会被发送出去。

如果在代理服务器元件里使用了高斯随机定时器,就应该在其中的固定延迟偏移(Constant Delay Offset)设置项里添上${T}(用于自动引用纪录的延迟时间)。

 

 

打开IE浏览器的Internet选项-连接-局域网设置-代理服务器:将局域网(LAN)设置中的代理服务器设为:localhost,端口为在代理服务器中设的端口:8080。

 

代理服务器配置好以后,点击启动,代理服务器就会开始记录所接受的HTTP 访问请求。

现在点击Jmeter上的“启动”按钮,打开浏览器输入需要录制WEB项目地址,Jmeter 会自动记录IE所访问的界面。

 

在浏览器地址栏中输入地址并进行相关的操作进行录制,录制完成后, 停止HTTP 代理服务器; 在录制控制器元件上单击右键将记录的元件保存为一个文件用于以后重用,另外,不要忘了恢复浏览器的代理服务器设置。

 

 

备注1:IE浏览器设置代理后有可能录制不成功,建议换其他浏览器访问待录制的网址

备注2:测试完成后,建议清除之前的代理设置,否则影响上网功能。

手动编写脚本(直接使用“http请求”协议)

1、添加本次测试计划 (右键-->添加-->Threads(Users)-->线程组)

 

2、设置线程数 (所谓线程数就是并发用户数)

 

3、添加协议及相关配置信息

 

手动编写测试请求:(通过抓包工具获取相关信息,以便于设置HTTP请求里的需要的必要参数信息)

 

 

body data需要的参数数据内容

 

注:抓包手写的话,选择body data的话, 不能打钩;反之,如果选择录制脚本方式的话,而且所有的参数获取,包括http信息头管理里获取的头信息,那么必须打钩。

 

抓包手工需要在HTTP信息头管理器补全必要的参数信息:

 

 

 

 

关于HTTP请求,我们录制的脚本里面就有,这里就介绍一些常用的属性。

1)名称:可以随意取,我们可以根据录制脚本的路径来命名

2)注释:可以对该界面做一个简单介绍

3)协议填写为:http

4)服务器名称或IP:即我们的服务器或者IP的地址,我因为是在本机上的项目,故填写localhost,可以填写127.0.0.1。

5)端口号:我用的是tomcat,自己设置的端口号为8080(tomcat默认为8080)

6)方法为:GET

7)路径:即页面的路径;下面的重定向等选择可以根据需要勾选,这里我们保持录制不修改。

8)Content encoding内容编码:编码可以不用填写

9)Parameters参数:即跟着路径一起发送的参数及文件

v  同请求一起发送参数:请求中的参数、值可以在此设置,需要用到参数化及动态数据关联,我们在后面专门介绍。

v  同请求一起发送文件:我可以制定同请求一起发送哪个文件。

v  其他任务包括:从HTML文件中获取所有内含的资源、用作监视器、Embedded URLs must match。

 

1)Implementation实现:这里我们录制时默认填写为JAVA

2)超时(毫秒):定义可以不用填写。

3)下面的代理服务器等可以忽略,按需要填写。

4、为线程添加监听器

 

5、启动测试

 

如果没有保存此脚本,每次点击运行按钮的时候都弹出上图提示语是否需要保存到本地。如果已经保存的脚本,做了脚本修改需要保存的时候,一定要选择“保存测试计划为”。因为这是目前jmeter版本的一个坑,如果选择保存测试计划,有时候会保存的不是修订后的完整代码,可能有缺失。

 

6、查看报告

查看结果树

 

如图所示:成功的为绿色,失败则显示为红色。如果测试的结果太多,你只需要看到错误的页面,则勾选【仅日志错误】

聚合报告

 

其中:

  Label:标签,即我们上面的请求名称

  #Samples:本次场景中一共发出了多少个请求

  Average:访问页面的平均响应时间

  Median:中位数,也就是50%的用户的响应时间

  90%Line:表示90%的用户的响应时间,如果最小值和最大值相差很大的话,我们一般选择这个作为最终测试结果

  Min:访问页面的最小响应时间

  Max:访问页面的最大响应时间

  Error%:出错率,本次测试中出现错误的请求的数量/请求的总数

  Throughput:每秒完成的请求数。(与loadrunner里的表示的意思不一样,LR里表示的是吞吐量)

  KB/sec:每秒从服务器端接受到的数据量

图形结果

 

设置Jmeter的APP代理

注意:做这个代理,必须确保APP与你Jmeter所在的电脑在同一个局域网中!!

第一步:设置Jmeter代理服务器,与设置web代理的第一至第五步一样,这里就不再赘述。

第二步:找到本机连接的WIFI的IP地址:打开cmd命令行工具,输入ipconfig

 

第三步:打开手机WiFi设置,并设置好端口,如下图所示:

 

 

第四步:你可以启动你手机上的任意APP,可以看到所有的脚本请求都被录制到Jmeter啦!

注意:如果你不需要设置代理了,不需要录制脚本了,那就去掉代理哦!反向操作即可!不然你的浏览器你的手机是在代理服务器断开之后,访问不了网络的哦!

JMeter中进行分布式测试(负载生成器)

作为一个纯 JAVA 的GUI应用,JMeter对于CPU和内存的消耗还是很惊人的,所以当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至还会引起JAVA内存溢出的错误。不过JMeter也可以像 LoadRunner 一样通过使用多台机器运行所谓的代理来分担负载产生器自身的压力,并借此来获取更大的并发用户数,我们只需手动配置一下即可。

大家在使用jmeter压测过程中,可能会遇到内存溢出的错误,这是为什么呢?因为jmeter是java写的应用,java应用jvm堆内存heap受负载机硬件限制,虽然我们可以调整堆内存大小,但是单机无法支撑数以万计大并发,此时,需要多个负载机进行分压测试,这样性能瓶颈就不会是我们的负载机了。

 

分布式执行原理

jmeter分布式压测时,选择其中一台作为控制机,其余的机器做为负载机,执行时,控制机会把脚本发送到每个负载机上,负载机获取到脚本就执行脚本(负载机只需要启动jmeter-server.bat或者jmeter-server),执行后,负载机回传执行结果给控制机,控制机会进行汇总。值得注意的是:如果请求执行成功,不会回传请求的响应信息,所以在查看结果树中, 响应结果看到是空的。

保证控制机和负载机上jdk、jmeter版本一样,否则会出一些意外的问题;关闭防火墙:service iptables stop,可以先看防火墙状态,如果是关闭的,就不用管了。

 

 

注:控制机会接收负载机回传的结果数据,所以自身有性能消耗,最好是控制机不做压测,即不做负载机。

分布式压测的配置

 

注:如果有参数化文件,需要拷贝到每台负载机上,路径要一样,而windows和linux上路径肯定是不一样的,所以,负载机要么都是windows,要么都是linux。

jmeter与loadrunner分布式负载的对比

 

注:第3点中jmeter表示的分布式负载器每台机器的并发用户数都是一样的,都是跟控制台设置的线程数保持一致,没有loadrunner可以对每个分布式负载生成器单独设置虚拟用户数。

第一步:启动负载生产器

为了在远程节点运行 JMeter, 通过运行 JMETER_HOME/bin/jmeter-server (unix)或者JMETER_HOME/bin/jmeter-server.bat (windows)脚本在你希望运行的所有代理机器上启动 JMeter 服务器组件。在所有期望运行JMeter作为负载生成器的机器上安装JMeter,并确定其中一台机器作为控制器,其他的机器作为代理。然后运行所有代理机器上的JMeter-server.bat文件。假定我们使用两台机器172.20.80.47和172.20.80.68作为代理;

要进行分布式测试代理机器上需要添加环境变量,即添加用户变量JMETER_HOME=d:\jmeter,系统变量中的path中添加d:\jmeter\bin(假设jmeter放在d盘根目录下)。

 

仅linux服务器作为负载机

bin目录下执行./jmeter-server

 

解决办法:./jmeter-server -Djava.rmi.server.hostname=192.168.116.128

 

不管是负载机还是控制机(如果控制机也作为负载机),执行jmeter-server.bat(linux下执行jmeter-server,另外:linux下检查是否启动成功:ps -ef | grep jmeter-server),报如下错,是因为从JMeter 4.0开始,RMI的默认传输机制将使用ssl。SSL需要密钥和证书才能工作,不使用ssl将存在安全漏洞。下面提示缺少jsk文件

 

在控制机bin目录下,点击:create-rmi-keystore.bat

 

根据提示一直填下去,遇到Yes与No就直接填y,然后回车就ok了

 

回车后生成文件:rmi_keystore.jk

 

复制控制机生成的rmi_keystore.jks到每一台负载机jmeter的bin目录下

 

第二步:添加负载生成器的IP到你的控制机的配置文件里

在 JMeter 控制机上编辑配置文件。在/bin/jmeter.properties 文件中找到属性"remote_hosts",并添加你运行的 JMeter 服务器的 IP。添加多个服务器,逗号分隔。

注意你可以使用-J 命令行参数来指定远程计算机。例如:jmeter -Jremote_hosts=host1,127.0.0.1,host2

在Controller 机器的JMeter安装目录下找到 bin 目录,再找到 jmeter.properties 这个文件,使用记事本或者其他文字编辑工具打开它。在打开的文件中查找“remote_hosts=”这个字符串,你可以找到这样一行“remote_hosts=127.0.0.1”。其中的 127.0..0.1 表示运行JMeter代理的机器,这里需要修改为“remote_hosts=172.20.80.47,172.20.80.68”;这种格式默认的负载机的端口都是1099

如果为了区别可以对每台负载机的端口进行修改,比如说改成2099。只要改成非1099端口,那么在控制机的配置文件里修改远程负载机:

“remote_hosts=172.20.80.47:2099,172.20.80.68:2099”

 

负载机上的配置文件修改端口号:

 

执行jmeter-server

 

可以在做压测之前,先测试每个负载机的端口通不通?

控制机telnet负载机,看端口通不通

 

下图表示telnet通了

 

第三步:启动控制机的JMeter程序
压测开始之前检查测试脚本

关于监听器:查看结果树,主要是用于调试脚本的时候用,调试好后,把这个监听器禁用掉;压测过程中,可以看聚合报告,如果有失败的请求,可以马上远程连接服务器查看错误日志;但是,如果没有远程服务器的权限,就可以不禁用这个监听器,但是要勾选“仅错误日志”

保存文件,并重新启动控制器机器上的JMeter,并进入启动 ->远程启动菜单项。就会看到我们刚才添加的两个代理的地址,选中即可运行,如果想同时启动所有代理,选择远程全部启动即可。

察看结果树响应数据为空

 

而且,哪怕勾选保存结果,查看结果树中依旧没有结果,这可能是jmeter本身的设置,因为如果回传大量数据,会影响性能结果。

 

然后就可以设置线程,跑并发了,比如并发200线程,每秒启动20个线程,并发运行15分钟

 

通过非GUI命令行方式远程启动

单负载机

jmeter -n -t 脚本绝对路径名.jmx -l  要保存的结果绝对路径名.jtl -H 192.168.116.128 -P 2099

 

生成jtl结果文件

 

通过GUI察看结果树导入res.jtl结果文件来看取样器结果等信息

 

通过GUI聚合报告导入res.jtl结果文件来看取样器结果等信息

 

多负载机

jmeter -n -t 脚本绝对路径名.jmx -l 要保存的结果绝对路径名.jtl -R 192.168.116.128:2099,192.168.56.1

其实,在实际压测的时候是较少使用命令行方式的,因为看不到tps波动情况,一般来说,如果有大的波动,是需要立即连接服务器查看各个资源的情况的,比如线程池、连接池,虽然命令行执行完后会生成jtl结果文件,但是压测完,压测过程中创建的各种连接都释放了,也就无法定位到问题了,如果有失败的请求还好点,这样可以根据错误日志来分析定位问题。建议配合其他系统资源监控器工具在压测的过程中时刻观察各个系统资源的变化情况就进行分析。

远程启动java.io.FileNotFoundException: rmi_keystore.jks

第一种解决方案:

1、找到apache-jmeter-5.1.1\bin\jmeter.properties 
2、修改server.rmi.ssl.disable=true (记得去除server.rmi.ssl.disable=true前的#),重新启动jmeter-server.bat 
3、查看命令窗口显示则启动成功 

 

第二种解决方案:

原因:自JMeter 4.0以来,RMI的默认传输机制将使用SSL。SSL需要密钥和证书才能工作。你将不得不自己创建这些密钥。

创建密钥步骤:

点击create-rmi-keystore.bat,

 

回车自动生成密钥:在bin目录下:rmi_keystore.jks

 

回车后生成文件:rmi_keystore.jks

 

点击jmeter-server.bat(只要是启动远程负载生成器,则此台负载生成器都必须打开此服务才行), 启动RMI注册表

 

运行 jmeter-server/jmeter-server.bat,加上下列选项命令:

这个脚本也允许我们指定可选的防火墙/代理服务器信息:

-H [代理服务器主机名或者 ip 地址]

-P [代理服务器端口]

例如 : jmeter-server -H my.proxy.server -P 8000

启动jmeter.bat,选择远程启动

Java工程请求扩展测试

 

 

 

Eclipse新建一个工程

 

 

 

Calc.java类里的计算器加减法java代码编写

 

导出Calc.jar包

 

 

 

以上是生成Calc.jar包提供给jmeter做测试的时候需要在测试计划界面添加此jar引用而准备的。

依赖类的引用

 

如果要做jmeter的java二次开发需要引用jmeter里的jar包:

 

 

 

 

待测的包名右键新建一个测试的类:TestCalc.java

 

Superclass选择下图中的类,作为TestCalc类的父类。

 

 

 

 

 

 

 

 

 

导出TestCalc.jar包

操作同导出Calc.jar包的过程

将Calc.jar包放到jmeter里的D:\apache-jmeter-5.1.1\lib目录下;

将TestCalc.jar包放到jmeter里的D:\apache-jmeter-5.1.1\lib\ext目录下;

然后必须重新启动jmeter

Jmeter里添加java请求取样器

 

 

 

 

FTP协议案例

 

说明:

IP:FTP服务的IP地址

端口号:ftp协议的默认端口是21

Remote file:FTP服务器上的一个文件,即远程文件。

Local file:本地文件的绝对路径

选择 :get(RETR)为下载方式;put(STOR)为上传方式;

填写你的FTP服务器的用户名及对应的密码

注意:目前到此版本,上传或者下载的时候,远程文件或本地文件的绝对路径里不能出现中文汉字,否则会失败。因此,文件名含有中文的时候先修改成不含中文。

Jmeter监控tomcat服务器资源情况

 

注:1、2、3步骤是保证tomcat服务正常运行且2和3来配置tomcat本身自带的网页监控服务器的权限设定。4、表示的jmeter里的http请求的url地址。

 

 

数据参数化

 

 

CSV参数化

维护Sampler需要的配置信息,并根据实际的需要会修改请求的内容。我们主要在参数化中用到CSV Data Set Config。

 

 

 

 

在线程组上点击右键选择添加-配置元件-CSV Data Set Config,打开CSV Data Set Config。

Filename文件名:即参数化要引用的文件名。必须是绝对路径,如果只写文件名,那么默认的是此文件放在jmeter的bin目录下。这适合分布式负载器上如果使用CSV数据参数化的文件建议都放在bin目录下,当然也可以按照控制台的绝对路径统一放置。

File encoding文件编码:可以不填。

Variable Names(comma-delimited)变量名(用逗号分割):多个变量可以引用同一个文件,用逗号分割。

Delimiter(use ‘\t’ for tab)分隔符:参数文件中多个变量值的分隔符,\t表示用tab键分割,默认是逗号。

是否允许带引号?:表示的是当txt文件里有参数的实体值字符串中含有分隔符,逗号,为了程序在执行的时候搞混,此时就需要启用此项,将此项置成true。

而文本txt里带有逗号的字符串需要使用双引号括起来,表示双引号内的是一个参数值。

Recycle on EOF?:结束后是否循环?:默认是True.到达文件里的参数值最后一个之后,再从头第一行开始继续执行;

遇到文件结束符停止显示?:默认是False.表示达到文件里的参数值最后一个的时候,不停止线程,继续执行脚本。

注:“遇到文件结束符再次循环?”和“遇到文件结束符停止线程?”是相结合使用的。

 

 

注:参数化取值的文件里如果第一行写了变量名,则“CSV数据文件设置”界面里就不需要配置“变量名称了”,反之,如果文件里的第一行就是实参值,则界面里必须按照实参值的顺序配置“变量名称”,且变量之间以英文逗号分隔。实参值文件里的最后一行数据之后必须换行,但是不能多个空行,有且仅有一行空行,表示的是结束符。如果结尾有多个空行,它只会把最后一行空行当作结束符标识,其上的空行会在迭代中当作实参值使用。参数化文件txt数据格式和loadrunner里的参数化文件一模一样。

随机数参数化

见:“配置元件”-“函数助手”-“_Random随机参数化”章节

 

计数器参数化

 

 

随机变量参数化

 

 

数据库参数化

 

注:报错:Cannot load JDBC driver class 'com.mysql.jdbc.Driver'

1、下载 mysql-connector-java-5.1.47.jar,哪个版本都可以,按自己的mysql版本来

2、将jar包放到jmeter安装路径下的 apache-jmeter-5.1.1\lib\ext 中

3、重启jmeter,一定要重启

首先选择 JDBC 用户元件,点击鼠标右键,得到添加菜单,然后选择添加-->配置元件-->JDBC 连接配置。 接着选择这个新元件来显示它的控制面板,

设定下面的文本域(我们这里假定用一个名为ddcj_usercenter的192.168.0.222的 MySQL 数据库)。

1)绑定到池变量:这需要能够唯一标识这个配置。这是用来被 JDBC 取样器识别这个配置来使用;

2)数据库 URL: jdbc:mysql://192.168.0.222:3306/ddcj_usercenter

3)JDBC 驱动类: com.mysql.jdbc.Driver

4)访问此数据库的用户名: ddcjtest

5)密码: ddcjtest的密码

剩下的域保留默认值。

 

 

 

 

 

 

加密和解密的使用场景

Jmeter中实现加解密的组件介绍与使用:

1)jar包的引用;

2)beanshell sample取样器元件的使用;

3)具体写法示例;

md5签名验证

 

 

 

 

 

 

 

 

 

Jmeter接口测试

从平台划分角度分:内部接口和外部接口;

从类型/协议角度分:http接口和soap(webservice)接口

从接口请求方式分:get和post

 

腾讯QQ在线状态 WEB 服务

http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx

 

http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?op=qqCheckOnline

提供了:soap1.1, soap1.2,http get ,http post请求方式的具体请求参数和返回结果信息

SOAP 1.1

以下是 SOAP 1.1 请求和响应示例。所显示的占位符需替换为实际值。

POST /webservices/qqOnlineWebService.asmx HTTP/1.1
Host: www.webxml.com.cn
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://WebXml.com.cn/qqCheckOnline"
  
    
      string
    
  
 
  
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
  
    
      string
    
  
 
 

 

 

 

SOAP 1.2

以下是 SOAP 1.2 请求和响应示例。所显示的占位符需替换为实际值。

POST /webservices/qqOnlineWebService.asmx HTTP/1.1
Host: www.webxml.com.cn
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
  
    
      string
    
  
 
  
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
  
    
      string
    
  
 
  
 
注:jmeter线程组设置同soap1.1,只是配置各种参数需要选择soap1.2的
HTTP GET

以下是 HTTP GET 请求和响应示例。所显示的占位符需替换为实际值。

GET /webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=string HTTP/1.1
Host: www.webxml.com.cn
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
string

 

 

 

HTTP POST

以下是 HTTP POST 请求和响应示例。所显示的占位符需替换为实际值。

POST /webservices/qqOnlineWebService.asmx/qqCheckOnline HTTP/1.1
Host: www.webxml.com.cn
Content-Type: application/x-www-form-urlencoded
Content-Length: length
qqCode=string
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
string

 

 

 

Jenkins+ant+jmeter自动化性能测试平台

 

 

 

Ant安装部署

Ant包下载地址:https://ant.apache.org/bindownload.cgi

1.10.6 release发布版本在运行时至少需要Java 8及以上版本的支持,即JDK1.8及以上

Windows

选择系统对应的版本。笔者是windows系统,选择zip下载。选择下载的文件地址之后确定。下载完成后,解压到指定路径下。

 
  1. 5

配置系统环境变量:

windows中设置ant环境变量:

ANT_HOME    D:/ apache-ant-1.9.0

path       D:/ apache-ant-1.9.0/bin

classpath   D:/apache-ant-1.9.0/lib

ant验证:win+R  --  cmd

输入如下命令:ant

如果出现如下内容,说明安装成功:

Buildfile: build.xml does not exist!

Build failed

说明ant安装成功!因为ant默认运行build.xml文件,这个文件需要我们建立。

查看版本:ant  -version

但如果出现 

'ant' 不是内部或外部命令,也不是可运行的程序或批处理文件

说明安装失败:(可以重复前述步骤,直至安装成功。)

 

Linux

解压到/usr/local

cd /usr/local
tar xvf apache-ant-1.10.6-bin.zip

ln -s apache-ant-1.10.6 ant

 

设置ant环境变量,在/etc/profile后添加

# vim /etc/profile

下方为文件里追加的内容

#ant
export ANT_HOME=/usr/local/ant
export PATH=$PATH:/usr/local/ant/bin

强制更新配置文件

#source /etc/profile 

测试:

# ant -version

Jenkins安装配置

Jenkins包下载地址:https://jenkins.io/download/

注:建议下载jenkins.war包的方式搭建jenkins环境,因为在linux系统里直接通过yum安装jenkins的默认权限都是jenkins用户的,有时候牵扯到构建打出来的tag包需要复制到应用服务发布的环境的时候,存在用户权限的问题,所以建议在root账户下载/usr/local目录下使用tomcat中间件去发布jenkins.war包的方式。

Jenkins2.164.1 release以上发布版本在运行时至少需要Java 8及以上版本的支持,即JDK1.8及以上

#cd /usr/local/tomcat7jenkins_8081/webapps

 

自动化测试平台搭建

 

 

 

 

 

 

 

 

把D:\apache-jmeter-5.1.1\extras\jmeter-results-detail-report_21.xsl拷贝到上图中后重命名即可

 

build.xml文件也是配置ant构建的配置文件,然后再在jenkins上配置构建项目。

以下图片里的jmeter路径和以上图片的不一致,根据自身将jmeter文件夹放在本地什么目录,自行替换。

 

 

代码块

   

   

     

   

   

   

   

     

   

   

   

      

   

     

   

   

   

   

   

   

   

   

   

   

 

   

   

   

       

   

 

   

       

   

   

   

     

       

     

   

 

   

   

       

         

       

   

 

   

        name="jmeter"

        classpathref="jmeter.classpath"

        classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"/>

 

   

   

   

   

      

      

   

 

   

   

      

      

           

          

           

           

           

           

           

       

   

     

   

       

       

       

            in="D:\apache-jmeter-5.1.1\loadtests\jmeter_result.jtl"

            out="D:\apache-jmeter-5.1.1\loadtests\jmeter_result.html"

            style="${jmeter.home}\extras\jmeter-results-detail-report_21.xsl"/>

   

 

 

 

Jenkins配置

 

你可能感兴趣的:(jmeter)