性能测试班车 | Jmeter基础知识
一. Jmeter简介
Apache Jmeter可以用于对静态和动态资源(文件、 Servlet、Perl脚本、Java对象、数据库和查询、FTP服务器等)的性能进行测试,它可以用于对服务器、网络或对象模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能。测试人员可以使用它做性能图形分析或者测试服务器/脚本/对象在大并发负载下的表现。
1.Jmeter的历史
2.Jmeter远景
随着开发人员利用插件架构的优势,Jmeter的能力迅速扩展。将来开发的主要目标是使得Jmeter尽可能地变成一个有用的衰退测试工具,而无损Jmeter的压力测试能力。
2.1.1 Jmeter主要特点
Jmeter的主要特点包括如下。
1)支持对多种服务类型进行试,包括:
WEB-HTTP、HTTPS
SOAP
Database via JDBC
LDAP
JMS
Mail -POP3(S)and IMAP(S)
2)支持通过录制/回放方式获取测试脚本。
3)具备高可移植性,是100%纯Java程序。
4)采用多线程框架,允许通过多个线程并发取样及通过独立的线程组对不同的功能同时取样。
5)精心设计的GUI支持高速用户操作和精确计时。
6)支持缓存和离线的方式分析/回放测试结果。
7)具备高扩展性,包括:
插拔式的取样器支持无限制扩充测试能力;
提供各种负载统计表和可插拔的计时器;
数据分析和可视化插件提供了很好的扩展性及个性化;
支持通过预置函数为测试提供动态输入数据,以及通过预置函数对测试数据进行操作;
支持用脚本构造采样器(1.9.2及以上版本支持 Beanshell)。
尽管从Web服务或者其他远程服务的角度, Jmeter看上去很像是一款浏览器,但实际上它并不是浏览器,因为它仅支持浏览器的部分操作。例如, Jmeter不会执行HTML页面中包含的JavaScript,而且 Jmeter对于HTML页面的处理方式也与浏览器不同( Jmeter有可能会以HTML方式读取服务器响应,但其所耗时间不会被计算到任何一次采样中)。
2.1.2 Jmeter常用术语
采样器( Samplers):采样器是 Jmeter测试脚本的基础单元,用户可以用它来向服务器发出一个特定的请求,采样器会在超时前等待服务器的响应;
逻辑控制器( Logic Controllers):用户通过逻辑控制器来控 Jmeter测试脚本的执行顺序,以便测试能够按照用户期望的顺序和逻辑执行;
监听器( Listeners):监听器被用来收集测试结果信息,并以用户指定的方式加以展示;
配置元件( Configuration Elements):配置元件被用来设置一些Jmeter测试脚本公用的信息;
断言( Assertions):断言被用来验证服务器实际返回的信息与用户期望的情况是否相符;
定时器( Timers):定时器被用来保存Jmeter测试脚本与时间相关的一些信息,例如思考时间( Think Time);
前置处理器(Pre- Processors):在前置处理器的作用范围内,任何采样器被执行前,都要先执行前置处理器;
后置处理器(Post- Processors):在后置处的作用范围内,任何采样器被执行后,都要执行对应的后置处理器;
测试计划( Test Plan):测试计划是 Jmeter测试脚本的根节点,关于整个测试脚本的一些基础设置,可以在测试计划中设定,例如用户定义变量;
线程组( Thread Group):线程组定义了一个虚拟用户池,其中每一个虚拟用户都使用同样的测试脚本;
工作台( Work Bench);工作台被用来保存暂时不使用的试元素,当测试人员保存测试计划时,工作台中的内容不会被一起保存。
2.1.3 Jmeter测试结果字段的意义
Jmeter测试结果字段的意义如下:
Label:定义HTTP请求名称;
Samples表示这次测试中一共发出了多少个请求;
Average:平均响应时长——默认情况下是单个 Request的平均响应时长,当使用了Transaction Controller时,也可以以Transaction为单位显示平均响应时长;
Median:中位数,也就是50%用户的响应时长;
90% Line:90%用户的响应时长;
Min:访问页面的最小响应时长;
Max:访问页面的最大响应时长;
Error%:错误请求的数量/请求的总数;
Throughput:默认情况下表示每秒完成的请求数( Request per Second),当使用了Transaction Controller时,也可以表示类似 Loadrunner的 Transaction per Second数;
KB/Sec:每秒从服务器端接收到的数据量。
二.Jmeter工作原理
三.Jmeter 的安装与目录结构
1.Jmeter安装配置要求
1.1 Java版本
1.2操作系统
UNIX (Solaris, Linux 等)
Windows(98,NT,XP,7,10等)
OpenVMS Alpha 7. 3+
2.Jmeter目录结构
2.1 bin目录
在 Windows操作系统下,运行 Jmeter.bat就可以看到 Jmeter的 Swing GUI客户端,如下图所示:
Jmeter图形用户界面简洁而实用,用户可以通过它来完成各种测试所需的配置。
需要注意的是, Jmeter用户可以根据运行JMeter的计算机配置,来适当调整 Jmeter.bat中的JVM调优设置,如下所示:
set HEAP=-Xms512m -Xmx512m
set NEW=-XX: Newsize=128m -XX: MaxNewSize=128m
set SURVIVOR=-XX:SurvivorRatio=8 -xx:TargetSurvivorratio=50%
set TENURING=-XX: Maxtenuringthreshold=2
set EVACUATION=-XX: Maxliveobiectevacuationratio=20%
set RMIGC=-Dsun,.rmi.dge.client. gcinterva1=600000
-Dsun.rmi,.dgc.server.gcinterval=600000
set PERM=-XX: PermSize=64m -xx: MaxPermSize=64m
rem set DEBUG=-verbose: ge -XX: +PrintTenuringDistribution
log_level. jmeter=INFO
log_level.jmeter.Junit=DEBUG
log_level.jmeter.control=DEBUG
log_level.jmeter.testbeans=DEBUG
log_level.jmeter.engine=DEBUG
log_level. jmeter.threads=DEBUG
log_level. jmeter.gui=WARN
log_level. jmeter.testelement=DEBUG
log_level. jmeter.util=WARN
log_level. jmeter.util.classfander=WARN
log_level. jmeter.test=DEBUG
log_level. jmeter.protocol.http=DEBUG
2.2 docs和 printable_docs目录
2.3 extras目录
2.4 lib目录
四.如何运行 Jmeter
Jmeter.bat运行Jmeter(默认GUI模式);
Jmeter-n.cmd:加载一个JMX文件,并在非GUI模式下运行;
Jmeter- n-r. cmd:加载一个JMX文件,并在远程非GUI模式下运行;
jmcter-t cmd:加载一个JMX文件,并在GUI模式下运行;
Jmeter-server.bat:以服务器模式启动JMeter;
mirror-server.cmd:在非GU模式下启动Jmeter镜像服务器;
shutdown.cmd:关闭一个非GUI实例(优雅的) ‘;
stoutest.cmd:停止一个非GUI实例(中断式的)。
set JVM_ARGS="-Xms1024m -Xmx1024m -Dpropname-propvalue" jmeter -t test.jmx ...
jmeter:运行 Jmeter(默认GUI模式)。定义了一些JVM设置,但并不是对所有JVM都生效;
jmeter-servet:以服务器模式启动Jmeter(通过合适的参数来调用 jmeter脚本) ;
jmeter.sh:没有指定JVM选项的非常基础的 Jmeter脚本;
jmeter- server. sh:在非GUI模式下启动Jmeter镜像服务器;
shutdown. sh关闭一个非GU实例(优雅的);
stoutest.sh:停止一个非GU实例(中断式的)
1.Jmeter的 Classpath
JMETER_HOME/lib:公用包;
JMETER_HOME/lib/ext:包含 Jmeter元件和补丁。
2.使用代理服务器
-P[代理服务器端口]
-N[不使用代理的主机](例如*.apache. .org localhost)
-u[代理验证的用户名——如果要求的话]
-a[代理验证的密码如果求的话]
3.非GUI模式(命令行模式)
-n指明JMeter以非GUI模式运行
-t[JMX文件(其中包含测试计划)的名称]
-l[JTL文件(存放测试结果采样数据)的名称]
-j[ Jmeter日志文件的名称]
-r 在 Jmeter属性“ remote_ hosts”中定义的服务器上远程运行测试脚本
-R[远程服务器列表]在指定的远程服务器上运行测试
-P[代理服务器端口号]
4.服务器模式
-P[代理服务器端口号]
-G 被用来定义要在服务器中设置的 Jmeter属性
-Z 意味着在测试结果后退出服务器。
- Rserverl.server2-可以用来代替-r,该选项会指定一系列远程服务器,但并不会重新定义 remote_hosts这一属性。
5.通过命令行重置 Jmeter属性
- D[prop_name]=[ value]:定义一个Java系统属性值
-J[Prop_name]=[ value:定义一个本地 Jmeter属性
-G[prop_name]=[value]:定义一个 Jmeter属性,并发往所有远程服务器
-G[propertyfile]:定义一个文件,其中包含有 Jmeter属性,并将该文件发往所有远程服务器
-L[category]=[priority]:重置一个日志设置,对特定类型的日志设定优先级例子
Jmeter -Duser. dir-/home/mstover/Jmeter_stuff \
-Jmeter_hosts=127.0.0.1-L jmeter.engine=DEBUG
jmeter -LDEBUG
6.日志和错误信息
7.全部命令行选项列表
-h, --help
print usage information and exit
-v, --version
print the version information and exit
-p, --propfile {argument}
the jmeter property file to use
-q, --addprop {arqument}
additional property file(s)
-t, --testfile {argument}
the jmeter test(.jmx) file to run
-j, --jmeterlogfile {argument}
the jmeter log file
-l, --log file {argument}
the file to log samples to
-n, --nongui
run Jmeter in nongui mode
-s, -- server
run the Jmeter server
-H, --proxyHost {argument}
Set a proxy server for Jmeter to use
-P, --proxyport {arqument}
Set proxy server port for Jmeter to use
-u,--username {argument}
set username for proxy server that Jmeter is to use
-a,--password {argument}
Set password for proxy server that Jmeter is to use
-J, --jmeterproperty {argument}={value}
Define additional jmeter properties
-G, --globalproperty {argument}={value}
Define Global properties (sent to servers)
e.g. -Gport=123
or -Global.properties
- D, --systemproperty {argument}={value}
Define additional System properties
-S, --systempropertyFile {filename}
a property file to be added as System properties
-L, --loglevel {argument}={value}
Define loglevel:[category=]level
e.g. jorhan = INFO or jmeter. util = DEBUG
-r, --runremote (non-GUI only)
Start remote servers (as defined by the jmeter property remote_hosts)
-R, --remotestart serverl,.,(non-GUI only)
Start these remote servers (overrides remote_hosts)
-d, --homedir {argument}
the Jmeter home directory to use
-X, -- remoterit
Exit the remote servers at end of test (non-GUI)
五.配置Jmeter
属性 |
描述 |
是否必须 |
ssl.provider |
|
否 |
xml.parser |
|
否 |
remote_hosts |
|
否 |
not_in_menu |
|
否 |
search_paths |
|
否 |
user.classpath |
|
否 |
user.properties |
|
否 |
system.properties |
|
否 |
六. Jmeter与 Loadrunner优缺点对比
Jmeter的架构跟LoadRunner原理一样,都是通过中间代理,监控&收集并发客户端发现的指令,把他们生成脚本,再发送到应用服务器,再监控服务器反馈的结果的一个过程;
分布式中间代理功能在Jmeter中也有,这个分布式分理是指可设置多台代理在不同PC中,通过远程进行控制,即通过使用多台机器运行所谓的Agent来分担LoadGenerator自身的压力,并借此来获取更大的并发用户数.LoadRunner也有些功能;
Jmeter安装简单,只需要解压Jmeter文件包到C盘上就可以了,其实是没有安装.要是你想执行调试测试脚本,前提是:装上jdk和netbean插件.而LoadRunner安装包有1G多,在一台P3.0,1G内存的PC上安装要一个多小时.要是装过较旧的盗版还不能再装新版,解决办法倒是有,但麻烦且花时间;
Jmeter也提供了一个利用本地ProxyServer(代理服务器)来录制生成测试脚本的功能,但是这个功能并不好用,测试对象的个别参数却要手工增加上去,还得附带装个IE代理,如GoogleToolbarDownloader这些插件来捕捉参数.但是有一个工具bodboy,利用这个工具可以录制操作,然后选择将脚本保存为Jmeter脚本,然后利用Jmeter可以打开并修改脚本;
Jmeter的报表较少,对于要分析测试性能不足以作为依据.如要知道数据库服务器或应用程序服务的CPU,memory等参数,得在相关服务器上另外写脚本记录服务器的性能;
Jmeter做性能测试,主要是通过增加线程组的数目,或者是设置循环次数来增加并发用户,而LoadRunner可以通过在场景中选择要设置什么样的场景,然后选择虚拟用户数;
Jmeter可以通过逻辑控制器实现复杂的测试行为,相当于LoadRunner中的测试场景;
Jmeter可以做web程序的功能测试,利用Jmeter中的样本,可以做灰盒测试,LoadRunner主要用作性能测试;
Jmeter是开源的,但是使用的人较少,网络上相关资料不全面,需要自己去揣摩,而LoadRunner是商业软件,如果是正版,有技术支持,同时,网络上的资料相当多;
Jmeter的脚本修改,主要是对Jmeter中各个部件的熟悉程度,以及相关的一些协议的掌握情况,而不依赖于编程,而LoadRunner除了复杂的场景设置外,还需要掌握函数,修改脚本;
本次介绍总结如下: