jmeter介绍
JMeter是Apache基金会Jakarta上的一个纯Java开源项目,起初用于基于Web的压力测试(pressure test),后来其应用范围逐渐扩展到对文件传输FTP,大型数据库(JDBC方式),脚本程序(CGI,Perl等),Web Services,Java应用系统等方面的测试。JMeter本身主要用于性能测试,如系统压力等。除此之外,JMeter能够对应用系统做功能测试和回归测试,并且能够通过使用带有断言的脚本程序来验证系统然后返回用户期望的结果。为了提高工具的应用灵活性,JMeter允许使用正则表达式创建断言。正是由于它的灵活性和可扩展性,JMeter逐渐成为流行的开源测试工具。
Jmeter特点:
- 支持多种服务类型进行测试
- 支持通过录制回访的方式获取测试脚本
- 具备高移植性,是100%的Java程序
- 采用多线程框架,允许通过多个线程并发取样及通过独立的线程组对不同的功能同时取样
- 精心设计的GUI支持高速用户操作和精确计时
- 支持缓存和离线的方式分析回放测试结果
- 具备高扩展性
Jmeter与Loadrunner的对比:
1、界面、安装、协议支持、函数库、成本、开源
2、都可以实现分布式负载,相对来说Loadrunner更强大一些
3、都支持在windows和linux环境的负载生成器。控制台方面,Jmeter跨平台、而LoadRunner不是
4、LoadRunner可以指定每个负载生成器运行不同数量的并发用户,而目前Jmeter不行
5、Jmeter中测试计划之外的数据文件不会一起发送到负载生成器,而LoadRunner中的文件可以通过选择纳入LoadRunner的管理而一起发送到远端
jmeter安装
1、安装JDK,必须JDK1.7以上,推荐1.8版本
2、进入jmeter下载页面:http://jmeter.apache.org/download_jmeter.cgi
下载相应安装包,如:apache-jmeter-3.0.zip
3、解压安装到一个英文目录下,如D:
4、配置相应环境变量:
JMETER_HOME:(jmeter地址)D:apache-jmeter-3.0
CLASSPATH:%JMETER_HOME%libextApacheJMeter_core.jar;%JMETER_HOME%libjorphan.jar;%JMETER_HOME%liblogkit-2.0.jar;
PATH:%JMETER_HOME%in;
5、进入D:apache-jmeter-3.0in 目录,双击运行jmeter,打开的时候会有两个窗口,Jmeter的命令窗口和Jmeter的图形操作界面,不可以关闭命令窗口。
修改UTF-8
language=zh_CN
jsyntaxtextarea.font.family=Hack
sampleresult.default.encoding=UTF-8
jmeter主要测试组件
JMeter的主要测试组件总结如下:
1.测试计划是使用JMeter进行测试的起点,它是其他JMeter测试元件的容器。
2.线程组代表一定数量的并发用户,它可以用来模拟并发用户发送请求。实际的请求内容在Sampler中定义,它被线程组包含。
3.监听器负责收集测试结果,同时也被告知了结果显示的方式。
4.逻辑控制器可以自定义JMeter发送请求的行为逻辑,它与Sampler结合使用可以模拟复杂的请求序列。
5.断言可以用来判断请求响应的结果是否如用户所期望的。它可以用来隔离问题域,即在确保功能正确的前提下执行压力测试。这个限制对于有效的测试是非常有用的。
6.配置元件维护Sampler需要的配置信息,并根据实际的需要会修改请求的内容。
7.前置处理器和后置处理器负责在生成请求之前和之后完成工作。前置处理器常常用来修改请求的设置,后置处理器则常常用来处理响应的数据。
8.定时器负责定义请求之间的延迟间隔。
9.取样器(Sampler)是性能测试中向服务器发送请求,记录响应信息,记录响应时间的最小单元,JMeter原生支持多种不同的sampler,如HTTP Request Sampler、FTP Resquest Sampler、TCP Request Sampler、JDBC Request Sampler等,每一种不同类型的sampler可以根据设置的参数向服务器发出不同类型的请求。
jmeter元件作用域与执行顺序
元件的作用域:
配置元件(config elements):元件会影响其作用范围内的所有元件。
前置处理程序(Per-processors):元件在其作用范围内的每一个sampler元件之前执行。
定时器(timers):元件对其作用范围内的每一个sampler有效
后置处理程序(Post-processors):元件在其作用范围内的每一个sampler元件之后执行。
断言(Assertions):元件对其作用范围内的每一个sampler元件执行后的结果执行校验。
监听器(Listeners):元件收集其作用范围的每一个sampler元件的信息并呈现。
总结:从各个元件的层次结构判断每个元件的作用域
元件的执行顺序:
配置元件 → 前置处理程序 → 定时器 → 取样器 → 后置处理程序(除非Sampler得到的返回结果为空)→ 断言(除非Sampler得到的返回结果为空) → 监听器(除非Sampler得到的返回结果为空)
关于执行顺序,有两点需要注意:
前置处理器、后置处理器和断言等元件都能对取样器作用,因此,如果在它们的作用域内没有任何取样器,则不会被执行。
如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序一次执行。
使用Jmeter进行接口测试
使用Jmeter进行一个简单接口测试的操作步骤如下:
测试计划 → 添加线程组 → 添加HTTP Cookie管理器 → 添加"Http请求默认值" → 在"线程组"里添加"HTTP请求"的Sampler 设置检查点 → 添加监听器
测试计划
首先打开Jmeter,在菜单左侧出现了“测试计划”。在这里测试计划我们可以把它理解成新建的空白项目,在这个空白项目下面可以添加一系列的接口。
线程组
添加方法:测试计划 → 右键 → Threads → 线程组
引用性能测试中的描述:这个就是我们通常添加运行的线程。通俗的讲一个线程组,可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。线程组中包含的线程数量在测试执行过程中是不会发生改变的。
在接口测试中我们可以把它看成一个接口或者一个业务流程组合而成的多个接口集、或者若干个不相干的接口。在线程组中可以设置线程数和循环次数等。
线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里也就是设置多少线程数。
准备时长:设置的虚拟用户数全部启动的时长。如果线程数为20,准备时长为10(秒),那么需要10秒钟启动20个线程。也就是平均每秒启动2个线程。
循环次数:每个线程发送请求的个数。如果线程数为20,循环次数为100,那么每个线程发送100次请求。总请求数为20*100=2000.如果勾选了“永远”,那么所有线程会一直发送请求,直到手动点击工具栏上的停止按钮,或者设置的线程时间结束。
HTTP Cookie管理器
使用方法:线程组 → 右键添加 → 配置元件 → HTTP Cookie管理器。
可以像浏览器一样存储和发送cookie,如果你要发送一个带cookie的http请求,cookie manager会自动存储该请求的cookies,并且后面如果发送同源站点的http请求时,都可以用这个cookies。
HTTP请求默认值
添加方法:线程组 → 右键添加 →配置元件 → HTTP请求默认值。
HTTP请求默认值是为了方便填写后续内容而设置。此处填写域名后,后续的HTTP请求中就不用填写地址前缀了。
HTTP请求默认值元件并不告诉JMeter来发送HTTP请求,它仅仅定义这个HTTP请求所用的默认值。
HTTP请求
添加方法:线程组 → 右键添加 → Sampler → HTTP请求。
核心内容为HTTP请求部分,包括接口路径和参数,要注意的是如果参数里面用到了其他接口的返回值,这时候需要在Body Data中进行参数化,需要进行文件上传,可以使用files upload添加
名称:本属性用于标识一个取样器,建议使用一个有意义的名称。
注释:对于测试没有任何作用,仅用户记录用户可读性的注释信息。
服务器名称或IP:HTTP请求发送的目标服务器名称或IP地址。
端口号:目标服务器的端口号,默认值为80。
协议:向目标服务器发送HTTP请求时的协议,可以是HTTP或者是HTTPS,默认值为http。
方法:发送HTTP请求的方法,可用方法包括GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等。
Content encoding:内容的编码方式,默认值为
路径:目标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请求 → 右键添加 → 断言 → 响应断言
响应断言类似LoadRunner中的检查点,检查接口是否访问成功。如果检查失败的话会提示找不到断言的内容,没提示的话就代表成功了。对于自动化测试来说,断言必须要有的,如果没有断言我们只能人眼对比接口返回的数据,有了断言功能,就会简化这个过程。
要测试的响应字段:响应文本、Document(text)、URL样式、响应信息、Response Headers、Lgnore Staus等选项。虽然接口返回的是Json格式的数据,但对于Jmeter来说返回数据为文本,所以,这里可以勾选“响应文本”。
模式匹配规则:包括、匹配、Equals、Substring。这里只需要验证返回数据中是否包含主要的关键字,所以,这里勾选“包括”。
- 包括:返回结果包括你指定的内容
- 匹配:根据指定内容进行匹配
- Equals:返回结果与你指定内容要一致
- Substring:返回结果是指定内容的字符串
注意点:
当模匹配规则为“包括”和“匹配”时,支持正则表达式;当为“Equals”或“Substring”时是完全匹配。
要测试的模式:其实就是断言的数据。点击“添加”按钮,输入要断言的数据。
添加监听器
添加方法:线程组 → 右键添加 → 监听器 → 察看结果树。
一般还会一并添加图形结果、聚合报告。
树状形式显示接口的访问结果,包括请求结果、请求内容、服务器的响应内容。
请求头设置
http请求头设置在Jmeter中需要使用到HTTP信息头管理器。该属性管理器用于定制Sampler发出的HTTP请求的请求头的内容。不同的浏览器发出的HTTP请求具有不同的Agent,访问某些有防盗链的页面时需要正确的Refer...这些情况下都需要通过HTTP信息头管理器来保证发送的HTTP请求是正确的。
- Accept
- Accept-Encoding
- Accept-Language
- User-Agent
https请求配置
要发送https的请求,需要配置http请求或者http请求默认值:
- 端口号:443
- 协议:https
发送带Json串的post请求:
第一步:需要在HTTP信息头部管理器添加一条名称为Content-Type,值为application/json
第二部:把json数据放入BodyData中
Jmeter关联
关联通俗来讲就是把上一次请求的返回内容中的部分截取出来保存为参数,用来传递给下一个请求使用。
从上一个请求中取,使用正则表达式提取器。
具体方法,在需要获得数据的请求上右击添加一个后置处理器 → 正则表达式提取器
引用名称即下一个请求要引用的参数名称,如填写title,则可用${title}引用它。
正则表达式中()括起来的部分就是要提取的。代表任意字符,+表示一次或多次,*代表出现任意次。
模板,用$$引用起来,如果在正在表达式中有多个正则表达式,则可以是$2$,$3$等等,表示解析到的第几个值给title。
匹配数字,0代表随机,-1代表所有,其余正整数代表将在检查的内容中,第几个匹配的内容提取出来。
- 引用名称 title
- 正则表达式
(+?) - 模板 $1$
- 匹配数字(0代表随机) 0
- 缺省值
正则表达式使用举例
1、提取单个字符串
假如想匹配Web页面的如下部分:id="kw" name="wd">并提取wd。
一个合适的正则表达式:id="kw" name="(.+?)">
2、提取多个字符串
假如想匹配Web页面的如下部分:id="kw" name="wd">并提取kw和wd。
一个合适的正则表达式:id="(.+?)" name="(.+?)"。
这样就会创建2个组,分别用于$1$和$2$
比如:
引用名称:Date
模板:$1$$2$
如下变量的值将会被设定:
Data: kwwd
Data_g0: id="kw" name="wd"
Data_g1: kw
Data_g2: wd
在需要引用地方可以通过:${Data},${Data_g1}进行使用。
Jmeter参数化
设置参数值的方法有如下几种:
a.用户定义的变量
1、添加“配置元件” → “用户定义的变量”
2、“名称”中输入变量名称,此处以登录为例,定义两个变量username和password。“值”中可以直接输入值,也可以通过Jmeter的函数_CSVRead,_StringFromFile从csv或dat文件中读取,还可以通过前缀加随机数的方法设置参数。
当参数值是某个前缀加一个数字时,可以用前缀名加${_Random(,,)}或${_threadNum}的方法设置参数值。
b.用户定义的变量:
1、添加“配置元件” → “用户定义的变量”
2、“名称”中输入变量名称,此处以登录为例,定义两个变量username和password。
“值”中可以直接输入值,也可以通过Jmeter的函数__CSVRead,__StringFromFile从csv或dat文件中读取,还可以通过前缀加随机数的方法设置参数。
当参数值是某个前缀加一个数字时,可以用前缀名家${__Random(,,)}或${_threadNum}的方法设置参数值。