1. JMeter 测试计划
测试计划
使用 JMeter 进行测试的起点,是其它 JMeter 测试元件的容器。
线程组
代表一定数量的并发用户,它可以用来模拟并发用户发送请求。实际的请求内容在Sampler中定义,它被线程组包含。可以在“测试计划->添加->线程组”来建立它,然后在线程组面板里有几个输入栏:线程数、Ramp-Up Period(in seconds)、循环次数,其中Ramp-Up Period(in seconds)表示在这时间内创建完所有的线程。如有8个线程,Ramp-Up = 200秒,那么线程的启动时间间隔为200/8=25秒,这样的好处是:一开始不会对服务器有太大的负载。线程组是为模拟并发负载而设计。
取样器(Sampler)
模拟各种请求。所有实际的测试任务都由取样器承担,存在很多种请求。如:HTTP 、ftp请求等等。
监听器
负责收集测试结果,同时也被告知了结果显示的方式。功能是对取样器的请求结果显示、统计一些数据(吞吐量、KB/S……)等。
断言
用于来判断请求响应的结果是否如用户所期望,是否正确。它可以用来隔离问题域,即在确保功能正确的前提下执行压力测试。这个限制对于有效的测试是非常有用的。
定时器
负责定义请求(线程)之间的延迟间隔,模拟对服务器的连续请求。
逻辑控制器
允许自定义JMeter发送请求的行为逻辑,它与Sampler结合使用可以模拟复杂的请求序列。
配置元件
维护Sampler需要的配置信息,并根据实际的需要会修改请求的内容。
前置处理器和后置处理器
负责在生成请求之前和之后完成工作。前置处理器常常用来修改请求的设置,后置处理器则常常用来处理响应的数据。
2. 聚合报告
聚合报告(Aggregate Report) 是 JMeter 常用的一个 监听器。对聚合报告各项数据栏的理解如下:
Label
每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值
#Samples
表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100
Average
平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以Transaction 为单位显示平均响应时间
Median
中位数,也就是 50% 用户的响应时间
90% Line
90% 用户的响应时间
----------------------------------------------------------另一种说法
90% Line - 90% of the samples took no more than this time. The remaining samples at least as long as this.
“ 90% 的样品没有超过这个时间,剩余的样品至少只要这个。”(拿google翻译的)
没太理解是什么意思,于是,点击详细解释。
90% Line (90 th Percentile) is the value below which 90% of the samples fall. The remaining samples too at least as long as the value. This is a standard statistical measure. See, for example: Percentile entry at Wikipedia.
英语太差,还是没理解到底啥意思,不过最后提示我,用*查一下什么是百分位数。
百分位数:统计学术语,如果将一组数据从大到小排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。可表示为:一组n个观测值按数值大小排列如,处于p%位置的值称第p百分位数。
假如:
有10个数:
1、2、3、4、5、6、7、8、9、10 按由大到小将其排列。
求它的第90%百分位,也就是第9个数刚好是9 ,那么他的90%Line 就是9 。
另一组数:
2、2.1、2.5、3、3.4、3.4、4、4、4、4、5、5、5、5.9、5.91、6.8、8、12、24、24.1 按由大到小将其排列。
求它的第90%百分位,第18个数是12 么,他的90%Line 就是12。
再来解释90%Line
一组数由小到大进行排列,找到他的第90%个数(假如是12),那么这个数组中有90%的数将小于等于12 。
用在性能测试的响应时间也将非常有意义,也就是90%请求响应时间不会超过12 秒。
原创地址:http://www.cnblogs.com/fnng/archive/2013/02/26/2934317.html
----------------------------------------------------------另一种说法-----end
Note
关于 50% 和 90% 并发用户数的含义,请参考下文
http://www.cnblogs.com/jackei/archive/2006/11/11/557972.html
Min
最小响应时间
Max
最大响应时间
Error%
本次测试中出现错误的请求的数量/请求的总数
Throughput(吞吐量)
默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数
KB/Sec
每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec
3. 图形结果分析参数解析
样本数目
总共发送到服务器的请求数。
最新样本
代表时间的数字,是服务器响应最后一个请求的时间。
吞吐量
服务器每分钟处理的请求数。
平均值
总运行时间除以发送到服务器的请求数。
中间值
代表时间的数字,有一半的服务器响应时间低于该值而另一半高于该值。
偏离
服务器响应时间变化、离散程度测量值的大小,或者,换句话说,就是数据的分布。
4. Http请求的配置参数
名称
本属性用于标识一个取样器,建议使用一个有意义的名称。
注释
对于测试没有任何作用,仅用户记录用户可读的注释信息。
服务器名称或IP
HTTP请求发送的目标服务器名称或IP地址。
端口号
目标服务器的端口号,默认值为80 。
协议
向目标服务器发送HTTP请求时的协议,可以是http或者是https ,默认值为http 。
方法
发送HTTP请求的方法,可用方法包括GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等。
Content encoding
内容的编码方式,默认值为iso8859
路径
目标URL路径(不包括服务器地址和端口)
自动重定向
如果选中该选项,当发送HTTP请求后得到的响应是302/301时,JMeter 自动重定向到新的页面。
Use keep Alive
当该选项被选中时,jmeter 和目标服务器之间使用 Keep-Alive方式进行HTTP通信,默认选中。
Use multipart/from-data for HTTP POST
当发送HTTP POST 请求时,使用Use multipart/from-data方法发送,默认不选中。
同请求一起发送参数
在请求中发送URL参数,对于带参数的URL ,jmeter提供了一个简单的对参数化的方法。用户可以将URL中所有参数设置在本表中,表中的每一行是一个参数值对(对应RUL中的 名称1=值1)。
同请求一起发送文件
在请求中发送文件,通常,HTTP文件上传行为可以通过这种方式模拟。
从HTML文件获取所有有内含的资源
当该选项被选中时,jmeter在发出HTTP请求并获得响应的HTML文件内容后,还对该HTML进行Parse 并获取HTML中包含的所有资源(图片、flash等),默认不选中,如果用户只希望获取页面中的特定资源,可以在下方的Embedded URLs must match 文本框中填入需要下载的特定资源表达式,这样,只有能匹配指定正则表达式的URL指向资源会被下载。
用作监视器
此取样器被当成监视器,在Monitor Results Listener 中可以直接看到基于该取样器的图形化统计信息。默认为不选中。
Save response as MD5 hash
选中该项,在执行时仅记录服务端响应数据的MD5值,而不记录完整的响应数据。在需要进行数据量非常大的测试时,建议选中该项以减少取样器记录响应数据的开销。
5. Constant Throughput Timer 的主要属性
名称
定时器的名称
Target throughput(in samples per minute)
目标吞吐量。注意这里是每分钟发送的请求数。
Calculate Throughput based on
有5个选项,分别是:
This thread only :控制每个线程的吞吐量,选择这种模式时,总的吞吐量为设置的 target Throughput 乘以线程的数量。
All active threads : 设置的target Throughput 将分配在每个活跃线程上,每个活跃线程在上一次运行结束后等待合理的时间后再次运行。活跃线程指同一时刻同时运行的线程。
All active threads in current thread group :设置的target Throughput将分配在当前线程组的每一个活跃线程上,当测试计划中只有一个线程组时,该选项和All active threads选项的效果完全相同。
All active threads (shared ):与All active threads 的选项基本相同,唯一的区别是,每个活跃线程都会在所有活跃线程上一次运行结束后等待合理的时间后再次运行。
All active threads in current thread group (shared ):与All active threads in current thread group 基本相同,唯一的区别是,每个活跃线程都会在所有活跃线程的上一次运行结束后等待合理的时间后再次运行。
6. JMeter常见问题
1. JMeter的工作原理是什么?
向服务器提交请求;从服务器取回请求返回的结果。
2. JMeter的作用?
JMeter可以用于测试静态或者动态资源的性能(文件、Servlets、Perl脚本、java对象、数据库和查询、ftp服务器或者其他的资源)。JMeter用于模拟在服务器、网络或者其他对象上附加高负载以测试他们提供服务的受压能力,或者分析他们提供的服务在不同负载条件下的总性能情况。你可以用JMeter提供的图形化界面分析性能指标或者在高负载情况下测试服务器/脚本/对象的行为。
3. 怎样能看到jmeter提供的脚本范例?
在\JMeter\jakarta-jmeter-2.0.3\xdocs\demos目录下。
4. 怎样设置并发用户数?
选中可视化界面中左边树的Test Plan节点,单击右键,选择Add-> Thread Group,其中Number of Threads参数用来设置发送请求的用户数目。
5. JMeter的运行指示?
Jmeter在运行时,右上角有个单选框大小的小框框,运行是该框框为绿色,运行完毕后,该框框为白色。
6. User Parameters的作用是什么?
提高脚本可用性
7. 在result里会出现彩色字体的http response code,说明什么呢?
Http response code是http返回值,彩色字体较引人注目,可以使用户迅速关注。象绿色的302就说明在这一步骤中,返回值取自本机的catch,而不是server。
8. 怎样计算Ramp-up period时间?
Ramp-up period是指每个请求发生的总时间间隔,单位是秒。如果Number of Threads设置为5,而Ramp-up period是10,那么每个请求之间的间隔就是10/5,也就是2秒。Ramp-up period设置为0,就是同时并发请求。
9. Get和Post的区别?
他们是http协议的2种不同实现方式。Get是指server从Request URL取得所需参数。从result中的request中可以看到,get可以看到参数,但是post是主动向server发送参数,所以一般看不到这些参数的。
10. 哪些原因可能导致error的产生?
a. Http错误,包括不响应,结果找不到,数据错误等等;
b. JMeter本身原因产生的错误。
11. 为什么Aggregate Report结果中的Total值不是真正的总和?
JMeter给结果中total的定义是并不完全指总和,为了方便使用,它的值表现了所在列的代表值,比如min值,它的total就是所在列的最小值。下图就是total在各列所表示的意思。
12. JMeter的Thread Number是提供多个不同用户并发的功能么?
不是,Thread Number仅仅是指并发数,如果需要实现多个不同用户并发,我们应该采用其它方法,比如通过在jmeter外建立csv文件的方法来实现。
13. 同时并发请求时,若需要模拟不同的用户同时向不同的server并发请求,怎样实现呢?
方法很灵活,我们可以将不同的server在thread里面预先写好。或者预先将固定的变量值写入csv文件,这样还可以方便修改。然后将文件添加到User Parameters。
14. User Parameter中的DUMMY是什么意思?
当其具体内容是${__CSVRead(${__property(user.dir)}${FILENAME},next())}时用来模拟读文件的下一行。
15. 当测试对象在多server间跳转时,应该怎样处理?
程序运行时,有些http和隐函数会携带另外的server IP,我们可以从他们的返回值中获取。
16. 为何测试对象是http和https混杂出现?
Https是加密协议,为了安全,一般不推荐使用http,但是有些地方,使用https过于复杂或者较难实现,会采用http协议。
17. Http和https的默认端口是什么?
Apache server (Http)的默认端口是80;
SSL (Https)的默认端口是443。
18. 为何在run时,有些页面失败,但是最后不影响结果?
原因较多,值得提及的一种是因为主流页面与它不存在依赖关系,所以即使这样的页面出错,也不会影响运行得到正常结果,但是这样会影响到测试的结果以及分析结果。
19. 为什么脚本刚开始运行就有错误,其后来的脚本还可运行?
在Thread Group中有相关设置,如果选择了continue,即使前面的脚本出现错误,整个thread仍会运行直到结束。选择Stop Thread会结束当前thread;选择Stop Test则会结束全部的thread。推荐选项是Stop Thread。
20. 在Regular expression_r Extractor会看到Template的值是$1$,这个值是什么意思呢?
$1$是指取第一个()里面的值。如果Regular expression_r的数值有多个,用这种方法可以避免不必要的麻烦。
21. Regular expression_r中的(.*)是什么意思?
那是一个正则表达式(regular expression_r)。’.’等同于sql语言中的’?’,表示可有可无。’*’表示0个或多个。’()’表示需要取值。(.*)表达任意长度的字符串。
22. 在读取Regular expression_r时要注意什么?
一定要保证所取数值的绝对唯一性。
23. 怎样才能判断什么样的情况需要添加Regular expression_r Extractor?\
检查Http Request中的Send Parameters,如果有某个参数是其前一个page中所没有给出的,就要到原文件中查找,并添加Regular expression_r Extractor到其前一page的http request中。
24. 在自动获取的脚本中有时会出现空的http request,是什么意思呢?
是因为在获取脚本时有些错误,是脚本工具原因。在run时这种错误不参与运行的。
25. 在运行结果中为何有rate为N/A的情况出现?
可能因为JMeter自身问题造成,再次运行可以得到正确结果。
26. 常用http错误代码有哪些?
400 无法解析此请求。
403 禁止访问:访问被拒绝。
404 找不到文件或目录。
405 用于访问该页的HTTP动作未被许可。
410 文件已删除。
500 服务器内部错误。
501 标题值指定的配置没有执行。
502 Web服务器作为网关或代理服务器时收到无效的响应。
27. Http request中的Send Parameters是指什么?
是指code中写定的值和自定义变量中得到的值,就是在运行页面时需要的参数。
28. Parameters在页面中是不断传递的么?
是的。参数再产生后会在页面中一直传递到所需页面。所以我们可以在动态参数产生时捕获它,也可以在所需页面的上一页面捕获。(但是这样可能有错误,最好在产生页面获取)
29. 在使用JMeter测试时,是完全模拟用户操作么?造成的结果也和用户操作完全相同么?
是的。JMeter完全模拟用户操作,所以操作记录会全部写入DB.在运行失败时,可能会产生错误数据,这就取决于脚本检查是否严谨,否则错误数据也会进入DB,给程序运行带来很多麻烦。
30. 制作测试脚本
手工制作测试脚本,需要你知道请求的url和携带的参数等等,太花费时间,所以可以用badboy工具录制脚本。这个工具虽然不是开源的,但是却可以用来免费的录制成.jmx的脚本,使用起来很方便。官方网站是:http://www.badboy.com.au/
31. 出现乱码了?
在用JMeter发行HTTPRequest时,在请求参数中有中文时,发现存储到DB中后,相应的字段是乱码,明明在参数后面的Encode选项中打了V。后来发现badboy录制脚本的时候并没有记录编码方式,所以修改脚本,在Content encoding中设置正确的编码方式就不会出现乱码了。
32. JMeter的妙用---准备测试数据
要求性能测试开始前,先准备5W条数据。当然可以通过直接修改DB,但是如果这5W条数据涉及到很多表的关联,甚至还要通过存储过程的处理怎么办,直接修改DB很容易出现错误的数据,要是在客户的机器上弄错,可就闯祸了。这时候想到了JMeter,它本来是用来模拟大量用户并发请求的,现在用它来批量的生成数据吧。如果要求每条数据都不同,就要修改脚本,使用JMeter的函数来动态产生数据,比较常用的是CSVRead函数,记不住名的话Ctrl+F可以呼唤出函数助手。使用这个函数的时候需要注意几点,首先是csv文件的编码格式,使用ansi没有问题,使用unicode时会使读取的第一行数据出现错误;${__CSVRead(data.txt,0)}---读取本行的第一列值 ${__CSVRead(data.txt,1)}${__CSVRead(data.txt,next)}---读取本行的第二列值,并把行标移动到下一行试验证明JMeter应该做好了同步,在多线程环境下上面的调用方法没有问题;最后,修改JMeter的线程数会加快数据生成的速度,原理是当并发线程在20左右的时候会达到最大的吞吐量(request/分),
所以应该设定线程数20左右。
33. JMeter中debug方法
JMeter提供了log函数输出log,但是有时候并不好用,比如我想输出某个函数的返回值看是不是正确的,${__log(${__CSVRead(data.txt,1)})}这样的写法是错误的,JMeter会抛出异常,该怎么办呢?答案是巧用监听器(Listener)来输出想看到的数据,结果显示为树的那个监听器,它可以让你查看每个sampler的请求数据和响应数据,在请求数据中就有你想看到的信息。
34. 常用的功能
使用HTTP Cookie Manager或URL重写实现同一线程内的多个请求共享Session。
把Login的请求放到只执行一次的控制器中,那么即使循环多次,Login也只请求一次。如果想让多个线程在同一时刻同时请求,那么用Synchronizing Timer来做集合点。为了节省系统资源,使用非窗口模式运行JMeter(jmeter -n -t test.jmx)如果模拟并发用户过多,比如200线程,那么可以分散到多台机器上运行Jmeter(比如4台电脑,每台50线程)
更多功能请参照使用手册。
中文手册(未完成)http://wiki.javascud.org/pages/viewpage.action?pageId=5566
35. 在winnt系统上,使用perfmon来帮助Jmeter采集服务器的系统资源数据,可以配置log输出这些数据作为性能瓶颈分析时使用。
36. 置信区间
对数据进行更科学的分析,确定测试结果。类似于Jmeter聚合报告的90% Line给出的参考,而不能仅仅参考均值。
7. 工作中对“营销活动管理系统”做的一次压力测试结果分析
*****************************************************************************************************************************
前言
*****************************************************************************************************************************
1、测试过程中页面响应时间与测试结果不一致。具体来说就是,操作过程中页面响应时间过长,而测试结果却显示很短;
2、偏离值随着测试样本的增加而减小(并发较小,测试模块单一的情况下);
3、测试样本数分别为:5、10、15、20、50、100、150、200;
4、测试结果着重看Average和吞吐量(是否达到峰值应该具体参考服务器和系统的功能与非功能需求等酌情考虑);
5、ITSP门户测试时,Average要求在1.5s以下;
6、测试过程中经常出现运行脚本错误的情况,一般在测试结果里不会看到;
*****************************************************************************************************************************
名词解释
*****************************************************************************************************************************
1、吞吐量:可以理解为服务器每分钟处理的请求数量;吞吐率代表着单位时间内所能承受的压力,是测试中一个重要的指标。
通过比较吞吐量,可以发现系统的运行状态。当随着并发数增加时,吞吐率是不断增加的,当达到一个服务器极限后,再增加并发数,
吞吐率会急速下降,直至服务器崩溃。所以当达到临界点(吞吐量最高点,负载和处理均衡时)为最大吞吐率,是系统在运行下的一
个理想阈值范围。
2、Average:平均响应时间。默认情况下是单个 Request 的平均响应时间;
3、#Samples:表示本次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100;
4、Average:平均响应时间——默认情况下是单个 Request 的平均响应时间;
5、Median:中位数,也就是 50% 用户的响应时间;
6、90% Line:90% 用户的响应时间
7、Min:最小响应时间;
8、Max:最大响应时间;
9、Error%:本次测试中出现错误的请求的数量/请求的总数;
11、KB/Sec:每秒从服务器端接收到的数据量;
12、偏离: 服务器响应时间变化、离散程度测量值的大小,或者,换句话说,就是数据的分布。
********************************************************************************************************************************
部分计算公式
********************************************************************************************************************************
1、 吞吐量=完成的请求数/完成这些请求数所需要的时间;
2、 平均响应时间=所有响应时间的总和/完成的请求数;
3、 失败率=失败的个数/总数数;
4、 时间的计算方法是:通过timeStamp时间戳(发出的起始时间)相减而得
********************************************************************************************************************************
测试过程中的异常情况
********************************************************************************************************************************
****登录测试****
1、页面出现Error(Scripting Error: 语法错误 : line 1 char 1),测试结果出现Error,错误率33.33%;
2、200个并发时,Average达到1000ms左右;
****注销测试****
1、Average在15个并发时急速提升至140ms左右,而5和10个并发时都是8ms左右;
2、200个并发时,Average达到132ms;
****修改密码测试****
1、200个并发时,Average达到7ms;
****订单转化率测试****
1、70个并发时,Average达到1000ms左右;
2、100个并发时,Average达到1800ms左右;
3、150个并发时,Average达到3300ms左右,偏离值(1246)超过样本数(1200);
4、200个并发时,Average达到5000ms左右;
****公共标签墙测试****
1、70个并发时,Average达到1200ms左右;
2、100个并发时,Average达到1700ms左右;
3、150个并发时,Average达到3500ms左右;
4、200个并发时,Average达到5300ms左右;
****公共管理测试****
1、50个并发时,Average达到1200ms左右;
2、70个并发时,Average达到1600ms左右;
3、100个并发时,Average达到2500ms左右;
4、150个并发时,Average达到4000ms左右;
5、200个并发时,Average达到5700ms左右;
********************************************************************************************************************************
********************************************************************************************************************************
测试结果:
1、综合分析Average初步得出系统合适的并发数为70个并发以下。
2、详细结果见“图形分析”和聚合报告。
********************************************************************************************************************************
********************************************************************************************************************************
参考网站
[1]http://www.51testing.com/?uid-128005-action-viewspace-itemid-84094;
[2] http://www.51testing.com/html/28/116228-238479.html;
[3] http://www.javaeye.com/topic/211216;
[4] http://dev2dev.bea.com.cn/techdoc/20060912878.html;
[5]http://www.cnblogs.com/jackei/archive/2006/11/11/557972.html;