JMeter 知识点汇总
1,现有市场工具对比
Jmeter:
·为什么选择Jmeter?
Jmeter和Loadrunner的对比:
·成本:Jmeter是开源的,Loadrunner是商业
·功能:Jmeter能够完成Loadrunner95%左右的功能
Jmeter是完全不解析HTML的,而LOADRUNNER还是会解析HTML的。
·易用性、用户友好性:Jmeter不如Loadrunner
·性能:Jmeter也是不如Loadrunner。
·可扩展性:Jmeter优于Loadrunner。
Jmeter是Apache组织的一款使用java语言开发的开源的性能测试工具
http://jmeter.apache.org/
2,使用工具环境要求
·使用Jmeter的环境要求:
Jmeter是一款java应用,需要有JDK环境。要求java和javac的版本保持一致。
·Windows:
环境变量:
JAVA_HOME:jdk的路径
PATH:一定要包含%JAVA_HOME%\bin
·Linux:
JAVA_HOME:jdk的路径
PATH:一定要包含$JAVA_HOME\bin
区别:
·windows下,系统变量的引用使用的格式:%变量名%;Linux下引用变量的格式:$变量名.
·windows下,path的值和值之间用分号“;”进行分隔;Linux下分隔符是冒号":".
3,工具目录构成
Jmeter的目录构成:
·bin目录:存放了Jmeter的主jar包,主程序(BAT脚本或者shell脚本),配置文件、日志等相关资源。
·jmeter.bat:windows下启动Jmeter的主程序。
在jmeter.bat中是可以设置相关的JVM属性。
·Jmeter-server.bat:相当于LR中的Load generator(Loadrunner agent)组件,用于联机负载。
set HEAP=-Xms512m -Xmx512m 可以设置成 2/3 ~ 1/2
·jmeter.properties:Jmeter的配置文件,Jmeter中80%以上的配置项是通过该文件实现。
PS:一旦配置文件被修改,需要重启Jmeter才能生效。
·docs目录:存放的是Jmeter的API文档。
·extras目录:存放的是和Jmeter集成有关的一些附件。
比如说ant
·lib目录:是Jmeter启动时的默认的classpath。意味着通过Jmeter进行测试时,所有需要import的包或者类都必须存放在该目录中。
PS:需要先放jar包,再重启Jmeter才能生效。
·lib\ext目录:存放的是Jmeter的组件和插件,包括第三方的组件和插件。需要在图形化模式可见、可使用的部分都需要放在该目录下。
·printable_docs目录:存放的是Jmeter的官方帮助文档(英文版)。
4,Jmeter的使用
Jmeter的界面风格,类似于LR的tree模式。
4.1 使用Badboy录制:
注意事项:
·录制完成之后,需要通过菜单File-export to Jmeter的方式将脚本导出为Jmeter的脚本格式--*.jmx。
·第一次使用Jmeter打开badboy录制的脚本,需要对所有名称和step有关的组件(循环控制器)执行一次Change Controller操作。
优点:录制过程简单、生成的脚本简洁(相当于LR中的HTML模式)。
缺点:·仅适用于B/S架构
·通过内置浏览器录制,就会因为浏览器的兼容问题导致无法录制。
4.2 Jmeter 自带的代理服务器录制
什么叫录制?录制的本质就是工具自动抓包、自动按协议进行解析、自动生成脚本
操作步骤:
第一步:右键 测试计划组件,添加 Threads(Users)-thread group组件。
第二步:右键 测试计划组件,添加 配置元件--http cookie管理器 组件。
第三步:右键 工作台,添加 非测试元件-http代理服务器(http proxy server)组件。
第四步:配置并且启动http代理服务器。
http代理服务器的配置选项:
·端口:要求在本地没有被其它应用所占用。
使用命令:netstat -an
·目标控制器:是用来指定录制的脚本的生成位置。
建议选择第一步所添加的线程组组件。
·包含模式:只录制所指定的模式
·排除模式:不录制所指定的模式。
包含模式和排除模式允许我们通过正则表达式的方式对要录制的http的请求进行过滤。
因为Jmeter本身就是HTML模式,所有的静态资源都是可以屏蔽掉。一般建议只对常见的类型进行屏蔽:
js、css和图片(.jpg\.png\.gif\.bmp)
要过滤js类型的资源请求,正则表达式如下:
.*\.js.*
第五步:设置IE选项,启动本地代理。
IE选项-连接-局域网设置-为LAN使用代理服务器。
·地址:localhost
·端口:和第四步中的端口保持一致。
PS:和要测试的服务器端口无关。
PS:前5个步骤,基本上没有先后顺序。
sampleresult.default.encoding=utf-8
注意事项:
·一定要合理运用好包含模式和排除模式:
包含模式:
一般是指定测试服务器的域名即可。
假设被测的服务器的域名是:192.168.1.10
则包含模式中可以填写:
.*192\.168\.1\.10.*
·在录制时,尽量将所有和录制无关的网络应用都关闭。
·录制完成之后,一定要记得停止代理服务器、还原IE选项。
优点:录制过程可控。
适用于所有使用http协议的应用。
不存在浏览器的兼容问题。
缺点:
·包含和排除模式使用不当,会导致无法录制。
·只适用于http协议。
5,Jmeter 工具组件说明和使用范围
·Jmeter的组件:
Jmeter的脚本是由Jmeter所提供的各种组件构成的。
组件和组件之间有相互的包含、作用的关系。
·测试计划:
在Jmeter中,所有可运行的组件都必须位于测试计划下。
在测试计划组件中,一般可以定义全局的一些变量、控制线程组的执行方式等。
在测试计划下可以添加的组件有八大类型:
·Threads(Users):线程组件,Jmeter实现虚拟用户的方式是线程方式。
线程组件默认有三种:setUp thread group、thread group、tearDown thread group,这三种线程组本质上都是一样的,都可以实现多线程的效果。如果在测试计划下只存在一种的话,是没有区别的。区别在于同时存在于一个测试计划下时,会存在执行先后的区别:setUp线程组执行完毕,再执行thread group、最后执行tearDown线程组。
·线程组:是用来指定当前线程组的执行计划的。
·线程数:就是虚拟用户数
·Ramp-Up Period:设定启动所有线程所需的总时间。
PS:在Jmeter中,线程启动的方式是采用平均方式,线程的最小单位是1.即最终的效果是1线程/N秒. N=线程数/Ramp-Up
·线程组只能指定线程第一次启动时的间隔时间,不能控制之后的循环过程中线程的间隔。
·循环次数:每一个线程执行线程组内的组件的次数。
·调度器:允许我们设置线程组计划的启动时间和持续时间。
PS:·调度器是在点击启动按钮之后生效。
·启动延迟的优先级别高于启动时间。
·持续时间的优先级被高于结束时间。
·线程的停止条件是:循环次数到达或者时间到达。
·Test Fragment:测试片段,在测试片段下可以添加的组件类型和线程组是完全一样的。测试片段下的脚本本身是不会运行,必须被调用才会执行。
对于测试片段的调用有两种情况:
·脚本内的调用:一般是通过逻辑控制器-模块控制器 实现。
·脚本外的调用:一般是通过逻辑控制器-Include Controller 实现。
·逻辑控制器:是用来控制Jmeter中各个组件的执行逻辑的。
·Sampler:取样器。就是请求,是各种协议的请求的模板。
是脚本中的必加组件。
·配置元件:用来配置脚本运行时所需的一些环境值的,配置元件是全局的,是在Sampler运行之前编译执行的。
·定时器:
·前置处理器:
·后置处理器:
·断言:
·监听器:
这六种组件单独存在是没有意义的,他们都是为Sampler组件服务的。定时器、前置处理器、后置处理器、断言、监听器这五种组件对于Sampler的作用都是和作用域有关。
6,脚本作用域
和作用域有关的组件都是会对其父组件、所有的同级组件和同级组件的子组件有效(作用)。和组件在测试计划下出现的先后次序无关的。
其中:
·定时器、前置处理器是运行在其作用域内的每一个请求之前,和组件本身的先后次序无关,而且运行次数等于作用域内的请求数量。
·后置处理器、断言是运行在其作用域内的每一个请求之后,和组件本身的先后次序无关,而且运行次数等于作用域内的请求数量。
7,脚本处理
脚本需要的处理有:参数化、关联、事务、检查点、思考时间、集合点。
参数化:为了实现不同用户的不同请求;即逻辑相同、数据不同
·在Jmeter中、对于变量、参数、函数的使用都是遵循相同的调用格式:${变量名}、${参数名}、${函数名(形参...)}
·在Jmeter的组件中,一般来说,所有鼠标点击可以输入的地方都可以做参数调用,都可以实现参数化。
在Jmeter中,参数化的实现方式一般有两种:
·函数方式:
使用Jmeter所提供的一些函数来生成参数值。一般建议通过函数助手对话框来实现。
_javascript()函数允许我们使用js代码来生成一些参数值,但是要求最后一句话是一个变量或者变量表达式。这个函数会自动返回最后的变量或者变量表达式的值。
·文件方式:允许我们将参数存在参数文件中,一般参数文件类型可以是.csv或者.txt类型。通过函数或者配置元件-CSV Data Set Config组件实现读取。
·CSV Data Set Config组件的配置项:
·FileName:这里需要指定参数文件的路径,路径可以是相对路径,也可以是绝对路径。
PS:参数文件的路径必须包含参数文件的全名。
·File Encoding:是要求和参数文件自身的编码保持一致。
如果参数文件本身是ANSI编码,则该处留空即可;如果参数文件本身是UTF-8编码,则该处需要填写UTF-8.
·Variable Names:参数名称,可以定义多个参数名称,参数之间使用逗号分隔。每一个参数会依次对应参数文件中的一列值。
·参数名称可以留空,如果留空的话,则参数文件的第一行值就会自动升级为参数名称,调用参数时就需要使用第一行的值作为参数名来用。
·Delimiter:用来指定参数文件中列的分隔符。
要求和参数文件中的实际的列的分隔符保持一致。
·Allow quoted data?:是否允许使用双引号来屏蔽分隔符。或者来定义一个整体的单元格数据。
·Recycle on EOF?:如果参数值不够用时,是否循环使用。
·Stop thread on EOF?:如果参数值不够用时,是否停止线程,该选项必须是在循环选项为False时才会生效。
·Sharing mode:是用来设置线程对于参数值的一个使用模式,共享模式:
·All threads:所有线程模式,参数文件只会生成一个副本(数组),所有线程共用该副本,采取先到先拿,顺序获取的方式。
·Current thread group:当前线程组模式,参数文件会根据线程组的数量生成多个副本(数组),每一个线程组都拥有一个独立的副本,线程组内的所有线程共享一个副本,采取先到先拿,顺序获取的方式。
·Current thread:当前线程,参数文件会根据线程的数量生成多个副本(数组),每一个线程都拥有一个独立的副本,采取先到先拿,顺序获取的方式。
在jmeter中,参数值的变更是受其作用域内最高级别的组件(不包含测试计划)的执行次数决定的。
最高级别的组件执行一次,其就变更一次。
放在请求下,就相当于LR中的每次出现(each Occurrence)
放在线程组下或者循环控制器下,就相当于LR中的每次迭代(each Iteration)
关联:
关联最终要做的操作其实就是四个字:先存后用。
先存:保存服务器响应回来的一些特殊作用的值
后用:在后续的请求中使用保存的服务器动态响应的值。
A请求发送给服务器之后,服务器就会生成一些数据用来记录A请求的操作状态。后续的B请求中需要用到A请求所获取的服务器的数据,就需要做关联处理。
关联的步骤:
第一步:找出出错的请求
重点关心使用POST方法的请求。
PS:出错并不是指脚本运行出现error,出错是指脚本运行没有达到预期的功能目标。
第二步:过滤可疑数据
可疑数据:我们认为可能导致请求出错的数据。
过滤原则:
·根据业务进行过滤
·根据键的名称进行过滤
·根据值进行过滤
第三步:定位数据的来源
直接通过在出错请求之前的请求的响应中查找。
找到之后,截取可疑数据的左右边界。
因为服务器返回的数据会动态变化,但是返回数据的格式是不会变的。
左右边界尽量截取一些固定的,能够唯一定位可疑数据的字符串。
第四步:构建并且测试正则表达式。
在Jmeter中,要查找并且保持服务器响应的数据到参数,一般都是使用组件后置处理器-正则表达式提取器,使用的是正则表达式。
将带左右边界的可疑数据,直接替换为(.*?)
第五步:添加正则表达式提取器
在第三步的来源的请求之下添加后置处理器-正则表达式提取器,并且完成配置。
第六步:替换
将脚本中所有的可疑数据,替换为第五步的参数的调用格式。
可疑数据--》${引用名称}
在Jmeter中,对于关联的处理的原理和LR是没有区别。
区别在于,Loadrunner是通过函数web_reg_save_param这一系列的函数来实现保存数据;
而在Jmeter中,是通过后置处理器-正则表达式提取器来实现。
·正则表达式提取器:
·引用名称:就是输出的参数的名称,参数的值受到正则表达式、模板及匹配数字的影响。
·正则表达式:就是填写要用来查找并且保存数据的正则表达式。
根据实际业务进行填写。
·模板:这里可以填写常量或者位置变量$N$
常量:最后引用名称就会获取常量的值。
位置变量$N$:表示将正则表达式的第N对括号所匹配的值赋值给引用变量。
·匹配数字:用来指定将第几次匹配的值传递给引用变量。
等价于LR的关联函数中的Ordinal属性。
·正整数N:将第N次的模板指定的括号的值传递给变量。
·数字0:随机将匹配的数据传递给变量。
以上两种情况,引用变量只会获取一个值,可以直接调用。
·负数:一般是-1,将所有匹配的数据以类似于数组的方式存入引用变量(引用变量数组):
ParamName_1=value1,ParamName_2=value2,..ParamName_N=valueN
与之同时,会自动生成一个叫ParamName_matchNr=N,用来保存匹配的数量。
一般此时就需要遍历使用所有保存的数据,通过逻辑控制器-ForEach控制器来实现。
·缺省值:如果正则表达式匹配不到数据,则会使用缺省值,一般建议留空。
·事务:
在Jmeter中,事务的处理是分两种情况的:
·要度量的操作只有一个请求:不需要做任何处理
·要度量的操作包含多个请求:就需要用到逻辑控制器-事务控制器。
·检查点:
一般是通过断言组件来实现。
根据实际需要进行选择。
·思考时间:
一般是通过定时器组件来实现。
·集合点:
一般是通过定时器组件-Synchronizing Timer来实现。
这里的超时设置的是到达集合点的第一个虚拟用户的等待超时时间。
和LR是不一样的,LR中设置的超时是用户和用户之间的等待时间。
PS:对于检查点、思考时间、集合点的使用,都要注意作用域问题。
8、分布式压力测试
操作步骤:
第一步:在负载机上启动Jmeter-server.bat的程序
PS:一般来说Jmeter-server.bat是通过端口1099实现监听和通信的。如果1099端口被占用,则需要通过修改控制机上的Jmeter的配置文件jmeter.properties中的属性server_port来实现修改。
第二步:在控制机上添加负载机。
通过修改控制机上的jmeter的配置文件Jmeter.properties实现。
属性是remote_hosts
示例:
remote_hosts=127.0.0.1
#remote_hosts=localhost:1099,localhost:2010
remote_hosts=192.168.1.9:1099,192.168.1.10:1099
192.168.1.9和192.168.1.10就是需要启动Jmeter-server.bat的负载机的IP地址。1099就是负载机上的server_port.
第三步:重启Jmeter,点击远程启动或者远程全部启动。
注意事项:
·联机负载时,脚本的运行环境是负载机的环境。
因此在联机负载时,除了Jmeter的脚本(*.jmx)以外的因素(运行环境、环境变量、jar包、参数文件等等),都必须保证负载机和控制机的同步。。
jar包:在控制机和负载机的Jmeter的lib目录下都存放即可。
参数文件:
如果控制机和负载机的操作系统是相同类型,则可以使用绝对地址。
如果不同,则只能使用相对路径:
·在本地(控制机),当前路径是指:脚本所在的目录。
·在远程(负载机),当前路径是指Jmeter-server.bat所在的目录。
·在Jmeter中,线程组的计划是分别、同时在不同的负载机上执行。
对于服务器而言:
总压力=线程组设计的压力×负载机的数量。
非GUI运行
这次我们可以清晰地看到每个线程的执行情况。
这里是我们使用非 GUI 模式运行测试脚本时可以使用的一些命令:
-h 帮助 -> 打印出有用的信息并退出
-n 非 GUI 模式 -> 在非 GUI 模式下运行 JMeter
-t 测试文件 -> 要运行的 JMeter 测试脚本文件
-l 日志文件 -> 记录结果的文件
-r 远程执行 -> 启动远程服务
-H 代理主机 -> 设置 JMeter 使用的代理主机
-P 代理端口 -> 设置 JMeter 使用的代理主机的端口号
1,启动本地脚本
D:\Jmeter\bin>jmeter -n -t testplan.jmx -l listener.jtl
Testplan.jmx脚本文件 或者携带地址的脚本 例如c:/testplan.jmx
Listener.jtl 监控文件,默认在 jmeter.bat 或 jmeter.sh 目录下 同时也可以 指定路径 例如d:/listener.jtl
D:\Jmeter\bin>jmeter -n -t c:/testplan.jmx -l d:/listener.jtl
2,启动分布式指定代理
D:\Jmeter\bin>jmeter -n -t c:/testplan.jmx -l d:/listener.jtl -H 192.168.1.1 -P 8080
-H 指定代理机器ip -P指定代理机器端口
D:\Jmeter\bin>jmeter -n -t c:/testplan.jmx -l d:/listener.jtl -H 192.168.1.1 -P 8080 -H 192.168.2.1 -P 8080 ...
3,启动所有分布代理
D:\Jmeter\bin>jmeter -n -t c:/testplan.jmx -r -l d:/listener.jtl
启动时 添加 -r命令即可启动所有分布式的代理;
4,在代理机器上启动多个server_agert
Jmeter默认端口是 1099 ;
假设:主机在本地 代理机器在服务器地址上,本地的jmeter 端口默认就是1099, 如果要在代理服务器启动多个server_agert 首先启动一个server_agent 他的端口是1099 然后操作如下:
修改 jmeter-server.bat 或 jmeter-server.sh 在最上面添加 SET SERVER_PORT=2000
保存后,启动jmeter-sverver 当前的端口就是2000 ;
假如还想在代理机器启动多个server-agert 呢怎么办呢?
然后操作如下:
修改 jmeter-server.bat 或 jmeter-server.sh 在最上面添加 SET SERVER_PORT=2001
保存后,启动jmeter-sverver 当前的端口就是2001 ;
注意 :启动多个server-agert时 需要添加一个启动一个,不可一次性全部添加;
IP欺骗:
在jmeter中,IP欺骗只适用于HTTP请求。
操作步骤:
第一步:在负载机上添加IP地址。
第二步:修改脚本中的http请求的implementation属性,选择httpClient模式。
第三步:在http请求的Source IP Address属性中,指定第一步绑定的IP地址。
一般来说,该处需要做参数化处理。
9,案例分享
跨线程组传值
第一种 设置全局变量:
${__P(newstamp,)}
提取所有参数一起使用
a1b甲c...a2b乙c...a3b丙c...a4b丁c...
a(.*?)b(.*?)c
int i;
String temp;
String str=vars.get("pa_1");
//String num=vars.get("pa_matchNr");
int num=Integer.parseInt(vars.get("pa_matchNr"));
for(i=2;i<=num;i++)
{
temp="pa_"+i;
//‘-’是连接符号,根据实际情况可以切换。
str=str+'-'+vars.get(temp);
}
vars.put("out_str",str);
按比例分配线程
mysql测试
jdbc:mysql://192.168.4.136:3306/test
com.mysql.jdbc.Driver
test
raxtone_Test@2017
jmeter -n -t testplan.jmx -l listener.jtl