一、线程组
线程组是一个测试计划的开始点。在一个测试计划中的所有元件都必须在某个线程组下;
1.1 基础线程组Thread Group
Ramp_up Periond值是预期Jmeter用于启动所有线程的时间;若是线程数过多,则会>该值启动完所有线程;
如下图,预期5s 启动200个线程;可以通过"用表格查看结果"查看每个线程的启动时间;
1.2 阶梯加压线程组 jp@gc - Stepping Thread Group (deprecated)
注意,该线程组需要和Active Threads Over Time(不同时间活动线程数)等结合起来;一般是为了计算每秒最大并发数;
平衡状态下,并发用户数=rps*响应时间=hps*响应时间;
1.3 目标线程组 bzm - Arrivals Thread Group
预期每秒业务量,**时间
jmeter会根据预期的业务量与业务时间,估算出需要多少线程。如果从业务角度考量,这个线程数就是单位时间的并发数;
非常适合进行更传统的负载测试。可能的情况可能是“当系统有每分钟100张的订单,我们的系统是否运行良好?”。
二、取样器
取样器指示Jmeter向服务器发送请求
2.1 Debug Sampler
Debug Sampler会把我们自定义的变量输出在response data中,方便我们调试的时候使用
2.2 HTTP Request
Post请求:常用于表单的提交,例如登录请求,新增请求等;
Get请求:用于信息获取,常用于查询,请求的数据会附在url之后(就是把数据放置在HTTP协议头中),以?分割url和传输数据,多个参数用&连接;
PUT请求:用于修改;
Delete请求:常用于删除;
2.3 JDBC Request
这个Sampler可以通过sql语句乡数据库发送一个jdbc请求,并对获取返回的数据进行操作。它经常需要和JDBC Connection Configuration(配置数据库连接的相关属性)一起使用;
Variable names:保存sql语句返回结果的变量名;
Result variable name:创建一个对象变量,保存所有返回的结果;
2.4 jp@gc - Dummy Sampler (模拟请求)
它用于模拟一个接口请求,效果类似于Mock
我们可以设置响应码、响应信息、延迟时间、响应时间、模仿响应时间、请求数据、响应数据;
它的意义在于:当服务器还没有开发完成时,帮助我们调试脚本;
我们可以通过后置处理器获取Dummy Sampler里面的信息,供后面的业务使用;
2.5 Java Request(java请求)
同Dummy Sampler一样,可以用来模拟一个接口的请求和返回;
2.6 FTP Request(FTP请求)
ftp请求分为两种,一种是从ftp下载文件,一种是从ftp上传文件;
三、表达式和提取器
3.1 JSON Extractor (JSON提取)
JSON Extractor使用json path表达式匹配,可以一次取多个变量值。$表示响应的根对象。取子对象或对象的属性用. 取数组里的对象用[],数组索引从0开始
3.2 XPath Extractor
//*[@class,'A']/@href 从根目录下定位所有class=A的href
3.3 正则表达式提取
它通过正则表达式获取接口响应,并传入下个接口
左边界(.+?)右边界
左边界(.*?)右边界
正则表达式:利用正则将需要的数据提取出来
() 括起来的部分就是需要提取的,对于你要提的内容需要用小括号括起来
. 点号表示匹配任何字符串
+ 一次或多次
? 在找到第一个匹配项后停止
模板:用$$引用起来,如果在正则表达式中有多个正则表达式(多个括号括起来),则可以是$N$等,表示提取第N个括号里面的值;
匹配数字-1:表示取所有返回值,此事提取结果时一个数组,其余正整数代表第几个匹配的内容提取出来。如果匹配数字选择的是-1,后续还可以通过${xxx_1}的方式来取第1个匹配的内容,${xxx_2}来取第2个匹配的内容;
匹配数字1:表示第一个返回值;
匹配数字2:表示随机取一个返回值;
如下图:提取生日;() 要提取的内容;.任意字符;{n} 精确n次;*前面字符出现任意次;.*任意长度的任意字符串;
四、配置元件
4.1 CSV Data Set Config
在使用JMeter的时候,往往需要参数化一些数据,常用到的就是CSV Data Set Config
4.2 HTTP Cookie Manager
用来存储浏览器产生的用户信息
4.3 HTTP Header Manager(HTTP信息头管理器)
默认http请求的值,如server、ip、port、Protocol甚至path、parameters,都可以设置。
4.4 HTTP 请求默认值
默认http请求的值,如server、ip、port、Protocol、path、parameters都可以设置
4.5 JDBC Connection Configuration
做JDBC请求,首先需要将相应的jar包放到jmeter目录中的lib文件下,然后重启Jmeter
mysql驱动:mysql-connector-java-5.1.13-bin.jar
4.6 Random Variable
配置生成随机数,自定义输出格式,最大最小值,以及是否为每个线程单独生成
4.7 用户定义的变量
当前的线程组内所有取样器都可以引用变量。
4.8 计数器
初始值,递增,引用名称
4.9 插件管理器
不要手动安装各种插件,jmeter提供了用户界面来完成插件的安装、升级、卸载。
它管理的插件包括jmeter-plugins.org上面常用的插件,和各种第三方插件甚至核心JMeter插件。
安装插件管理
1.下载plugins-manager.jar
2.将plugins-manager.jar放到jmeter的libext目录下;
3.启动Jmeter;
4.菜单栏多出一个"Plugins Manager"的选项;
Installed Plugins:显示已安装的插件;Available Plugins:显示可安装的插件;Upgrades:显示可以升级的插件;
通过勾选/取消勾选插件,并点击右下角"Apply Changes and Restart JMeter"按钮来卸载、安装、升级插件;
五、 定时器
5.1 用户集合点(Synchronizing Timer)
加载到一定的user(线程数)才进行并发操作;
5.2 固定定时器(Constant Timer)
线程的标准等待时间,性能测试中相当于用户行为中的思考时间;
5.3 固定吞吐量定时器(Constant Throughput Timer)
这种定时器可以限制吞吐量(tps),约定事物每分钟的执行数;
六、逻辑控制器
逻辑控制器允许我们定制JMeter发送的请求。控制器可能包含如下的子元件:取样器,配置元件,其它的逻辑控制器;
逻辑控制器能够更改它元件中的请求顺序。
6.1 ForEach控制器
ForEach控制器一般和用户自定义变量一起使用,用于可以遍历读取相关的返回值。该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值。
注:foreach控制器通常和表达式提取器一起使用。表达式提取值应为-1,表示取全部值,然后sampler在foreach控制器下执行遍历。
6.2 循环控制器
指定其子节点运行的次数,可以使用具体的数值,也可以设置为变量。
1.勾选永远:表示一直循环下去。
2.如果同时设置了线程组的循环次数和循环控制器的循环次数,那循环控制器的子节点运行的次数为两个数值相乘(线程数*循环控制器数值)
6.3 While控制器
直到条件为false时,停止运行。
6.4 if控制器
根据给定表达式的值决定是否执行该节点下的子节点,默认使用javascript的语法进行判断。
6.5 交替控制器(交替执行控制器下的业务)
七、常见监听器、断言
7.1 查看结果树
一、左侧的结果列表
1.通常执行成功的请求在左侧会显示绿色,执行失败会显示红色。
2.其实,当我们没有加断言时,显示绿色并不一定就是成功了,只代表响应码是200或300系列,显示红色说明响应码是400或500系列。所以要想确定请求返回的是正确的,必须要加上断言,只有断言成功才会显示绿色。
3.在左侧最下面有一个复选框Scroll automotically?勾选后,当请求很多时,滚动条会自动向下滚动。
二、右侧的“取样器结果”
三、Raw和Parsed
默认情况下我们看到的是raw状态的数据,也可以点击下面的标签切换到Parsed状态。
四、结果数据项的配置
点击右侧的Configure,会弹出配置框,在这里可以根据自己的需要选择想要在“察看结果树”中展示的数据,默认是全选的,我们可以自由配置。
五、“请求”选项卡
请求中会显示请求的url、参数、请求头、cookies等详细信息。
六、“响应数据”选项卡
1.这里是服务器的响应结果数据。
2.通过左侧的下拉框来设置响应的数据显示方式。
3.通过下面的search行可以进行对当前请求的内容搜索。
7.2 BeanShell断言
利用beanshell断言,获取实际响应字段与预期值进行比对,自定义断言结果。
Failure=true;
FailureMessage="断言失败";
7.3 响应断言
要测试的响应字段:针对响应的不同部分进行匹配。
响应文本、响应code、响应头...
匹配规则:
包括:响应内容包括需要匹配的内容就算成功。
匹配:响应内容要完全匹配匹配内容,不区分大小写。
equals:完成相等,区分大小写。
7.4 断言持续时间
约定响应时间,响应时间如果超出约定,则断言为失败。
7.5 监听器—断言结果
所有脚本的断言结果都会写入这里,可以很清晰的查看请求的结果是否符合预期。
八、关联
关联的意义:接口请求中的某一个变量需要用到上一个接口的某个返回值(或者主键id),此时我们就需要关联。
Cookie管理器关联session。
一个增删改查流程,想要做自动化检验就必须形成一个闭环,那么删除-修改-查看就必须调用同一个必填参数,例如唯一性的id。
JDBC关联
九、参数化
参数化是自动化测试的一种常用方法。通常用法就是将脚本中的某些固定值通过参数来代替,在脚本运行时可以指定参数的取值范围和规则,它可以是常量也可以是变量。这样,脚本在运行时就可以根据需要选取不同的参数值作为输入。它通常被称为数据驱动测试,参数的取值范围被称为数据池。
全局变量在测试计划中设置,作用于整个线程组。
局部变量设置于各个控制器中,通过前置处理器—用户参数或者配置元件——用户定义的变量来设置。
十、常用的函数
Jmeter函数是一种特殊值,可用于除测试计划外的任何组件。
Jmeter函数有两种函数:自定义函数和内置函数。
自定义函数可以通过beanshell脚本来定义。
内置函数是jmeter自带,允许写进任何非控制器测试组件的任何域,这包括取样器,定时器,监听器,修改器,断言,前置处理器,后置处理器和配置元件。
__counter:计数器函数
每次调用计数器函数都会产生一个新值,依据循环次数,每次迭代加1;该函数也有对应的配置元件:计数器,功能类似。
__Random:随机数函数
函数__Random会返回指定最大值和最小值之间的随机数。
__RandomString():随机字符串函数
Random string length:随机字符的长度。
Char to use for random string generation:用来生成随机字符串的字符,可以是纯数字,纯字符,字符字母数字组合。
__time
1、函数__time可以通过多种格式返回当前时间。
2、如果省略了格式字符串,那么函数会以毫秒的形式返回当前时间。其他情况下,当前时间会被转成简单日期格式。
YMD=yyyyMMdd
HMS=HHmmss
_matchNr
用于统计前一个接口返回值的总数。可以给后续的控制器提供可控的循环次数。
十一、必学的Beanshell脚本
Beanshell保存响应内容
利用BeanShell脚本可以提取响应结果并保存到本地文件。如,可以保存cookie相关信息。
在本地新建一个csv文件,新建一个BeanShell PostProcessor后置处理器
参考:https://www.cnblogs.com/canglongdao/p/12986709.html
Beanshell断言
Beanshell断言相对于jmeter自带的断言,比较灵活,也可以自定义断言结果。
参考:https://www.cnblogs.com/canglongdao/p/13025002.html
Beanshell解析jsonlist
将fastjson-1.2.49.jar包置于jmeter的lib目录下,并将该jar包添加到测试计划的Library中,否则会报错。
解析思路
利用beanshell获取到json响应,然后通过JSONObject和JSONArray将数组解析,遍历数组的length之后,提取参数值。
参考:https://www.cnblogs.com/canglongdao/p/13042684.html
Beanshell常用内置变量
Jmeter在BeanShell中内置了变量,用户可以通过这些变量与Jmeter进行交互,主要的变量及其使用方法如下:
log:写入信息到jmeter.log文件,使用方法:log.info("ok?");
vars:操作jmeter变量,它是测试用例与BeanShell交互的桥梁,常用方法:
vars.get(String key):从jmeter中获得变量值。
vars.put(String key,String value):数据存到jmeter变量。
props:操作jmeter属性,该变量引用了Jmeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。
prev:获取前面的sample返回信息,常用方法:
prev.getResponseDataAsString();获取响应信息
prev.getResponseCode();获取响应code
十二、高级测试技巧
录制http/https请求
生成HTML测试报告
jmeter -n -t 路径脚本.jmx -l 路径结果.jtl -e -o 路径HttpReport
参数说明:
-n:非GUI模式执行Jmeter
-t:执行测试文件所在的位置
-l:置顶生成测试结果的保存文件,jtl文件格式
-e:测试结束后,生成测试报告
-o:指定测试报告的存放位置
上传文件到服务器
首先确认你的文件名称,参数名称,MIME类型,这些可以从接口文档里面获取,或者直接在页面抓包然后从请求头里面查看。注意,文件名称可以写成绝对路径。
其次,Advanced里面选择java类型,切记。 执行脚本之后,文件会上传到服务器上。
内存溢出解决方案
内存泄露是指你的应用使用资源之后没有及时释放,导致应用内存中持有了不需要的资源,这是一种状态描述。
内存溢出是指你应用的内存已经不能满足正常使用了,堆栈已经达到系统设置的最大值,进而导致奔溃,这是一种结果描述。
通常都是由于内存泄露导致堆栈内存不断增大,从而引发内存溢出。
在利用jmeter测试过程中,如果内存溢出的话,一般会出现这个提示:java.lang.OutOfMemoryError:java heap space:意思就是堆内存溢出,不够用了。
HEAP最多设置为物理内存的一半;
NewSize:表示新生代的内存空间
NewRatio:表示新生代和老年代的比例。此处新生代:老年代=1:2
SurvivorRatio:表示伊甸园和space的比例。此处伊甸园:space=8:2
跨线程组的关联
Jmeter的接口关联通常只在当前线程中实现。如果想要实现跨线程的关联,需要一些小技巧。
跨线程传递参数
可以在BeanShell Sampler中用${__setProperty(,,)}函数实现。它可以将需要关联的参数设置为系统属性。
比如我们利用正则表达式提取了title,紧接着就可以在BeanShell Sampler将其设置为全局变量。
后续在其它的线程中如果需要关联这个title,需要用到${__P(,)}函数来调用它。