Nicole2333

导航

常用逻辑控制器-jmeter

JMeter中的Logic Controller用于为Test Plan中的节点添加逻辑控制器。分为两类:
一类用来控制Test Plan执行过程中节点的逻辑执行顺序,如: Loop Cortroller,If Controller等;
另一类则与节点逻辑执行顺序无关,用于对Test Plan中的脚本进行分组、方便JMeter 统计执行结果以及进行脚本的运行时控制等,如: Throughput Controller,Transaction chroller.

代码的逻辑分支通常有:

条件判断IF

多条件选择Switch

循环While/For这些逻辑控制可以分别通过Jmeter的IF控制器,Switch分支控制器,While循环控制器,ForEach循环控制器,循环控制器 来实现。

IF控制器

IF控制器实现了代码中IF的功能,通过判断表达式的True/False来判定是否执行相应的操作。

示例场景:判断用户角色是否为tester,如果是tester,则执行baidu搜索功能

Expression (must evaluate to true or false) :表达式(值必须是true或false),也就是说,在右边文本框中输入的条件值必须是true 或 false,(默认情况下)

Interpret Condition as Variable Expression?:默认勾选项,将条件解释为变量表达式(需要使用__jexl3 or __groovy 表达式)

Evaluate for all children?:条件作用于每个子项(具体理解见后面的列子说明)

注:

1、文本框上的黄色感叹号,就是提示你,建议采用__jexl3 or __groovy 表达式,以提高性能,也就是默认的方式。

2、if 控制器 只能作用于其下的子项

 新建"配置元件->用户定义的变量"模拟脚本运行过程中生成的变量role,并指定值为tester

 新建if控制器,通过表达式指定if的判断条件。Jmeter的If控制器支持__jexl3或者是groovy语言,在Jmeter的if控制器中填入表达式时,不能直接编写表达式语言,而是要借用Jmeter的函数生成器,生成指定语言的表达式。

需要注意的是自动生成的表达式不带“”,这会导致访问百度的请求不被执行,加上“”之后请求才会执行,或者直接在写表达式评估时加上双引号,这样生成的表达式也是带双引号的

  在IF控制器下新建相应的操作步骤,此处发起一个baidu的Http请求;实际应用中,根据业务流编写IF控制器内的操作,当IF条件为true时,会执行其中的步骤;当IF条件为false时,会跳过IF控制器内部的步骤。点击运行脚本,通过查看结果树可以发现IF控制器中的"请求百度"被执行。

 更改用户定义的变量为其他值使得IF条件表达式的值为false,再运行脚本,会发现IF控制器中的"请求百度"语句不会被执行。

Swicth控制器

Swicth控制器实现了编程语言中的Switch功能,通过动态的值选择要执行的语句,相对于if控制器的true/false判断,它通过顺序值(从0开始)来指定要运行的语句。示例场景:根据不同输入值调用不同的搜索引擎(baidu,bing,sougou)进行查询

 新建"配置元件->用户定义的变量"模拟脚本运行过程中生成的变量index,并指定index=0

 新建Switch控制器,并在Switch控制器下新建三个Http请求,分别代表请求baidu,请求bing,请求sougou

  运行脚本,察看结果树,会发现此时会运行baidu; 依次变更index的值为1和2,会相应的运行bing和sougou。通过本示例可以看到Switch控制器会读取index变量,并根据Switch控制器下的请求顺序执行相应的操作。

 While控制器

While控制器实现了编程语言中的循环控制功能,当表达式的值为true时会一直执行循环,直到表达式不满足特定的条件,可以应用到需要根据程序运行状态来判定循环是否继续的场景。

<1>空:如果Condition取值为空,则该Condition迭代执行Controller下的所有子节点,直到最后一个子节点返回失败为止。需要注意的是,如果不是最后个子节点失败,而是该Controller中的其他子节点失败,该Controller不会停止。而会继续循环执行过程。

<2>LAST :如果Condition取值为字符串LAST,则该Controller迭代执行Controller 下的所有子节点,直到最后一个子节点返回失败为止(与Controller为空时的行为相同)。同时,如果该Controller的上一个节点失败。则Test Plan在执行时不会进入该Cortrller。

<3>表达式:如果Condition取值为表达式,如果表达式的取值达到false,则退出循环。示例:

◆${VAR} :当参数VAR的值被设置成false时退出循环。
◆${ javascript( "${VAR}" ==” 51zxw" :当参数 VAR的值不为51zxw时退出循环。

示例:初始值为1,每运行一次加1,直到值大于3时停止循环

 

 新建循环控制器,指定循环运行条件,此处和IF控制器的表达式类似,通过groovy或者是javascript语言来申明表达式

 新建BeanshellSampler,通过代码实现每运行一次,start值加1。因为vars.get的值和vars.put的值都是String类型,此处需要进行String和int类型的转换

 

beanshell 语法

运行脚本,通过查看结果树可以发现BeanshellSampler一共被调用了2次,满足While控制器中定义的条件

 

 循环控制器Loop Controller

Jmeter 提供循环控制器可以实现循环调用指定次数的逻辑操作示例:发起5次baidu调用请求

 运行脚本,可以从查看结果树中看到,baidu被调用了5次

 For Each控制器

Jmeter ForEach控制器可以实现”条件"循环调用,比循环控制器的功能的更强大,它可以读取一组变量,然后根据不同的变量值去循环发起请求示例:循环删除查询到的数据

循环读取自定义变量示例

添加-->配置元件-->用户自定义变量,定义变量注意命名格式:变量名+下划线+数字(从1开始计数)之所以这样命名是为了满足以后ForEach控制器提取数据。

变量前缀:就是刚才我们定义用户自定义变量下划线前面的字符串
取值范围:上图表示1<user<4,表示从数组user游标位置为1开始取值(而数据从0开始计数),到游标位置为4结束(但是不包括5 ),所以会从数组变量的第二位开始,遍历3次,

即:datou2, datou3,datou4
输出变量名称:我们将每一次得到的用户自定义变量user存储到参数foreach_user中

循环删除示例

 调用上游接口,查询数据

 提取查询结果,获取查询到的一组用户id数据

 新建ForEach控制器,指定输入变量为上游接口提取的变量,以及输出变量名

 在ForEach控制器中通过输出的变量去循环删除查询到的所有用户

 运行脚本,查看结果,可以看到成功的删除了查询到的数据

 

交替控制器

       

 循环执行这三个请求而不是每个请求执行三次

 

Once Only Controller 仅一次控制器

是为了让TestPlan中的某些内容在整个Test Plan的执行期间对每个线程仅执行-次 (例如,每个线程仅需要执行一次“登录"操作).如:将Once Only Cortroller作为Loop Controller的子节点,Once OnlyController在每次循环的第一次迭代时均会被执行。

Random Controller

 从子节点中随机执行一个

Random Order Controller

按照随机顺序执行所有子节点

事务控制器(Transaction Controller)

 

务控制器会产生一个额外的取样器(sampler),用来计算衡量它所包含的所有测试组件(比如包含2个http采样器)的总体时间。在”查看结果树”中,事务控制器只有在其子采样器都成功的情况下才显示成功。

 

注意:不只是采样器,包含该控制器范围内的所有测试组件。这个时间可能略大于单个采样器的时间之和。由于时钟频率的问题,时钟开始时间介于控制器记录开始时间与第一个采样器开始之间 ,时钟结束时间亦然。

Generate Parent Sample:默认不勾选,聚合报告(Aggregate Report)中显示如下:

jmeter-Transaction

勾选Generate Parent Sample后,聚合报告仅显示事务采样器采集的数据,而不会显示子采样器采集的数据,聚合报告(Aggregate Report)中显示如下:

jmeterTransaction

勾选Generate Parent Sample后,事务控制器下的各个采样器只有在查看结果树里才能看到。同时,子采样器的数据也不会在CSV文件中显示,但是在XML文件中可以看到。

事务控制器是添加到其下采样器后面的(不勾选Generate Parent Sample)

事务控制器是作为其下采样器的父控制器(勾选Generate Parent Sample)
生成的事务控制器的测量时间包括其下采样器以及其他一切时间。

 

posted on 2020-03-20 11:25  Nicole2333  阅读(304)  评论(0编辑  收藏  举报