jmeter教程

1 Jmeter安装配置

使用Jmeter前首先要安装JDK,配置JDK环境变量。Jmeter不需要安装,下载后解压即可使用。
Jmeter下载地址:http://jmeter.apache.org/download_jmeter.cgi
另外还需要安装脚本录制工具badboy。

2 Jmeter的基本使用

解压后,双击解压目录bin下的jmeter.bat启动Jmeter。

2.1 添加线程组

jmeter教程_第1张图片

jmeter教程_第2张图片

一个性能测试请求负载是基于一个线程组完成的。一个测试计划必须有一个线程组。测试计划添加线程组非常简单。在测试计划右键弹出下拉菜单(添加-->Threads(Users)--->线程组)中选择线程组即可。

线程组主要包含三个参数:线程数、准备时长(Ramp-Up Period(in seconds))、循环次数。
线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里也就是设置多少个线程数。
准备时长: 设置的虚拟用户数需要多长时间全部启动。如果线程数为20 ,准备时长为10 ,那么需要10秒钟启动20个线程。也就是每秒钟启动2个线程。
循环次数:每个线程发送请求的次数。如果线程数为20,循环次数为100 ,那么每个线程发送100次请求。总请求数为20*100=2000。如果勾选了“永远”,那么所有线程会一直发送请求,一到选择停止运行脚本。

设置合理的线程数对于能否达到测试目标有决定性的影响。在本例中,要求得到网站首页在20 QPS 负载情况下的响应时间,如果如果线程数量设置的过小,则很可能无法达到设定的QPS要求。另外,设置合理的循环次数也很重要,除了上面介绍的固定循环次数与永远外;也可以灵活的选择设定测试运行时间。勾选“调度器”,进行调度器配置。

2.2 添加HTTP请求

添加完成线程组后,在线程组上右键菜单(添加--->Sampler--->HTTP请求)选择HTTP请求。对于jmeter来说,取样器(Sampler)是与服务器进行交互的单元。一个取样器通常进行三部分的工作:

  1. 向服务器发送请求
  2. 记录服务器的响应数据
  3. 记录相应时间信息


    jmeter教程_第3张图片

    jmeter教程_第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值,而不记录完整的响应数据。在需要进行数据量非常大的测试时,建议选中该项以减少取样器记录响应数据的开销。

2.3 设置定时器

Jmeter提供了一个非常有用的定时器,称为Constant Throughput Timer (常数吞吐量定时器),该定时器可以方便地控制给定的取样器发送请求的吞吐量。
右键点击新建的取样器(如HTTP请求) ,弹出菜单(添加--->定时器--->Constant Throughput Timer)选择Constant Throughput Timer

Constant Throughput Timer 的主要属性介绍:
名称 :定时器的名称
Target throughput(in samples per minute):目标吞吐量。注意这里是每分钟发送的请求数,因此,对应测试需求中所要求的20 QPS ,这里的值应该是1200 。
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 cative threads in current thread group (shared ):与All active threads in current thread group 基本相同,唯一的区别是,每个活跃线程都会在所有活跃线程的上一次运行结束后等待合理的时间后再次运行。
如上图,该元件仅作用于fnng.cnblogs.com ,设置定时器的Target throughput为1200/分钟(20 QPS),设置Calculate Throughput based on 的值为All active threads 。
当然,Constant Throughput Timer只有在线程组中的线程产生足够多的request 的情况下才有意义,因此,即使设置了Constant Throughput Timer的值,也可能由于线程组中的线程数量不够,或是定时器设置不合理等原因导致总体的QPS不能达到预期目标。

2.4 添加监听器

脚本的主要部分设置完成后,需要通过某种方式获得性能测试中的测试结果,在本例中,我们关心的是请求的响应时间。
Jmeter 中使用监听器元件收集取样器记录的数据并以可视化的方式来呈现。Jmeter有各种不同的监听器类型,因为上HTTP请求,我们可在添加聚合报告,更为直观的查看测试结果。
添加聚合报告,右键点击取样器(如HTTP请求),在弹的菜单(添加--->监听器--->聚合报告)中选择聚合报告。

图表含义说明如下:
Label:说明是请求类型,如Http,FTP等请求。

Samples:也就是图形报表中的样本数目,总共发送到服务器的样本数目。

Average:也就是图形报表中的平均值,是总运行时间除以发送到服务器的请求数。
Median:也就是图形报表中的中间值,是代表时间的数字,有一半的服务器响应时间低于该值而另一半高于该值。
90%line:是指90%请求的响应时间比所得数值还要小。
Min:是代表时间的数字,是服务器响应的最短时间。
Max: 是代表时间的数字,是服务器响应的最长时间。
Error%:请求的错误百分比。
Throughput:也就是图形报表中的吞吐量,这里是服务器每单位时间处理的请求数,注意查看是秒或是分钟。
KB/sec:是每秒钟请求的字节数。
用表格查看结果

各属性如下:
Sample:每个请求的序号
Start Time:每个请求开始时间
Thread Name:每个线程的名称
Label:Http请求名称
Sample Time:每个请求所花时间,单位毫秒
Status:请求状态,如果为勾则表示成功,如果为叉表示失败。
Bytes:请求的字节数
如果Status为叉,那很显然请求是失败了,但如果是勾,也并不能认为请求就一定完全成功了,因为还得看Bytes的字节数是否是所请求网页的正常大小值,如果不是则说明发生了丢包现象,也不是完全成功。
在下面还有几个参数
样本数目:也就是上面所说的请求个数,成功的情况下等于你设定的并发数目乘以循环次数。
平均:每个线程请求的平均时间
最新样本:表示服务器响应最后一个请求的时间
偏离:服务器响应时间变化、离散程度测量值的大小,或者,换句话说,就是数据的分布(这个我不是很理解)。
2.5 使用分析
在测试过程中,平均响应时间是我们性能测试的一个重要衡量指标,但是在测试中,特别是在聚合报告中,得出的90%Line,我这里参考《《LoadRunner 没有告诉你的》之一——描述性统计与性能结果分析》,我认为90%Line等同于该文作者提出的90%响应时间,这个数值对我们性能测试分析也很有参考价值。90%响应时间是说在发送的请求中,90%的用户响应时间都比得到的数值上要短,同时说明,一个系统在应用时,90%的用户响应时间都能达到这个数值,那么就为系统性能分析提供了很好的参考价值。
3 badboy基本使用
启动Badboy工具,进入Badboy安装目录下双击badboy.exe。下图是Badboy主界面。

以登陆百度为例录制脚本,输入百度网址后敲回车,即进入百度界面。

登陆百度。

登陆成功后进入个人用户界面。

将录制脚本导出为jmx格式。
点击File→Export to JMeter...→另存为"百度登陆.jmx"→保存。

4 添加事务控制器
你肯定知道, jmeter是一个跨系统平台的性能测试工具, 比如他可以在linux,freebsd,windows,solaris 等等各种系统上可以运行. 我可以说, 事务 transaction controller 控制器是jmeter作性能测试中最重要的. 让我来分享一些关于事物控制器的经验吧.
如果你看了录制jmeter脚本那一章, 你会知道jmeter会录制很多的子请求. 比如当打开首页后, 会继续打开图片, css等资源文件. 通常我们会剔除掉这些子请求, 但如果我需要衡量打开一个页面(包含所有子请求) 到底的性能, 请求时间如何时, 我们会计算包含所有子请求的数据. 这时我们必须使用事物控制器. ( 当然除了这种情况, 在进行api的测试时, 通常也需要事物控制器, 例如 假设api1 获取tgt, api2根据tgt 获取st, 假设该openauth 登陆的过程, 我们将这2步api的调用, 看做一次登陆成功. 那么我们需要将这2步操作,看为一个事务) .
让我们直接来看一个例子吧.

如上图, 有2个主要的http请求. 1个是主页请求, 主页请求又包含了4个子请求. 另外一个主请求是faq页面.
我添加了一个事务控制器(transaction controller), 将主页及其四个子请求都放在了该事务控制器下.
我进行了一次测试,看下聚合报告里的内容.

你可以看到一个事务控制器的标签. 这个事务器则包含了(Home Page, .jpg request, .gif request, .png request, .js request) 这几个请求. 虽然我们把这几个请求的数据相加,可以得到类似于该控制器的数据. 但仅仅是相似而已.
事务控制器中的声称父sample(采样)的标志位的含义.
如果选中了该标志位, 则你不会看到事务控制器包含的所有子元素.

这时候, 再跑一次测试, 你再看聚合报告的时候, 会发现,我们只能看到"事务控制器" 和 FAQ 页面的测试报告数据了.
5 Jmeter设置检查点
5.1 检查页面返回信息
断言就类似LoadRunner中的检查点。对上一个请求返回的信息,做字符串、数据包大小、HTML、XML、图片等做判断,确保返回的信息的准确性。

添加响应断言:欢迎您
如果登陆页登陆成功,则后台会返回欢迎信息字样

断言中可以添加多个断言一起判断,断言中也可以使用参数化方法,进行动态判断。

添加断言结果

断言判断正确

来一次异常的断言来看看jmeter是否在断言结果中返回异常。
随意修改断言

运行脚本,则会出现断言找不到的提示信息。

5.2 检查进行参数化的项
简单的来理解一下,上一章讲到,我们对用户名和密码进行了参数化,那么怎样来判断jmeter有没有正确调用test.dat里面的文件呢。当然,我们可以从结果图表中查看。但我还是想在“登录”这个地方进行一下检查。
jmeter里面的检查点通过添加断言来完成。
1.右键点击我们的“登录”页面---->添加---->断言---->响应断言

来设置一下断言页面,我们想断言什么呢?调用的用户名和密码是不是我们test.dat文件里的用户名和密码,怎样来进行呢。
3.这里我们需要分别准备两个文件,一个放用户名,一个放密码。

下面编写函数来调用这两个文件,如何编写先看我上一篇文章。
在响应断言页面添加两个“模式”

(第三步还有一种方法,直接调用原来test.dat的数据进行检查,我试了半天一直失败,不知道原因在哪儿?)
4.添加一个断言结果
右键点击我们的“登录”页面---->添加---->监听器---->断言结果
还可以再添加一个“查看结果树” 右键点击我们的“登录”页面---->添加---->监听器---->查看结果树

在线程组中设置5个用户,点击运行运行。
查看断言结果:

6 Jmeter参数化
参数化:录制脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统。
这个时候就需要对用户名和密码进行参数化,使每个虚拟用户都使用不同的用户名和密码进行访问。
6.1 准备脚本,测试数据
1、录制一个脚本(可以用badboy工具录制),在jmeter中打开,找到有用户名和密码的页面。如下:

2、我们需要“参数化”的数据,用记事本写了五个用户名和密码,保存为.dat格式的文件,编码问题在使用CSV Data Set Config参数化时要求的比较严格,记事本另存为修改编码UTF-8. 注意用户名和密码是一一对应的,中间用户逗号(,)隔开。

我将这个文件放在了我的( C:\JmeterWorkSpace\t.dat)路径下。
6.2 参数化
  这里介绍两种参数化的方式:函数助手,CSV Data Set Config。
1、借助函数助手的方式
a、点击菜单栏“选项”---->函数助手对话框,看下图: CSV文件列号是从0开始的,第一列0、第二列1、第三列2、依次类推。

b、复制生成的参数化函数,打开登陆请求页面,在右则的参数化中找到我们要参数化的字段,这里对用户名和密码做参数化,第一列是用户名,列号为0;第二列是密码,列号为1;修改函数中对应的参数化字段列号就可以啦。

好了,现在我们的参数化设置完成,在脚本的时候,会调用我们C:\JmeterWorkSpace盘下面的t.dat文件,第一列是用户,第二列是密码。
2、借助jmeter中的配置元件(CSV Data Set Config)
a、选中线程组,点击右键,添加-配置元件-CSV Data Set Config

说明:
Filename --- 参数项文件
File Encoding --- 文件的编码,设置为UTF-8
Vaiable Names --- 文件中各列所表示的参数项;各参数项之间利用逗号分隔;参数项的名称应该与HTTP Request中的参数项一致。
Delimiter --- 如文件中使用的是逗号分隔,则填写逗号;如使用的是TAB,则填写\t;(如果此文本文件为CSV格式的,默认用英文逗号分隔)
Allow quote data:选项选为“true”的时候对全角字符的处理出现乱码
Recycle on EOF? --- True=当读取文件到结尾时,再重头读取文件
False=当读取文件到结尾时,停止读取文件
Stop thread on EOF? --- 当Recycle on EOF为False时,当读取文件到结尾时,停止进程,当Recycle on EOF为True时,此项无意义

备注说明:这里我用通俗的语言大概讲一下Recycle on EOF与Stop thread on EOF结果的关联
Recycle on EOF :到了文件尾处,是否循环读取参数,选项:true和false
Stop thread on EOF:到了文件尾处,是否停止线程,选项:true和false
当Recycle on EOF 选择true时,Stop thread on EOF选择true和false无任何意义,通俗的讲,在前面控制了不停的循环读取,后面再来让stop或run没有任何意义
当Recycle on EOF 选择flase时,Stop thread on EOF选择true,线程4个,参数3个,那么只会请求3次
当Recycle on EOF 选择flase时,Stop thread on EOF选择flase,线程4个,参数3个,那么会请求4次,但第4次没有参数可取,不让循环,所以第4次请求错误
b、使用刚才定义好的变量

至此,两种参数化的方法就介绍完了。
需要说明一下:函数助手方法要比CSV控件方法参数化功能要弱,推荐使用CSV控件方法。
再看看与loadrunner参数化不一样的:
1、 jmeter参数文件的第一行没有列名称
2、 这里要注意的是参数文件的编码,可以使用记事本另存为就可以修改该编码(编码问题在使用CSV Data Set Config参数化时要求的比较严格)
3、 Jmeter的参数化设置没有LoadRunner做的出色,它是依赖于线程设置的(只有CSV Data Set Config参数化方法才有)

7 正则表达式提取器
有这样一个压力测试环境,有一个上传页面,上传成功之后服务器会返回一些上传信息(比如文件的 id 或者保存路径之类的信息),然后压力机会继续下一个请求,比如调整 id 为 xx 的文件的一些信息等等。问题来了:JMeter 是不知道上传后文件的 id 的,第二个请求势必从第一个请求的返回结果中提取出文件 id,然后依此为参数发起第二次请求。那么 JMeter 如何把上一个请求的结果作为下一个请求的参数呢?本文将介绍如何使用正则提取器解决这个问题。
运用Jmeter正则提取器,可以从请求的响应结果中取到需要的内容,从而实现关联。本质上来说,它是使用正则表达式的提取模式来实现的。
7.1 第一个请求的返回结果
添加一个监听器,右键点击线程组,点击 添加-监听器-察看结果树,运行脚本,在察看结果数中找到第一个请求的响应数据,如图

7.2 正则表达式提取器的使用方法
1、添加Jmeter正则表达式提取器:在具体的Request下添加Jmeter正则表达式提取器(Jmeter正则表达式在“后置处理器”下面,点击 添加-后置处理器-正则表达式提取器)
2、Jmeter正则表达式提取器控制面板,截图如下:

位置1:名称及注释
位置2:正则表达式提取内容的范围。
位置3:正则表达式提取的相关设置
引用名称:其他地方引用提取值的变量名称,如填写的是:userId,具体的引用方式是${ userId }
正则表达式:提取内容的正则表达式【稍注意一下:()表示提取,对于你要提前的内容需要用小括号括起来,.代表任意字符,+代表出现任意次,后面加?】
模板:用$$引用起来,如果在正则表达式中有多个提取表达式(多个括号括起来的东东),则可以是$1$,$2$等等,表示解析到的第几个值给str,正则表达式的提取模式,值从1开始,值0对应的是整个匹配的表达式 如对于表达式s(.*) 值0对应str,值1对应tr
匹配数字(0代表随机):0代表随机,-1代表所有,其余正整数代表将在已提取的内容中,第几个匹配的内容。
缺省值:正则匹配失败时,取的值
7.3 添加 Debug Sampler 以对正则提取器进行调试
右击 线程组 打开其右键菜单 - 添加 - Sampler - Debug Sampler。在该项的执行结果中可查看到正则表达式提取的值。

8 手机端接口测试
1、右键点击测试计划添加Threads线程组,此时在测试计划下面出现线程组选项。点击该选项,出现线程组界面。参数线程数表示多少个请求,参数Ramp-Up Period表示在多长时间内跑完所有的请求,循环次数表示同一个请求执行多少次。
假如这三个参数分别为100,10,1,则每秒执行100/10=10个请求。
假如这三个参数分别为100,10,2,则每秒执行100/10=10个请求,但总共执行1002=200个请求,执行的总时间为10*2=20秒。

2、右键点击线程组添加 HTTP请求,此时在线程组下面出现HTTP请求选项。点击该选项,出现HTTP请求界面。
服务器名称或IP填你的服务器名或IP地址,比如10.200.17.163;端口号填接口所用的端口号,比如88;connect表示连接时间,比如10000毫秒;response表示响应时间,比如10000毫秒。
Implementation选HttpClient4;协议填http;方法填写POST;Content encoding填utf-8。
路径填接口地址,比如登录接口/logistics/user/goodslogin
添加参数,比如名称为username值为13621225664;值为password名称为JUb9nHM6UdQ%3D ,如图

9 上传文件
添加http请求,各项值填写与手机端接口一致。
注意:
1,请求类型为Post
2,要勾选 Use multipart/form-data for POST,否则request中将不包含上传的文件
3, MIME类型为application/octet-stream
同请求一起发送文件中为需要上传的文件
如图

你可能感兴趣的:(jmeter教程)