Jmeter检查点/断言
在上一章节中,我们通过调试脚本,通过人工验证脚本可以完成业务功能,
但在性能测试中,我们希望能通过自动验证脚本是否完成业务功能,在Jmeter
中我们可以通过检查点,也就是断言来实现自动验证脚本的正确性。
断言组件:
Jmeter通过断言组件完成断言、自动验证的功能。
断言组件通过获取服务器响应数据,然后根据断言规则去匹配响应数据;
正常匹配脚本不会出现任何问题或者提示,如果匹配不到,就会出现异常情况,
此时Jmeter就会判断这个事务失败,那么我们在察看结果树中看到的请求名称
是红色字体。
通过右击单个请求-添加--断言,可 以看到Jmeter的断言元件非常多,一
般常使用的是响应断言(Response Assertion)。
响应断言既是对服务器的响应数据进行规则匹配。
响应断言界面如下:
响应断言界面介绍:
名称、注释、Apply之前在讲正则表达式提取器的时候介绍过,不做重复讲解。
要测试的响应字段:针对响应数据的不同部分进行匹配,包含如下7个部分。
响应文本:服务器返回的响应文本内容,HTTP协议排除Header部分
Document(text):对文档内容进行匹配。
URL样本:匹配URL链接。
响应代码:匹配响应代码,如”200”。
响应信息:匹配响应信息,如"0K"。
Response Headers:匹配响应中的头信息。
Ignore Status:一个请求有多个响应断言,当第一个断言设置该选项,那么如果第一个断言失败后,第二个断言成功,事务还是成功状态。
模式规则匹配:包含如下5个部分。
包括:响应内容包括需要匹配的内容,支持正则表达式。
匹配:响应内容要完全匹配需要匹配的内容,大小写不区分,支持正则表达式。
Equals:响应内容要完全与需要匹配的内容相同,区分大小写,不支持正则表达式
Substring:响应内容包含需要匹配的内容,区分大小写,不支持正则表达式。
否:选择Equals、Substring时匹配的是字符串,大小写敏感,选择此项类似降级。
要测试的模式:填入需要匹配的字符串或者正则表达式。
Jmeter事务
Jmeter能够做到把每个请求统计成一个事务,但事务一般是用户宏观上的概
念,所以系统把多个请求统计成一个事务, 在Jmeter中可以通过逻辑控制器下的事务控制器来完成此要求。
逻辑控制器概念:
逻辑控制器可以控制采样器(samplers)的执行顺序。由此可知,控制器需要
和采样器一起使用,否则控制器就没有什么意义了。放在控制器下面的所有的采样器都会当做一个整体,执行时也会一起被执行。
逻辑控制器分类:
a)控制测试计划执行过程中节点的逻辑执行顺序,如:循环控制器(Loop
Controller)、如果控制器(If Controller)等;
b)对测试计划中的脚本进行分组、方便]Meter统计执行结果以及进行脚本的
运行时控制等,如:吞吐量控制器(Throughput Controller)、事务控制器
(Transaction Controller)等。
我们需要做Jmeter的事务操作,所以需要用到事务控制器。
事务控制器界面如下:
Generate parent sample:如果事务控制器下有多个采样器(请求),勾选后,在察看结果树中不仅可以看到事务控制器,还可以看到每个采样器;并且事务控制器定义的事务是否成功取决于子事务是否都成功,任何一个失败代表整个事务失败。
Include duration of timer and per-post processors in generated sample:是否包括定时器、预处理和后期处理延迟的时间,选中这一项会统计定时器(timer)的时间,否则只统计采样器(sample)的时间。
Jmeter集合点
在做性能测试过程中,我们会根据场景做狭义的并发,这个时候就需要用到
集合点,集合点能够尽量让虚拟用户同一时刻发送请求,在Jmeter中集合点是通过定时器来完成的。
定时器概念:
Jmeter定时器用来控制取样器的执行时机,有固定定时器,随机定时器等。
要实现集合点,一般我们需要用到同步定时器来进行控制。
同步定时器(Synchronizing timer)概念:
同步定时器用来保证取样器在同一-时刻向服务器发起负载,考虑到线程运行
的时间快慢与场景的需要,也提供了同步线程数量的设置。如下图界面:
同步定时器界面字段说明:
名称、注释与之前元件一样可以随意设置。
Number of Simulated Users to Group by:
每次释放的线程数量。如果设置为0,等同于设置为线程组中的线程数量。
Synchronizing timer仅作用于同-个JVM中的线程,所以,如果使用并发测试,确保"Number of Simultaneous Users to Group by"中设置的值不大于它所在线程组包含的用户数。
Timeout in milliseconds:
如果设置为0,Timer将会等待线程数达到了" Number of Simultaneous Users to Group"中设置的值才释放。如果大于0,那么如果超过Timeout in milliseconds中设置的最大等待时间[毫秒为单位)后还没达到"Number of Simultaneous Users to Group"中设置的值,Timer将不再等待,释放已到达的线程。
如果设置Timeout in milliseconds为0,且线程数量无法达到"Number of
Simultaneous Users to Group by"中设置的值,那么Test将无限等待, 除非手动终止。Timeout in milliseconds中设置的单位是毫秒。
同步定时器使用说明:
Synchronizing Timer是在每个sampler (采样器)之前执行的,而不是
之后,不管这个定时器的位置放在sampler之后,还是之前,执行请求A和请
求B前都会执行同步定时器如下左图所示:
当执行一个sampler之前时,和sampler处于相同作用域的定时器都会被执行;如果希望定时器仅应用于其中一个sampler,则把该定时器作为子节点加入,如上右图定时器仅仅对请求B起作用,即仅在请求B执行前执行定时器,和请求A无关
Jmeter参数化
在做性能测试过程中,一般我们需要模拟多个用户进行操作,为了满足实际
场景,模拟真实的用户行为,我们需要做到模拟的用户帐号或其它信息都是不同的,这时我们就需要用到参数化。在Jmeter中, 配置元件可以解决此问题。
配置元件概念:
JMeter配置元件可以用来进行参数化、初始化默认值和变量、存储服务器的
响应信息以及配置链接数据库等。JMeter参数化一般使用配置元件中的CSV Data
Set Config或者JDBC Connection Configuration来进行参数化
CSV Data Set Config元件:
该元件可以用来读取csv或dat文件的数据(一行一行读取),然后通过设置
把读取到的数据关联到Jmeter中的变量保存。csv文件可以使用execl表格工具去进行编辑。
JDBC Connection Configuration元件:
该元件可以用来进行数据库的连接,然后通过JDBC Request元件发送数据库
请求数据库中的表中的数据,再通过正则表达式提取器关联到Jmeter中的变量保存。
CSV Data Set Config界面如下:
界面字段说明:
名称、注释与之前元件一样可以随意设置。
Filename:指保存信息的文件目录,可以相对或者绝对路径,相对路径从Jmeter
的启动目录(***/bin)路径。
File Encoding:文件编码,默认为ANSI, 建议设置为utf-8,防止遇见乱码情况。
Variable Names:参数名称,每个名称中间用分隔符分割,分隔符使用下面的“Delimitet”中定义的,默认用逗号隔开,与参数文件的参数对应。如果设置的参数
名称多于参数文件中的参数,多余的参数取不到值;反之参数文件中的参数将没有
参数对应。
Delimitet:定义分隔符,用于分隔文件中的参数,及上述Variable Names中定义的
参数名称。
Allow Quoated data?:是否允许引用数据,设置为True,设置文件中的参数值都必
须用引号引起来,False则不需要
Recycle on EOF ?:遇到文件结束符时,是否从头开始循环读入,设置为True,则从
头开始继续循环
Stop Thread on EOF ?2:当Recycle on EOF设置为False并且Stop Thread on EOF为True,则读完csv文件中的记录后,停止运行
Sharing Mode:参数文件共享模式,有三个设置,说明如下:
All threads:参数文件对所有线程共享,包含同一测试计划中的不同线程组。
Current thread group:只对当前线程组中的线程共享。
Current thread:仅当前线程获取。
在实际性能测试过程中,比如测试发帖的场景,由于每次发送相同的内容会被论坛系统屏蔽,这时我们根据之前的方式做成参数化,如果我们希望每次发帖的内容是随机的,这时可以借助]meter随机数函数。
Jmeter随机数函数使用如下:
1、点击菜单栏-选项--函数助手对话框--“选择一个 功能”下拉框选择_ Random String,生成一个随机字符串;
2、设置Rondom String length,即设置生成随机字符串的长度;
3、设置Chars to use for random string generation,指定用哪些字符作为种子进行随机生成,支持中文、数字、字母等;
4、Name of variable in which to store the result (optional):函数名称(只是用来存储变量的名称,不可以${名称}使用), 可选项,如果填写,运行脚本后可在Debug Sampler中看到这个变量的值;
5、点击生成按钮,自动生成一个字符串, 把该字符串替换到需要用到随机数参
数的地方即可。
在性能测试过程中,经常会遇见脚本开发时与测试执行时的服务器地址不一样,如果我们把服务器地址写死,修改起来就很麻烦,为了解决环境切换修改脚本的问题,我们常把访问地址进行参数化,当执行性能测试的环境变化后,我们只需要把参数对应的值改动一下就可以了。
右击线程组--配置文件--用户定义的变量.打开界面如下:
配置好URL和PORT变量后,在其它元件中使用${URL}引用变量即可。
如果是手动开发Jmeter脚本,在GUI界面添加多个请求的时候,由于都是测试同一服务器,所以每个请求编写的过程中一些公共的部分比如服务器IP、端口等每次都需要重新写一遍,这个时候可以使用Jmeter提供的HTTP请求默认值,把重复的内容分离出来,只需要定义一次。
HTTP请求默认值使用:
添加方法:线程组-->右键添加-->配置元件--> HTTP请求默认值。
和采样器的HTTP请求界面大致相同,配置好之后,之后写HTTP请求不需要填写该部分,采用该处的默认值。如下图所示: