jmeter性能测试(一)

一、初识 jmeter
1. jmeter组成
  • 测试计划:是一个组件的名字
  • 线程组:要做的就是控制多线程并发
  • 断言:你的预期结果和实际结果进行一个比对
  • 定时器:定时器就是你在操作线程的时候,让它停顿多长时间,什么样的条件停顿,集合点等等的一些操作
  • 监听器:监听器可以用来调试我们的脚本,比如说查看结果树,并且对一些资源来进行监控
  • 配置元件:配置元件很重要,在做网络并发的时候,http协议这种,怎么获得这个,怎么去做一些基本的配置项,在做真正的并发之前,需要有哪些配置信息,可以自定义一些变量,也可以做一些数据库的连接信息,比如哪个数据库,哪个端口号,数据库用户名密码等,都需要通过配置元件来配置
  • 后置处理器:就是你在并发完成之后想要做些什么,比如关联,就是后一个请求需要前一个请求的返回结果,这个时候需要后置处理器来处理达到关联的效果。
  • 前置处理器:在请求发送之前要做的事情
  • 逻辑控制器:当什么条件满足什么条件时需要去做什么
  • Sampler:放的所有的真正意义上的请求
2. jmeter实现多并发
  • 线程组:负载发生器,用多线程或多进程的方式来模拟用户的使用行为。jmeter是以线程的方式来进行模拟用户的并发访问的。
3. jmeter实现逻辑分支控制
  • 逻辑控制器: 逻辑控制器可以控制采样器( Samplers )的执行顺序。用来控制测试脚本的逻辑判断,也可以理解为如何控制脚本的运行。例如:如果控制器,就是当满足什么样的条件后执行哪一步操作。
  • 使用场景:判断多并发用户根据你的业务逻辑往哪个业务逻辑分支走的
JMeter提供了多种逻辑控制器,它们各个功能都不相同,大概可以分为两种使用类型:
  • 控制测试计划执行过程中,节点的逻辑执行顺序,如: ForEach Controller (ForEach控制器), Loop Controller (循环控制器)、 If Controller (如果if控制器)等;
  • 对测试计划中的脚本进行分组,方便JMeter统计执行结果,以及进行脚本的运行时控制等,如: Throughput Controller (吞吐量控制器)、 Transaction Controller (事务控制器)等。
如果(If)控制器组件界面说明:
  • 名称 如果(If)控制器 组件的自定义名称,见名知意最好。
  • 注释 :即添加一些备注信息,对该 如果(If)控制器 组件的简短说明,以便后期回顾时查看。
  • Expression (must evaluate to true or false) :填写条件表达式,评估结果必须为真或假。
    换句话说,是执行流程验证的条件,用于决定是否应执行子元件。默认情况下,条件被解释为 true false JavaScript 代码。
  • Interpret Condition as Variable Expression? :将条件解释为变量表达式?
    意思是说:
    如果不勾选此选项,则输入的条件表达式,将会使用 JavaScript 进行解析,得到需要的 true/false 结果。
    如果勾选此选项:
    1)输入的条件表达式,不会使用 JavaScript 进行解析,而是将条件视为JMeter的变量。
    2)如果需要进行条件判断,则需要使用 __jexl3 或者 __groovy 函数,来生成函数表达式。通过函数表达式,得到需要的 true/false 结果。
  • Evaluate for all children? :条件作用于每个子项进行评估。
    如果勾选该项,则该控制器在每一个子节点执行时前,执行一次。
    默认情况下,该控制器可以对在其下面的所有可运行的组件,进行控制执行,但只在入口执行一次。
  • 说明:
  • For performance it is advised to check "Interpret Condition as Variable Expression"
    and use `__jexl3` or `__groovy` evaluating to true or false or a variable that contains true or false.
    ${JMeterThread.last_sample_ok} can be used to test if last sampler was successful
意思为:
  • 为了提升性能,建议将“将条件解释为变量表达式”勾选。
  • 并使用 __jexl3 或者 __groovy 函数,来评估表达式条件的真假。
  • 并且 ${JMeterThread.last_sample_ok} 变量,可用于测试最后一个采样器是否成功。
默认“将条件解释为变量表达式”是勾选状态,取消勾选,则上面的提示会变红。

3、如果控制器的使用

(1)测试计划内包含的元件

添加元件操作步骤
  1. 创建测试计划。
  2. 创建线程组: 选中“测试计划”右键 —> 添加 —> 线程(用户) —> 线程组
  3. 在线程组中,添加逻辑控制器 “如果(If)控制器” 组件: 选中“线程组”右键 —> 添加 —> 逻辑控制器 —> 如果(If)控制器
  4. 在逻辑控制器中,添加取样器“HTTP请求”组件: 选中“逻辑控制器”右键 —> 添加 —> 取样器 —> HTTP请求
  5. 在线程组中,添加监听器“察看结果树”组件: 选中“线程组”右键 —> 添加 —> 监听器 —> 察看结果树
最终测试计划中的元件如下:
点击运行按钮,会提示你先保存该脚本,脚本保存完成后会直接自动运行该脚本。

(2)如果控制器界面内容

我们演示使用JavaScript解析表达式的用法,步骤如下:
  1. 取消勾选 Interpret Condition as Variable Expression? 选项,否则将不能使用 JavaScript 解析表达式。
  2. 在条件输入框中,输入最基本的条件表达式即可。
我编写了一个恒true的表达式,如下图所示:

(3)HTTP请求界面内容

一个标准的 Get请求,访问百度首页,不做过多说明。
如下图所示:

(4)运行结果

因为如果(If)控制器中的表达式为true,所以可以执行它下面的所有取样器请求。
如下图所示:
如果(If)控制器中的表达式解析结果为false,则该控制器下面的请求则不执行。

4、如果控制器中表达式的写法

如果(If)控制器中的表达式有两种方式:
  1. 一种使用 JavaScript 语言解析条件表达式,表达式为基本的条件表达式写法。
  2. 另一种是使用 __jexl3 或者 __groovy 函数,通过函数表达式,得出我们需要的 true false 结果。

(1)使用JavaScript语言解析表达式

即:取消勾选Interpret Condition as Variable Expression?选项。
最基本的几种写法:
  1. 数字判断表达式: ${var}==1
  2. 字符串判读表达式: "${var}"=="字符串"
    提示:如果 ${var} 参数化变量取到的值本身就带双引号,则前边不需要加双引号。
  3. 如果 ${var} 参数化变量的值就是一个布尔值,则表达式为: ${var}
    但是要注意,布尔值变量必须都是小写的。
说明:${var}表示参数化变量的引用。我们可以引用自定义变量,或者CSV文件读取到的数据,在或者是上一个请求中提取来的值。

(2)使用函数来编写条件表达式

即:勾选Interpret Condition as Variable Expression?选项。
我们需要用到函数助手中的__jexl3或者__groovy函数,直接输出true/false结果。
下面以__jexl3函数为示例,进行演示。
__jexl3函数界面如下:
参数说明:
  • JEXL expression to evaluate :填写要计算的表达式。
  • Name of variable in which to store the result (optional) :给函数结果定义一个可被引用的变量名(可选)。
__jexl3函数条件格式:${__jexl3(条件表达式)}
  • == 是否等于,如 ${__jexl3(${VAR}==1,)} ,判断 ${VAR} 变量是否等于1。
  • != 不等于,如 ${__jexl3(${VAR}!=1,)} ,判断 ${VAR} 变量是否不等于1。
  • ! 非,如 ${__jexl3(!(${VAR}!=1),)} ,对 ${VAR}!=1 的结果取反。
  • && 且和 || 或,如 ${__jexl3(${VAR}==1 && "${name}" != "张三",)}
  • > 大于或者 >= 大于等于,如 ${__jexl3(${count}>=10,)}
编辑好的界面内容如下:
提示:
  1. 把生成的 __jexl3 函数表达式,粘贴到 如果(If)控制器 界面中。
  2. 看到 The result of the function is 中有值,说明表达式正确,但是上面返回false这个值,不一定正确,还要看脚本运行中实际的结果。
这样就完成了使用__jexl3函数编写表达式的用法。(__groovy函数同理)
说明:
尽可能使用"解释条件作为变量表达式"选项,然后使用__jexl3或者__groovy函数生成条件表达式。
因为运行模拟大量用户的性能脚本时,这样消耗的资源最小。
WHY?
If Controller使用JavaScript解释条件,是每个解释都占用资源,但本来就是一个测试性能的软件,不应因解析条件而消耗更多的资源。
即:如果你使用“解释条件作为变量表达式”,而不是使用Javascript解释表达式,这样能节省更多的性能资源。

(3)Evaluate for all children?选项说明

如果你勾选了Interpret Condition as Variable Expression?选项,同时也勾选了Evaluate for all children?选项。
则填写在如果(If)控制器中的表达式,需要为${JMeterThread.last_sample_ok}
${JMeterThread.last_sample_ok}表达式的意思是:检查上一个请求是否成功。
而整个控制流程的效果是,控制其下的所有取样器:
  1. 如果前一个请求为成功,则 ${JMeterThread.last_sample_ok} 为true,否则为false。
  2. 下一个请求拿 ${JMeterThread.last_sample_ok} 的值来判断是否执行,如果为true,则继续执行,如果为false则不执行,且后边的所有请求都不执行。
如下图所示:

5、拓展

有一个小示例:我准备了20多条测试数据,但是我只想执行指定的几个测试数据。
有什么解决办法吗?
测试数据如下所示:
(1)需求:执行指定的用例5
这时我们可以id为作为条件判断,来执行用例5。
表达式为:${__jexl3(${id} == 5,)}
(2)需求:执行奇偶数用例
  • 执行奇数用例,表达式为: ${__jexl3(${id}%2 == 1,)}
  • 执行偶数用例,表达式为: ${__jexl3(${id}%2 == 0,)}
(3)执行多条随机指定用例
  1. 5条以内用 || 来解决。
  2. 5条以上,使用在构造数据中打标签的方式来实现。
  3. run 字段,1表示执行,0表示不执行。
  4. 表达式为: ${__jexl3(${run} == 1,)}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值