Jmeter不可不知的知识点

                      97bafed5ff1f4f00bce66f121e80907fa2d.jpg   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中,事务的处理是分两种情况的:

·要度量的操作只有一个请求:不需要做任何处理

·要度量的操作包含多个请求:就需要用到逻辑控制器-事务控制器。

89d66f576d8da6b59dcbae0cca5fecde2aa.jpg

 

·检查点

一般是通过断言组件来实现。

根据实际需要进行选择。

 

·思考时间

一般是通过定时器组件来实现。

 

·集合点

一般是通过定时器组件-Synchronizing Timer来实现。

这里的超时设置的是到达集合点的第一个虚拟用户的等待超时时间。

和LR是不一样的,LR中设置的超时是用户和用户之间的等待时间。

a7e8afdc97a33fe9d9bcd2b31f0d22a4e08.jpg

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,)}

 

83b513c61e19c76a888fedbebc377c528c6.jpg

cb6ee9774be79d55a685f7a5a112ec93346.jpg

7f9dc23e2b92cced67a7582cd5b5fa9b6ff.jpg

 

提取所有参数一起使用

fb799e51374b5d0c8b893f1c4623f44a608.jpg

a1b甲c...a2b乙c...a3b丙c...a4b丁c...

 

a(.*?)b(.*?)c

89abbd2cc21c2d70d7cd76a02f90185ebe0.jpg

 

 

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);

 

按比例分配线程

8ab8db9ca8e3f4df3b3aeb33dba7357a860.jpg

 

mysql测试

e3db44577e20d0a71113e5f90e7774d149c.jpg

jdbc:mysql://192.168.4.136:3306/test

com.mysql.jdbc.Driver

test

raxtone_Test@2017

1e78127110cb2e9b2a0d46784d47f049fb1.jpg

 

jmeter -n -t  testplan.jmx -l listener.jtl

转载于:https://my.oschina.net/u/3447023/blog/1927632

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值