Jmeter学习三——CSV文件和关联
- jmeter做功能测试和做性能测试的区别
- CSV数据文件设置(读取外部文件,进行分数据驱动)
- 文件设置
- 字段介绍:
- 文件名
- 文件编码
- 如果出现编码问题导致的乱码,如何解决?
- 变量名
- 忽略首行
- 分隔符
- 是否允许带引号
- 遇到文件结束符再次循环
- 遇到文件结束符停止线程
- 文件共享模式
- 设置下面的CSV设置项之后,要修改关联
- Jmeter关联
- 正则表达式提取器
- 详情元素介绍
- 正则表达式
- 注意事项:
- 模板及匹配多组数据的使用
- Xpath提取器
- 详情元素介绍
- Xpath表达式
- json提取器
- 详情元素介绍
- JsonPath语法
- 边界提取器
- 页面元素介绍
- Jmeter断言——性能测试脚本中不建议写
- 性能测试中的断言
- 再次强调
- 疑问:脚本中有断言,但是性能测试时禁用可以吗?
- 断言的介绍
- 响应断言
- JSON断言
- Xpath断言
- jmeter生成测试报告
- Jmeter定时器——性能测试中不建议使用
- 性能测试中的定时器
- 性能测试过程中的集合点(同步定时器)
- 定时器的介绍
- 思考时间
- 同步定时器(集合点)
- jmeter逻辑控制器
- 性能测试中的逻辑控制器
- 逻辑控制器的介绍
- 循环控制器
- 条件控制器——性能测试中几乎不用
- For each控制器
- 仅一次控制器——性能测试中常用
- 事务控制器
- 聚合报告
jmeter做功能测试和做性能测试的区别
- 性能测试,尽可能不要进行人为的干预,导致请求频率减缓(定时器,条件控制器,断言等)
- 性能测试脚本,追求自身的性能,能简单就简单
-
- 如果写脚本的时候,有某个原件,做性能测试时将这个元件禁用,相当于注释了这个元件,元件不会被执行,原则上不会影响性能脚本
- 不必要的元件,能不用就不用
- 性能比较差的元件,也不要使用
- 性能测试脚本,是多线程同时执行,脚本中存在参数,就需要考虑多线程使用的情况
- 不能直接拿接口测试的脚本用于性能测试;功能接口测试的脚本还需要经过性能的转化,才能用于性能测试
CSV数据文件设置(读取外部文件,进行分数据驱动)
文件设置
- CSV数据文件设置,主要用来读取外部的数据文件,实现数据驱动测试
- 添加方法:线程组——添加——配置元件——CSV数据文件设置,如下图
- CSV数据文件设置,是配置元件,是最先执行的,如果CSV文件设置报错,后面的脚本都不会运行
- 若CSV文件在某个线程组下,其他线程组是无法访问的
字段介绍:
文件名
- 文件名:要读取数据文件的名称(数据文件的绝对路径,可浏览选择加载),这个必须要填写,否则会报错
- Jmeter的绝对路径:
-
- 1.当Jmeter脚本保存后,使用文件中的选择文件按钮打开时,默认显示的是jmx文件路径的窗口;换句话说:文件选择时,其相对路径的地址,就是jmx的地址——建议这种方式
-
- 2.CSV文件的相对地址还有一个:Jmeter安装路径中的bin文件夹下
- 文件设置的时候,为了兼容linux和MAC,层级的分隔符使用的是反斜杠
/
,一般使用的是绝对路径,但为了其他人也可以使用脚本,这需要使用相对路径 - CSV支持多种格式的文件,只要是文本文件,都支持
-
- txt、CSV(逗号隔开数据)、json、xml、log
文件编码
- 文件编码:读取数据文件时,采用的编码,该编码设置要和文件名保持一致(utf-8、GBK等等,必须和CSV文件一模一样)
- txt文件,一般是utf-8
- CSV文件,字符集并不一定是utf-8,如果自身不是utf-8,但是Jmeter中选择了utf-8,中文信息就有可能出现因为字符集不同导致的乱码
- 因此,文件名那儿上传的文件,建议使用txt
如果出现编码问题导致的乱码,如何解决?
- 如果我们用数据的文件是CSV,其中的数据有中文,jmeter获取数据的时候出现了乱码,要如何解决?
- 用记事本打开CSV文件,切换字符编码或者重新保存的时候,选择编码为utf-8
变量名
- 变量名称:读取数据是,接收列数据的变量,按列来接收,多列用多个变量接收,每个变量之间用逗号隔开
- 可以理解为变量名称为excel表格中第一列的表头,下面每一列的数据为文件中对应的数据
- 名称自己定义,逗号时候固定的,与文件中的列分隔符是什么没有关系
- 变量名中的第一个参数接受第一列,第二个参数接受第二列,依次类推
- 如果有两个变量名,想要接收三列数据,其中第二个参数想要接收第三列的数据没那么就需要在两个变量名之间使用两个逗号,例如:
username, , pwd
忽略首行
-
- 忽略首行:不读取第一行的数据,一般CSV数据文件中的第一行是标志数据的key,因此可忽略
- 填写的内容只有True和False两个
- 为True:表示
- 为False:表示
- 这个功能表示读取文件的时候,要么从第一行开始,要么从第二行开始,不可能从中间开始
- 因此在做性能测试的时候,同一台机器上的多用户读取同一个文件,不会出现重复的情况,但是当服务器为分布式的时候,多台机器上都有相同内容的文件,每台服务器上的用户读取相同内容的文件的时候,就会出现使用同一个数据请求接口的情况
-
- 如果用在注册和登录的场景下,就会出现多次注册/登录失败的用例(因为手机号码无法重复注册,重复登录后面会顶掉前面的用户)
- 因此结论为Jmeter自带的CSV文件设置功能,在多台机器做助攻机,发起做性能测试的时候,会出现问题
- 解决方式:
-
- 想办法读取的文件名相同,但是内容不同,例如第一台机器放1-10行,第二台机器放11-20行,使用这种方式数据不会重复,但是当分布式的服务器特别多,例如300台,就会很麻烦
-
- CSV按照行读取,但是首次读取哪一行随机;但是这种方式数据特别少的时候,很容易出现重复的情况
分隔符
- 分隔符:按照数据文件的分隔符进行填写,主要用来分割每一列
- 看文件中的列与列之间使用什么符号分割,例如\t、空格、还可以是特殊符号,例如 |(linux中的管道符)、$等
- 具体根据文件决定
是否允许带引号
- 是否允许带引号:默认选择False,选择True时会自动去掉数据中双引
- 如果不允许带引号,但是文件中存在引号时:其默认引号时数据的一部分,所获取的数据中带引号
遇到文件结束符再次循环
- 遇到文件结束符再次循环:文件所有数据加载完之后,是否从头再次读取
- True:表示继续循环,意思是继续循环取值(取文件中的值)
-
- 代表文件中的内容从头到尾全部都获取一次之后,再次从头获取
-
- 如果线程有100个,数据只有10个,值获取完之后,第11个重新获取第1个值
- False:表示不在循环取值
-
- 如果线程有100个,数据只有10个,值获取完之后,第11个及其之后的接口,其请求数据就是空值,空值都是
<EOF>
- 如果线程有100个,数据只有10个,值获取完之后,第11个及其之后的接口,其请求数据就是空值,空值都是
遇到文件结束符停止线程
- 遇到文件结束符停止线程:文件所有数据加载完成之后,是否停止当前运行的线程
- True:表示遇到文件结束符就停止线程,意思是Jmeter会停止运行
-
- 如果线程有100个,数据只有10行(代表第10行后一个文件结束符),那么只能调用10次接口
- False:表示遇到文件结束符不停止线程,意思是Jmeter还会继续跑
- -如果线程有100个,数据只有10行(代表第10行后一个文件结束符),可以调用100次接口
- 【注意】“遇到文件结束符再次循环”和“遇到文件结束符停止线程”必须不一样,一个为False,另外一个必须时True,否则有一个设置不起作用(因为冲突导致下面一个设置失效了)
文件共享模式
- 线程共享模式:线程共享数据的模式
-
- 所有线程共享:如果CSV数据文件设置在测试计划下,所有线程都能共享访问CSV读取出来的数据(包括跨线程组的线程),如果CSV数据文件设置在线程组下,相当于当前线程组生效
-
-
- 在所有线程共享的模式下,如果是两个不同的线程组(每个线程组都只有1个请求),第一个线程组使用第一条数据后,第二个线程组的HTTP请求就使用第二条数据
-
-
-
- 多个线程组,内存中只有一份数据(如果CSV文件设置在测试计划下)
-
-
- 当前线程组:当前线程组中的所有线程,共享访问CSV读取出来的数据;有几个线程组,内存中就有几份相同的数据(如果CSV文件设置在测试计划下)
-
- 当前线程:每个线程单独访问CSV读取出来的数据
-
-
- 每个线程私有一份(如果CSV文件设置在测试计划下),有多少个线程就有多少份,线程的数量是多个线程组中线程的总量(即可以跨线程)
-
-
-
- 运行时,线程只会取内存中属于自己的那份CSV问价,且都是从头开始读取
-
- 编辑:自定义功能,目前无法使用
设置下面的CSV设置项之后,要修改关联
- 如果一个用户需要运行完文件中的多条数据,可添加循环次数来解决
Jmeter关联
- 关联:将多个接口关联到一起,例如将上一个接口的响应数据,作为下一个接口的请求数据
- 实现方法:
-
- 调用A接口,获取A接口的响应数据
-
- 在A接口下添加后置处理器,然后利用后置处理器,提取A接口响应数据的某个字段
-
- 提取jmeter后置处理器提取的数据,在B接口中引用
-
- 运行,查看结果
- jmeter后置处理器有很多种,在此重点介绍3个
-
- 正则表达式提取器:使用正则语法来提取数据
-
-
- 作用:能提取任何个数据,并且效果高
-
-
-
- 缺点:难以掌握,容易遗忘
-
-
- Xpath提取器:用来提取XML或者HTML中的数据
-
-
- 作用:能对XML、HTML的格式提取数据
-
-
-
- 缺点:只能提取XML和HTML格式的数据,语法难度和正则相似
-
-
- json提取器:专门用来提取json结构的数据
-
-
- 作用:针对json数据提取需要的数据
-
-
-
- 缺点:只能提取json数据
-
-
- 边界提取器:确定左边界和有边界的信息,提取两个边界中间的数据
-
- 作用:确认边界之后,能提取任何个数据且比较简单
-
- 可以看做是正则提取器的简单版
- 使用关联后,需要添加调试取样器来查看
-
- 添加方式:线程组——添加——取样器——调试取样器
-
- 添加完成后,可在查看结果树中查看结果
- 添加完成后,可在查看结果树中查看结果
正则表达式提取器
- 正则表达式:是一种字符串匹配模式,可以满足匹配条件的字符串进行提取,替换等操作
- 添加正则表达式提取器的方式:取样器——添加——后置处理器——正则表达式提取器
详情元素介绍
- Apply to:提取数据的接口
-
- Main sample and sub-sample:对所有主请求和子请求生效
-
- Main sample only:只对主请求生效(推荐)
-
- Sub-sample only:只对子请求生效
-
- jmeter Variable Name to use:对jmeter变量生效
- 主请求和子请求的定义:
-
- 在发送接口请求时,请求资源的URL如果被征用了,那么服务器就可能返回一个重定向的URL给客户端,客户端如果配置了自动重定向的功能呢,就会根据服务器返回的新的URL,重新定位到最新的资源
-
- 那么我们在发送一个接口请求的时候,就会产生多个请求,其中主请求就是真正有效的请求,子请求就是重定向过程中的请求
- 需要检查的响应字段:主要指要提取的数据,只能选择一个
-
- 主体:响应体
-
- Body(unescaped):也是响应体,但是会自动忽略特殊字符,功能不稳定,因此不推荐
-
- Body as a Document:还是响应体,以文件形式存在(互联网传输的接口数据都是文件)
-
- 信息头:响应头
-
- Request Headers:请求头
-
- URL:请求的URL
-
- 响应代码:响应状态吗
-
- 响应信息:响应状态吗的信息
- 引用名称:匹配成功后,保存数据的变量名
正则表达式
- 填写正则表达式,正则表达式规则
-
- 正则表达式组合
-
- 正则表达式语法介绍
- 需要掌握:
\d \w \D \W [^a-z] [^0-9] [0-9] [a-z] . + * ? ^
;注意^在中括号内外的不同含义 - 万能正则表达式:
(.*?)
,几乎可以匹配任何文本 - 正则表达式文本框中,可以写多个正则表达式,但是需要
(.*?)
作为分隔符隔开 - 例如下图的表达式和结果
注意事项:
-
- Jmeter中的正则表达式必须写在小括号中,也就是说小括号中的内容就是正则表达式
-
- 中括号和大括号在表达式中存在特殊的用途,不能乱用
-
- 要准确写出
模板及匹配多组数据的使用
- 匹配出多组数据时,可以通过模板选择具体某种组合,或者全部数据
-
$1$
:选择第一组数据
-
$2$
:选择第二组数据
- 匹配数字(0代表随机,-1代表全部):按照正则表达式提取数据,按照模板筛选之后,如果数据还有多余,可以使用匹配数字选择某一组数据保存到引用名称的变量中
Xpath提取器
- Xpath提取器,主要用来提取XML和HTML的数据
- 添加方法:取样器——添加——后置处理器——Xpath提取器
详情元素介绍
- XML Parsing Options:XML的解析器
-
- Use Tidly:勾选后,就解析HTML数据,不勾选,解析XML数据
-
- Use Namespaces:如果启用该选项,后续的XML解析器将使用命名空间来进行分辨
-
- Validate XML:根据页面元素模式进行检查解析
-
- Ignore Whitespace:忽略空白内容
-
- Fetch external DTDs:如果选中该选项,外部将使用DTD规则来获取页面内容
- 引用名称:使用Xpath表发誓提取出来的数据,保存到引用名称设置的变量中
- Xpath query:填写Xpath表达式的地方
- 匹配数字:
-
- 1,代表全部
-
- 0,随机选中一个数据
-
- 1,选中匹配的数据列表中的第一个数字
-
- N,选中第n个数字
- 缺省值:没有匹配到时的默认值
Xpath表达式
- Xpath提取数据时,默认都是从根节点开始寻找,但是按照匹配的规则,也可以全局搜索
-
- Xpath定位方式
- Xpath定位方式
json提取器
- json提取器专门用来提取json数据
- 添加方法:取样器——添加——后置处理器——json提取器
详情元素介绍
- Names of creat variable:保存的变量,后面接口要使用的变量名
- JSON Path expreesion:JsonPath表达式,通过JSON表达式提取数据
- Math No.(0 for Random):如果JSON表达式中提取了多组数据,那么按照数字选择某组数据
-
- 0表示随机一个设置
-
- -1表示获取全部数值,变量名称会自动加上下划线和一个数字,引用的时候需要注意,因为变量名称已经发生了变化
-
- 正数,当正数数值小于返回数据的个数时,表示列表/元组中索引,填写几就是第几个数据
-
- 当返回的数组中只有一个值的时候,可以填写任意大于等于0的数值
-
- 当正数数值大于返回数据的个数时,返回结果为空
- Compute concatenation var(suffix_ALL):如果JSON表达式提取器提取了多组数据,并且勾选了Compute concatenation var(suffix_ALL),那么自动拼接所有数据,以逗号作为分隔符,然后保存到Name of creat variable设置的变量中
- Default Values:默认值
- 一个json提取器,可以写多个jsonpath提取方式,多个jsonpath提取式可以使用英文的分号隔开,这个时候就必须填写 Default Values
JsonPath语法
-
- $表示提取根节点的数据
-
- $.a表示从根节点开始,寻找根的字节点a,并提取a的数据
-
- $.a.b表示从根节点开始,寻找根的字节点a,并返回b的数据
- -$.a[条件].b如果一个字节点a是列表,那么可以这样写,代表提取a列表中,满足【表达式】筛选条件所有数据中,节点b的值
- 比较复杂的表达式:$.content[?(@.id)==31)].courseName,具体规则
- 拿到json信息后,按照规则,将参数名写在具体位置上
边界提取器
- 和正则提取器很类似,也可以提取请求或者响应中的信息
- 需要准确的写出左边界和右边界
- 可以作为正则提取器无法熟练使用时的替代品
- 添加方法:取样器——添加——后置处理器——边界提取器
页面元素介绍
- 页面上的信息和正则表达式基本一致
- 不一样的只有两个
-
- 左边界:匹配文本左边的文本信息
-
- 右边界:匹配文本右边的文本信息
Jmeter断言——性能测试脚本中不建议写
性能测试中的断言
- 断言:预期结果和实际结果,进行比较,一致,说明没有问题,不一致说明有bug
-
- 受写断言的写法有关,如果脚本的断言有错误,本来请求是成功的,也会被认定为失败
-
- 断言执行时在受到响应之后采集行的,这个断言的执行,是jmeter的执行,和服务器没有关系
-
- 断言代码的执行,需要一定的资源和时间,这些都是jmeter工具造成的
-
- 因此,就会导致jmeter在进行断言的时候,需要分配一定的资源给断言来进行执行,执行断言需要一定的时间,因此导致下一次发起的请求有一定的延迟
- 因此在一定时间内,发起的请求数量减少了,也就造成了短时间内对服务器造成的总压力不足,对服务器进行的性能测试的结果指标误差就更大了
- 因此,从这个角度来讲,不建议在性能测试脚本中写断言
再次强调
- 在性能测试中,默认的成功与失败只和状态码有关,与响应结果内容的准确性无关
- 默认成功的状态码:1XX、2XX、3XX
- 默认失败的状态码:4XX、5XX
- 如果加了断言,就是人为强制的讲响应结果的正确性与jmeter的成功和失败挂钩,也就人为的干预了测试结果
- 因此也就人为的干预了性能测试的结果指标(成功率),那么性能测试的结果就出现了错误的判断
- 从这个角度来讲,也不建议性能测试脚本中写断言
疑问:脚本中有断言,但是性能测试时禁用可以吗?
- 禁用:类似代码中的注释,不执行脚本,这个脚本就不会被执行,只是增加了脚本的长度
- 这种情况下是允许的
断言的介绍
- Jmeter断言主要有三秒钟
-
- 响应断言
-
- Json断言
-
- Xpath断言
- 一个小的知识点(补充),查看结果树中
-
- 如果类型时JSON Path Tester,可以定位json表达式
-
- 如果类型时RegExp Tester,可以定位json表达式
- 如果类型时RegExp Tester,可以定位json表达式
响应断言
- 添加方式:取样器——添加——断言——响应断言
- Apply to 选择对主请求和子请求生效
-
- Main sample and sub-sample:断言对主请求和子请求生效
-
- Main sample only:断言只对主请求生效
-
- sub-sample only:断言只对子请求生效
-
- jmeter Variable Name to use:断言只对jmeter内部的变量生效
- 测试字段:窗口包括请求数据和响应数据,在这里可以根据选择,断言部分请求数据和响应数据,以及全部数据
-
- 响应文本:断言响应体的内容(推荐)
-
- 响应代码:断言响应状态吗(200)
-
- 响应头:断言响应头
-
- 请求头:断言请求头
-
- URL样本:断言请求的URL
-
- 文档(文本):断言所有响应数据(状态行,响应头,响应体)
-
- 忽略状态:不断言响应状态吗
-
- 请求数据:断言所有请求数据
-
- 模式匹配规则:断言的逻辑表达式
-
-
- 包括:如果响应数据包括【测试模式】中指定的正则表达式匹配的数据,那么断言通过
-
-
-
- 匹配:如果整个文本完全匹配【测试模式】中指定的正则表达式匹配的数据,那么断言通过
-
-
-
- 相等:如果整个文本完全匹配【测试模式】中指输入的数据,那么断言通过(非正则表达式)
-
-
-
- 字符串:如果整个文本匹配【测试模式】中指输入的数据,那么断言通过(非正则表达式)
-
-
-
- 否:取反
-
-
-
- 或:如果响应数据满足【测试模式】中任何一个指定的规则,则断言通过
-
-
- 如果断言通过,查看结果树前面都是绿色的对号;如果断言失败,查看结果树中会显示红色的叉号,并且断言未通过的接口下会有一个字节点“响应断言”
-
- 断言样例如下:
- 断言样例如下:
JSON断言
- 添加方法:取样器——添加——断言——json断言
- 作用:和响应断言相比,json断言只能对json结构的数据进行断言
- 当响应体是json结构的数据时,我们使用json断言比响应断言的性能更好
- 断言规则:
-
- 先判断断言的目标数据是不是json数据,如果不是,断言失败
-
- 再判断断言的目标数据中,指定的json表达式是否有效,如果无效,断言失败
-
- 最后判断断言的目标数据中,json表达式指定的数据与预期数据是否一致,如果不一致,断言失败
- 最后判断断言的目标数据中,json表达式指定的数据与预期数据是否一致,如果不一致,断言失败
- 样例如下:
Xpath断言
- 主要针对XML数据或者HTML数据进行断言
- 添加方法:取样器——添加——断言——Xpath断言
- 断言表达式中,等号左侧表示实际数据,右侧表示预期数据,详见下图
jmeter生成测试报告
- jmeter是不能直接生成HTML测试报告,需要借助工具Ant来生成
- Ant是采用java语言编写,主要作用是对程序进行编译、组装、测试和运行java程序
- 再jmeter这里,我们主要是使用ant运行jmeter文件,生成测试报告
- 安装Ant,下载网址
-
- 解压安装包
-
- 配置环境变量
-
-
- 我的电脑——属性——高级设置——增加ant的目录信息——配置path变量(windows)
-
-
-
- 打开终端,在 ~使用
open .bash_profile
打开配置文件,增加以下代码,然后使用source ~/.bash_profile
命令,让填写的环境变量生效即可
- 打开终端,在 ~使用
-
export ANT_GOME= ANT的解码路径
export PATH= $PATH:$ANT_HOME/bin
- 验证ant安装成功的办法,在cmd或者终端总,输入ant -v,如果显示版本号就说明安装成功了
- 安装成功后,还要进行:
-
- 在jmeter的extras中,存在ant-jmeter-版本.jar 的jar包,将这个包放在ant的lib文件中
-
- 配置ant的bulid.xml和jmeter-results-detail-report_21xsl配置文件(在jmeter的extras中)
-
-
- 在build.xml中,指定了以下内容
-
-
-
- ant要运行的jmeter的脚本名称
-
-
-
- ant要生成html报告央视模板内容
-
-
-
- ant运行jmeter脚本时,要依赖的jar包
-
-
-
- ant生成html报告的内容
-
- 使用jmeter生成HTML报告,需要以下步骤
-
- 第一步:保存jmeter脚本(方式:文件——保存测试计划为),这个保存的就是最终要运行的脚本文件
-
- 第二步:保存jmeter脚本运行时,生成的文件数据(查看结果树中,直接在文件名中写入路径信息,就会将数据文件保存到相应的路径下)
-
-
- 这一步保存的文件必须是xml文档,设置方式为点击查看结果树文件名后的【配置】, 然后在Sample Result Save Configuration弹框中,勾选Save As XML选项,路径和需要勾选的选项如下
- 这一步保存的文件必须是xml文档,设置方式为点击查看结果树文件名后的【配置】, 然后在Sample Result Save Configuration弹框中,勾选Save As XML选项,路径和需要勾选的选项如下
-
- 保存测试计划和数据文件时,最好与bulid.xml、jmeter-results-detail-report_21xsl放在一个路径下
- 运行时,在cmd或者终端中,输入ant -f build.xml后,会生成html的测试报告
- build.xml中,决定测试计划和数据文件名称的地方如下图示例,名称必须和配置文件保存一致
Jmeter定时器——性能测试中不建议使用
性能测试中的定时器
- jmeter中,如果在线程组中添加了定时器,会对所有的取样器都有效,添加之后,所有的取样器(例如HTTP请求,调试取样器等)都会等待定时器设置的时间之后再使用下一个下取样器
- 定时器会延缓发送请求的频率,从而导致对服务器的请求阿里变小,这样就反应不了服务器额真是压力
- 例如:原本1min可以调用1000次接口,加了定时器之后可能只能调用100个,因此对服务器造成的压力就不足了
- 因此,性能测试过程中,不建议使用定时器
性能测试过程中的集合点(同步定时器)
- 集合点或者同步定时器,是讲所有接口集合在某个点之后,瞬间发起请求,会造成某一秒对服务器的瞬间压力,但是压力过去之后,又需要等待一定的时间再去对服务器发起瞬间请求,场景就是一瞬间的压力,等待,再一瞬间的压力,一定时间之内发起的请求数可能还会小于不加集合点发起的请求
- 这种和不添加集合点,持续对服务器进行很大的压力相比,不添加集合点会更容易发现性能测试的问题
- 因此,也不建议性能测试中添加集合点
定时器的介绍
- Jmeter的定时器主要用来控制每个取样器的执行间隔
-
- 主要用于测试调用第一个接口之后,因某种原因需要管段时间才能去第二个接口中获取结果的场景,例如转账、异步获取互动数等等
-
- 执行并发测试时,也需要用到定时器的集合点,例如要模拟1000个用户同时请求,但是客户端1s只能启动100个,因此需要等1000个全部启动,在集合点集合之后,全部发送
- 当前重点介绍两个接口测试中的概念,分别是思考时间和集合点
-
- 思考时间:模拟真实用户操作的延迟时间
-
- 集合店:在客户端控制并发送请求的功能,实现幂等测试
思考时间
- 线上所有用户平均操作的间隔时间
- 思考时间的计算公式=线上活跃用户数/每秒点击数
- 思考时间的添加方式:线程组——定时器——统一随机定时器
- 上图中的固定延迟时间可以理解为最小等待时间
- 统一随机定时器设置的思考时间 = 固定延迟时间+不超过最大延迟时间的随机值
- 如果固定延迟时间设置1000毫秒,最大延迟时间设置为9000毫秒
-
- 那么思考时间在一个1秒到100秒之间的随机数
-
- 如果想设置固定值,就不设置最大延迟时间就可以了
同步定时器(集合点)
- 在接口测试中,同步定时器主要用来进行幂等测试
- 在接口的性能测试中,同步计时器主要作用是用来进行并发测试
- 幂等测试:判断请求完全一模一样的服务器是否能够正常处理
-
- 例如:同时发送一模一样的注册接口请求,验证服务器只能注册一个用户
- 并发测试:同时发送多个请求,验证服务器的并发处理能力
- 幂等测试是并发测试的一种,但是幂等测试更关注“完全相同”,而并发测试关注发送多个接口请求
-
- 例如:幂等测试的注册,关注的是注册信息完全相同,并发测试的注册,必须使用不同的账号注册
- 添加方法:线程组——定时器——同步定时器
-
- 模拟用户组的数量和测试计划中的线程组数量必须一致
- 模拟用户组的数量和测试计划中的线程组数量必须一致
jmeter逻辑控制器
性能测试中的逻辑控制器
- 首先,条件控制器,只有结果为真的情况下才会运行其子节点中的取样器
-
- 如果在性能测试中,使用条件控制器,只会让我们的请求变得很混乱,杂乱无章
-
- 使用条件控制的脚本并不是性能测试中的混合场景
- 什么是混合场景:不同数量的人同时对不同的接口发起请求(当前了解)
-
- 实现方式:多个线程组,每个线程组下有不同的接口,每个线程组有不同的线程数
逻辑控制器的介绍
- 作用:控制父子节点和控制执行流程、
-
- 例如:在线程组下添加简单控制器,然后就可以再次添加HTTP请求、断言等,这样就实现了作用域的控制
- jmeter的逻辑控制器,主要包括循环控制器,if控制器和For each控制器3中
- 这三种控制器,分别用来进行循环控制,条件控制和跌倒控制
-
- 循环控制器:相当于python中的for循环
-
- if控制器:相当于python中的if条件循环
-
- For each控制器,也是for循环,增加了适配jmeter变量的功能
循环控制器
- 添加方式:线程组——逻辑控制器——循环控制器
- 作用:使用同一个请求体,重复发起相同的请求
-
- 当请求体中存在函数或者变量的时候,请求体的数值也会发生变化
- 当请求体中存在函数或者变量的时候,请求体的数值也会发生变化
- 如上设置完成之后,HTTP请求必须是逻辑控制器的子节点时,才可以完成循环
条件控制器——性能测试中几乎不用
- 条件控制器的添加方法:线程组——添加——逻辑控制器——if控制器
- 必须使用groovy或者jexi3的函数,文本框中的结果必须是True或者False
- 使用场景:就是Expression文本框中的条件表达式结果为真或者为假,结果为真的情况下,if控制器中中的子节点取样器会被执行;为假的情况下就不会去运行其子节点中的取样器
- 如何通过jmeter实现测试环境和开发环境的切换?
-
- 在测试计划的用户变量中,输入测试环境和开发环境的域名及端口号(分开写,两个变量)
-
- 在线程组下新建if控制器,并填写条件表达式
- 在线程组下新建if控制器,并填写条件表达式
- 使用这个控制元件判断的是调用那这个HTTP请求,HTTP请求中的域名和端口号,变量调用的话,实际上用的是测试计划中的变量
- __jex13函数表达式,在函数助手中选择jex13,然后输入条件自动生成
For each控制器
- 作用:每次使用不同的值重复的发请求,接口是同一个地址,但是请求体可以变
- For each控制器是jmeter为了适配后置处理器中的XX提取器而设置的一个元件
-
- 例如:当我们使用正则表达式提取器,提取网站某个培训网站的全部课程时,会获取多个课程,这些课程在jmeter中会以变量名_1、变量名_2、变量名_3的方式体现
- 添加方法:线程组——添加——逻辑控制器——for each控制器
- 这个控制器的用法举个例子:在一个接口中可以返回某用户的多个订单id,但是没有订单详情
-
- 根据这个场景,我们就可以将接口中的订单id提取出来,然后调用查看订单详情按钮,循环多次,获取所有订单的详情(一个个订单查询)
仅一次控制器——性能测试中常用
- 不论运行多少时间,每个线程只会运行一次(注意,不是每个线程组,是每个线程!线程!线程!即用户数)
- 添加方式:线程组——添加——逻辑控制器——仅一次控制器
- 只需要添加名称和注释信息即可
事务控制器
- jmeter中,默认一个取样器的1次完整的请求就是一个事务
- 事务控制器的作用:将多个取样器的完整的请求,当做一个事务;一般用于测试工作流程或者业务场景的性能
- 使用事务控制器的时候,性能测试中,要勾选第一个复选框来合并样本(Generate parent sample)
- 性能测试中,是先做单接口(用不到事务控制器);然后再使用事务控制器合并多个接口测试多接口/工作流程/业务的性能
- 单接口的性能测试,一般情况下是一个线程组下只启用一个接口
-
- 但是需要关联的接口,例如下单,因为要先登录才能进行下一步,这样的话就会出现一个线程组下有至少两个启用的接口
- 上面的场景中**,如果要对下单的接口进行性能测试,就需要将前面的接口(登录)放在一个仅一次控制器中**
聚合报告
- 添加方式:线程组——添加——监听器——聚合报告
- 聚合报告中的样本值:是一段时间内发起的总请求量
- 响应时间相关的数值,单位是毫秒
- 90%,95%,99%指的是:将响应时间从低到高排序,总序列个数的90%、95%、99%次的响应时间是XX毫秒
-
- 例如一共1000次请求,90%指的是第900次,95%指的是第950次
- 接受和发送,指的是每秒发出/接收到多少请求
- 列表中行:每一行指的是一种事务