发布时间:2024-07-07 19:01
前言:
今天这篇文章是jmeter性能测试的第二阶段的文章,后续还会更新更多牛逼哇赛的干货哈,喜欢的兄弟们点点关注铁铁
条件解释为变量表达式(interpret condition as variable expression):如果勾选该项,那么变量表达式会进行求值,并与“ture”或“false”进行比较,而无需使用JavaScript
对所有子条件执行(evaluate for all children):如果勾选该项,则该controller在没一个子节点执行时执行一次;
默认情况下,该控制器可以对包含在其下面的所有可运行的元素进行执行,但只在入口执行一次
百分比执行和总执行
总执行(Total Executions):使控制器停止执行一定数量的测试计划
百分比执行(Percent Executions):使控制器按一定比例执行迭代的测试计划
流量(Throughput):对应上面的执行数量或者比例
每个用户(Per User):每个用户
如果勾选此项,将导致控制器计算是否应该执行在每个用户(每个线程)的基础上;如果不加以控制,那么将计算全球所有用户
与Random Controller不同的是,这个控制器会先将需要随机的内容均执行一遍,但次序不定
· 模块控制器,用于跳转到选定的控制器位置并执行对应的控制器
· 应用场景: 业务逻辑的跳转
配制说明
· Module to Run: 选择需要跳转到的目标控制器
5.5、定时器(Timer)
用户实际操作时,并非是连续点击,而是存在很多停顿的情况,例 如:用户需要时间阅读文字内容、填表、或者查找需要点击的链接 等。为了模拟用户实际情况,在性能测试中我们需要考虑操作时间。 若不认真考虑操作时间很可能会导致测试结果的失真。例如,估计的 可支撑用户数可能会偏小。
在性能测试中,访问请求之间的停顿时间被称之为思考时间。 那么如何模拟这种停顿呢?我们可以借助JMeter的定时器元件实现。
Jmeter中的定时器一般被我们用来设置延迟与同步(操作之间的等待时间)。定时器的执行优先级高于Sampler(取样器),在同一作用域(例如控制器下)下有多个定时器存在时,每一个定时器都会执行,如果想让某一个定时器进队某一Sampler有效,则可以把定时器加在此Saopler节点下。
Jmeter自带的定时器,如下图所示:
Constant Timer 固定定时器
作用:通过ThreadDelay设定每个线程请求之前的等待时间(单位为毫秒)。注意:固定定时是有作用域的,放到线程组下其作用域是所有请求都会延迟固定器设置的时间,如果放到请求内,作用域是单个请求延迟时间(常用)。
Uniform Random Timer 均匀随机定时器
作用:它产生的延迟时间是个随机值,而各随机值出现的概率均等。总的延迟时间等于一个随机延迟时间加上一个固定延迟时间,用户可以设置随机延迟时间和固定延迟时间。
总延迟时间=指定范围内的随机时间+固定延迟时间。
Constant Throughput Timer 固定吞吐量定时器
Gaussian Random Timer 高斯随机定时器
JSR223 Timer JSR223定时器
Poisson Random Timer 泊松随机定时器
Synchronizing Timer 同步定时器
作用:用来设置集合点,其作用是:阻塞线程,直到指定的线程数量到达后,再一起释放,可以瞬间产生很大的压力
(1)Number of Simulated Users to Group by:模拟用户的数量,即指定同时释放的线程数数量,若设置为0,等于设置为线程组中的线程数量;
(2)Timeout in milliseconds:超时时间,即超时多少毫秒后同时释放指定的线程数;如果设置为0,该定时器将会等待线程数达到了设置的线程数才释放,若没有达到设置的线程数会一直死等。如果大于0,那么如果超过Timeout inmilliseconds中设置的最大等待时间后还没达到设置的线程数,Timer将不再等待,释放已到达的线程。默认为0
同步定时器(Synchronizing Timer)的超时时间设置要求:超时时间 > 请求集合数量 * 1000 / (线程数 / 线程加载时间)
BeanShell Timer BeanShell脚本编写定时器
参数说明:
Reset Interpreter:每次迭代是否重置解析器,默认为false;在长时间运行的脚本中建议设置为true。
Parameters:BeanShell脚本的入参。入参可以是单个变量;也可以是数组,若是字符串数组,两个元素之间用空格隔开;也可以是常量。
File Name:BeanShell脚本可以从脚本文件中读取。
Script:在Script区直接写BeanShell脚本。
增加一个Java Request请求,并且增加时间验证是否按照自己设定的定时运行脚本:
Java Request ${__time(yyyy-MM-dd HH:mm:ss:SSS,)}
增加结果查看树:结果显示按之前设置的每个1秒钟运行
Precise Throughput Timer 精准吞吐量定时器
5.6前置处理器
前置处理器是在取样器发出请求之前执行一些操作。即:如果将强制处理器附加到取样器原件,则他将在该取样器原件运行之前执行
前置处理器蛀牙是用来处理,请求在实际发送之前的一些准备工作,比如取样器参数设置,环境变量设置,脚本预处理等操作
例如当URL中有sessionID一类的session信息时,可以通过该处理器填充发出请求实际的sessionID
Jmeter自带的前置处理器,如下图所示
5.6.1 HTML Link Parser(HTML链接解析器)
HTML链接解析器,用于从前一个sampler返回的html页面中按照规则解析链接和表单,再根据此处理器所在的sampler中的规则进行匹配修改,而后该sampler会执行;
此处理器无配置,使用示例如下: 如下示例中执行说明为: 1. 发送sampler“搜索”并返回HTML页面; 2. sampler“点击链接”中下的HTML链接解析器会将步骤1中返回的HTML页面根据“点击链接”这个sampler设置的规则进行解析并将解析结果发送给sampler“点击链接”; 3. sampler“点击搜索”发送;
HTTP URL Re-writing Modifier(HTTP URL重写修改器) HTTP URL重写修改器,此处理器与HTTP Link Parser类似,但专用于使用url重写来存储sessionId而非cookie的http request,在线程组级别添加此修改器则应用于所有sample,若为单个sample添加则只适用该sample;
参数配置: Session Argument Name:会话参数名称,用于搜索sessionId,其他sample也可通过此参数来 调用其获取的sessionId; Path Extension:路径扩展,如url添加了分号作为分割,则勾选此项; Do not use equals in path extension:用于url不用等号来分割key和value的类型; Do not use questionmark in path extension:用于不带?的类型; Cache Session Id?:勾选此项则会存储在其挂载的sample上获取到的sessionId供后边的其他sample使用; URL Encode:是否使用url编码;
User Parameters(用户参数)
用户参数,用于做几组参数给线程组的各个线程使用,如果线程数多于用户参数组数,则多出来的线程则从第一组用户参数开始依次调用参数组;
参数配置: Name:此前置处理器的名称; Update Once Per Iteration:标识是否每轮迭代更新一次元素;
JDBC PreProcessor(数据库预处理器)
数据库预处理器,用于在sample开始前查询数据库并获取一些值;
参数配置: Variable Name of Pool declared in JDBC Connection Configuration:连接池名称,需与JDBC链接配置中的Variable Name相同(此预处理器需要一个JDBC Connection Configuration,此配置器在配置元件中); Query Type:数据库查询类型,根据需要自行选择; Query:数据库语句输入框,根据需要输入,注意结尾不要加”;”; Parameter values:参数名称,如果Query的语句中有”?”则此处填值,可以使用调用参数方式; Parameter types:参数类型,与Parameter values对应,设置参数类型,与sql字段类型相同; Variable names:设定此项可以获取固定列的所有值; Result variable name:随意设定一个名称,则此名称会被作为一个参数并对应Query出来的内容;可以使用参数调用的方法来获取此设置的名称对应的值; Query timeout(s):超时时间; Handle ResultSet:有四个选项,结果保存的方式;
RegEx User Parameters(重要)
正则表达式,使用正则表达式为从另一个HTTP请求中提取的HTTP参数指定动态值
参数配置: name:此前置处理器名称; Regular Expression Reference Name:调用的正则表达式提取器中的引用名称; Parameter names regexp group number:用于提取参数名称的正则表达式的组编号; Parameter values regex group number:用于提取参数值的正则表达式的组编号;
Sample Timeout
超时器,用于设定sample的超时时间,如果完成时间过长,此预处理器会调度计时器任务以中断样本;
参数配置: name:超时器名称; Sample timeout:超时时间;
JSR223 PreProcessor
JSR223预处理器,用于调用脚本;
参数配置: Name:名称,随意设定; Language:使用的JSR223语言,可根据需要选择; Parameters:传递给脚本的参数; Script file:脚本文件; Script compilation caching:存储编译的脚本,默认勾选; Script:要运行的脚本; 脚本中可用参数说明: vars:操作Jmeter变量 a) vars.get(“name”):从jmeter中获得变量值 b) vars.put(“key”,”value”):保存数据到jmeter变量中,如果变量不存在会自动创建 props: 操作Jmeter属性 a) props.get(“START.HMS”); 注:START.HMS为属性名 b) props.put(“PROP1”,”1234”); 保存数据到Jmeter属性中,如果属性不存在会自动创建 log: 记录日志 比如log.info(“日志信息”); 具体查看: https://www.slf4j.org/api/org/slf4j/Logger.html ctx: 操作上下文,具体查看: http://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterContext.html prev: 操作前一个请求。注意必须有前一个请求才可用,否则会报错,具体查看: http://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html sampler: 操作当前请求。具体查看: http://jmeter.apache.org/api/org/apache/jmeter/samplers/Sampler.html
BeanShell PreProcessor
BeanShell预处理器,语法使用与BeanShell Sampler是一样的。但可使用的内置变量稍有不同;
参数配置: Reset bsh interpreter beford each call:是否重新构造interpreter,即是否重新初始化 Paraneters:BeanShell 脚本中的变量初始化时可以在这里指定值,这里接受变量与字符串数组,如果是字符串数组两个元素之间用空格隔开 ScriptFile——File Name:指定运行的BeanShell脚本 Script:编写BeanShell脚本,通过BeanShell可以访问ctx、vars、props、prev、sample、log。其中通过ctx可以访问Jmeter运行时状态,比如线程数和线程状态;通过vars访问定义的变量;通过props访问运行时设置;通过prev访问前一个取样器结果;通过sample访问当前取样器;通过log写日志
5.7配置元件(Config Element)
jmeter的配置元件(config element)用于提供对静态数据的配置支持,可以为取样器设置默认值和变量。配置元件有很多的功能,读取文件数据,设置公共请求参数,赋予变量值等,以便后续取样器使用(类似于项目中配置文件的作用,如数据、地址、数据库链接等进行配置)
例如:性能测试中为了模拟打了用户操作我们往往需要做参数化,jmeter的参数化可以通过配置元件来完成,理由csv Data Set Config(CSV数据文件设置)可以将本地数据文件形成数据池(Data Pool),它可以帮助我们从文件中读取测试数据
另外jmeter也提供了众多的函数来帮我们生产动态数据,(通过函数助手可以查看到)
基础须知:Jmeter各个元件的执行顺序为:配置元件->前置处理器->定时器->取样器->后置处理器->断言器->监听器。配置元件在Jmeter执行过程中,在相同作用域下肯定会被最先执行,使用过程中要严格遵守作用域问题。
5.7.1:信息头管理器 信息头管理器用来传输取样器信息头。使用规则:特别需要注意使用的作用域问题,分为3种。 1、如果整个测试计划下的所有取样器请求都一致,则在测试计划下添加,这样能做到整个测试计划下共享信息头。 2、如果在同一线程组下,所有取样器的请求头都用到了相同的某个值如:token等,那就在线程组下添加信息头管理器,这样同一线程组下的所有取样器都能传入相同的请求头了。 3、如果每个取样器的请求头不太一致,则在具体的取样器下添加。 通过下图进行下简单理解:
注意点: (1)如果存在多个信息头管理器,则引用的信息头会进行叠加。如下例子: 【测试计划下添加的信息头】填入信息:token:12345678 【线程组1下添加的信息头】填入信息:Content-Type:application/json
则HTTP请求1-1会叠加这两个值,如图:
执行结果:
(2)如果存在多个信息头管理器,而且信息头管理器有变量名称重复了,只是作用域不一样,则会引用作用域小的变量,如下例子: 【测试计划下添加的信息头】填入信息:token:12345678 【线程组1下添加的信息头】填入一个与上相同的变量信息:token:abcdefg 则实际执行的时候,会引用作用域小的token,如图:
执行结果:
(3)如果存在多个信息头管理器,而且信息头管理器有变量名称重复了,作用域也一样,则会引用第一个信息头管理器的变量,如下例子: 【测试计划下添加的信息头1】填入信息:token:12345678 【测试计划下添加的信息头2】填入信息:token:abcdefgh 则实际执行的时候,得看哪个信息头管理器放在前面就引用哪个信息头的变量,该处是将【测试计划下添加的信息头1】放在前面,所以是引用到了token:12345678。如下图:
执行结果:引用的是前面的信息头
5.7.2、Cookie管理器 对于有些请求需要Cookie的时候,可以考虑加上这个配置元件,通常会在登录接口返回Cookie存储到客户端本地,使用该元件可以解决Cookie验证问题。 使用方式:直接添加即可,一般是添加到测试计划或者线程组下。
5.7.3:请求默认值 如果多个请求存在相同的部分,那么就可以将这些相同的部分抽取到【请求默认值】,在填写具体请求的时候,就可以省略请求默认值得信息不填,同样需要非常注意作用域问题。 例子:新建一个【HTTP请求默认值】,填写发起百度请求的信息,那么在实际发起百度请求的时候,就可以忽略这部分信息了。
执行结果如下:
5.7.4:用户定义的变量 主要用于进行参数化设计,但只适用于数据量比较少的参数化,大数量的参数化就不适用了,重要的事情每次都需要强调下:需要注意作用域的问题。 使用方法:添加元件后,填写变量信息即可,填写完后,就可以在作用域范围下的元件进行引用,如下图:
执行结果:
5.7.5CSV设置文件
用于进行批量参数化,有两种方式,第一种是Jmeter自带的CSV配置文件,第二种是插件管理器安装的Random CSV Data Set Config。
1、Jmeter自带的CSV配置文件:该元件只能按照提供的数据源文件按顺序取值。下面进行元件页面各项值的介绍。
(1)文件名:选择提供数据的文件,要选择.csv格式的文件 (2)文件编码:选择对文件的编码格式,一般选utf-8 (3)变量名称:给获取到的数据源数据取变量,要取多个数据,就要用英文下分号\";\"间隔 (4)忽略首行:选择True就是忽略数据源的首行,选择False就是不忽略 (5)其他选项:一般默认即可。
下面实际使用: (1)准备CSV源文件:
(2)填写CSV参数化元件信息:
(3)引用参数化的值
执行结果:
注意事项:该CSV参数化元件只能按顺序取值,即:脚本一次执行下,只能在数据源文件从上往下取值,下面我给请求添加循环数看看现象。
执行结果:
有时候我们想要每次执行请求都能随机取数据源的某一条数据,那么这时候就需要用到第二种CSV参数化配置文件:Random CSV Data Set Config
2、Random CSV Data Set Config:该元件Jmeter不会自带,需要我们手动安装。 (1)打开插件管理器
(2)安装Random CSV Data Set
使用介绍
需要的私我关键字【000】免费获取哦 注意关键字是:000
全套软件测试自动化测试教学视频
300G教程资料下载【视频教程+PPT+项目源码】
编辑切换为居中
添加图片注释,不超过 140 字(可选)
全套软件测试自动化测试大厂面经
编辑切换为居中
添加图片注释,不超过 140 字(可选)
python自动化测试++全套模板+性能测试
编辑切换为居中
添加图片注释,不超过 140 字(可选)
听说关注我并三连的铁汁都已经升职加薪暴富了哦!!!!