jmeter组件使用详解(一)

1.jmeter组件使用

创建脚本的方式:

代理录制:jmeter自带http代理服务器

抓包手写:应用层抓包工具(fillder,charles,F12等)

根据API文档手写

1.1 测试计划详解

它是jmeter测试元件的容器

用户定义的变量(User Defined Variables):可以定义整个测试中使用的重复值

独立运行每个线程组:

  • 勾选后,普通线程组之间按上下排列顺序执行,而非默认的执行
  • 默认不勾选,不勾选表示各种运行自己的

函数测试模式:压测的时候不选择,否则影响性能

添加classpath(需要重启jmeter):

  • 类路径设置,可以添加jar文件的目录到特定的测试计划
  • 也可以直接把jar包放到jmeter的lib目录(默认的classpath)

 

上面分别表示:

  • 运行时间
  • 日志,如果有错误日志,数字标红
  • 线程:绿色表示正在运行(灰色表示未运行)

1.2 线程组

1.2.1 线程组(Thread Group)

给服务器发请求的,发送压力

 在取样器错误后要执行的操作:

  • 继续:线程出错继续执行
  • 启动下一线程循环:开始下一次循环
  • 停止线程:3个线程循环2次,如果第二个线程出问题,这个线程就停止,继续运行其余线程
  • 停止测试:把线程运行的请求运行完才停止
  • 立即停止测试:立刻停止

线程属性:

线程数设置多少合适:线程要占用内存资源,创建线程要消耗cpu,结合tps和rt,如果应用处理快,可以设置少点

Ramp-Up时间(秒):线程在多少秒内启动(如果线程数是100,这里设置为10,表示10秒内启动100个线程,但是不一定是每秒启动10个线程)

调度器配置:

持续时间:最终的持续时间包含了启动时间

启动延迟:定时启动

1.2.2 jp@gc-Stepping Thread Group

阶梯加压,和自带的比,多了阶梯加压完成后,还可以设置持续运行多少时间

自带的,虽然没有明显的阶梯,但是场景还是有意义

1.2.3其他线程组

setup线程组:执行前执行一次,应用场景是初始化数据

tearDown线程组:执行后执行一次,做关闭连接、清除垃圾数据等收尾工作

 1.3 配置元件(ConfigElement)

1.3.1 CSV数据文件配置

作用:用于参数化实现,

说明:参数值最后只能一个空行或者没有空行

参数化实现的几种方式:

  • csv数据文件配置
  • 用户定义的变量
  • 相关函数
  • beanshell脚本

批量造csv参数化数据的方式:

  • 代码(Java,json)
  • 从数据库导出
  • 并发业务接口

 1.文件名:在当前测试计划下的相对路径或绝对路径

不要放中文路径下,路径不要包含空格,特殊字符

可以参数化:放在bin目录下可以用这种路径:${__P(user.dir,)}${__P(file.separator,)}user.csv

2.文件编码:一般选用UTF-8

变量名称(西文逗号间隔):

参数文件中每列的名称,如果有多列,用英文逗号间隔,如果只有一列,则不加分隔符

忽略首行(只在设置了变量名称后才生效):如果参数文件中有很多列,为了区分每列,就在首行把列名写上,此时就要选True

比如:

username,password,age,addr,phone
jack,123456,18,beijing,119
tom,123456,19,beijing,110

4.分隔符(用'\t'代表制表符):是变量值的分隔符,比如上面,分隔符是英文逗号

5.是否允许带引号?:如果是False,请求中保留引号(默认),如果是True,请求中去掉引号

遇到文件结束符再次循环?(Recycle on EOF):

True 表示循环:一般保持默认True

False 就取消循环

Edit:在没有参数的时候会根据定义的内容来调用函数或变量

遇到文件结束符结束进程?Stop thread on EOF?:

值不够,是否停止线程,不停,一般保持默认False

如果设置为True,结束进程,那么“Recycle on EOF?”设置的True将失效

线程共享模式(Sharing mode):

所有线程 ALL Threads【每次迭代,唯一】 (默认值):

结论:
多个线程组取值不一样,
每个线程组内的线程取值也不一样
每次迭代取值不一样,
每次循环取值一样
多个取样器取值一样

当前线程Current thread【每次迭代,顺序】:

结论:
多个线程组取值一样,
每个线程组内的线程取值也一样
每次迭代取值不一样,
每次循环取值一样
多个取样器取值一样

当前线程组 Current thread group:

结论:
多个线程组取值一样,
每个线程组内的线程取值不一样
每次迭代取值不一样,
每次循环取值一样
多个取样器取值一样

1.3.2 HTTP信息头管理器

比如:content-type:application/json

 1.3.3 HTTP Cookie管理器

UI端请求:建议加上

比如:登录完了有cookie,重定向时没有cookie,就又跳转到登录页面

1.3.4 HTTP请求默认值

 1.3.5 JDBC Connection Configuration

 

 1.3.6 计数器

 1.4 前置处理器(Pre Processors)

BeanShell预处理程序

1.5 定时器(Timer)【不建议使用】

1.5.1 高斯随机定时器:

1000-3000:

偏差1000,固定延迟偏移2000

取值范围:3000-1000 或3000+1000

1.5.2 同步定时器(集合点)

超时时间为0就永远等待

固定定时器

1.6 取样器

1.6.1 http请求

重定向:

  • 自动重定向:不传cookie信息
  • 跟随重定向:自动把上一次请求的header中的cookie信息传过去

User keepalive 长链接

长链接:

1.高级--实现改为httpclient4 设置链接和响应超时时间

2.jmeter.properties

2.1 打开httpclient.reset_state_on_thread_group_iteration=false

2.2  

#httpclient4.idletimeout=60000
#httpclient4.idletimeout=1000

#httpclient4.time_to_live=60000

 

Use multipart/form-data for POST:表单和json互斥,可以和文件上传一起使用

 参数Parameters:

设置url请求参数

编码?Encode:当参数值中有特殊字符时,最好选上“编码”,否则字符串可能会被截断

包含等于?Include Equals:自动添加参数名和值之间的等号

消息体数据Body data:设置post消息体

文件上传Send Files:发送文件相关设置

客户端实现

 其中有三个选项:空值、HTTPCLient4、Java

  • JAVA:使用JVM提供的HTTP实现
  • HTTPClient4:使用Apache的HTTP组件HttpClient4.x实现 (和User keepalive结合使用,设置链接和响应超时时间)
  • 空值:如果为空,则依赖HTTP Request默认方法,或在jmeter.properties文件中的jmeter.httpsample定义的值

差异:httpclient4每次连接都会重新建立tcp连接,适合模拟真实场景

1.6.2 其他取样器

jp@gc-Dummy Sampler

BeanShell取样器

调试器取样器

JDBC Request

1.7 后置处理器

jmeter关联的五种方式:

  1. 正则表达式提取器
  2. jp@gc - JSON Path Extractor提取器
  3. Json Extractor提取器
  4. 边界提取器
  5. beanshell后置处理器

1.7.1 正则表达式提取器

1.7.1.1 正则表达式:

基础:
. 匹配除"\r\n"之外的任何单个字符。要匹配包括""\r"\n"在内的任何字符,请使用像"[\s\S]"的模式。(\s是指空白,包括空格、换行、tab缩进等所以的空白,而\S刚好相反,这样一正一反就表示所有的字符),[a-z]

* 匹配前面的子表达式(也可以是一个字符)任意次。例如zo"能匹配z",也能匹配"zo"以及"zoo"。等价于o{0,}

+ 匹配前面的子表达式一次或多次(大于等于1次)。例如,"zo+"能匹配"zo"以及"zoo",但不能匹配"z"。+等价于{1,}

? 匹配前面的子表达式零次或一次,例如,"do(es)?" 可以匹配"do"或"does"中的"do"。等价于{0,1}

\w 字母、数字、下划线、汉字

\d 数字

{n} 重复n次 a{2}--aa

{n,} 重复>=n次

{n,m} 重复n到m次

说明:注意:限定符只对其前面一个字符起作用

组合:
.* 具有贪婪的性质,匹配到不能匹配为止,最大匹配原则
*?  +? 表示非贪婪匹配,即尽可能少的匹配,最小匹配原则
.*?  表示在能匹配成功的前提下尽可能少的匹配,最小匹配原则

常用:
.*?   \d  \s \S\s  \s+

1.7.1.2 详解

 要检查的响应字段:用得最多的是【主体】,其次是【信息头】

主体:header+body,可以从header,也可以从body取值

 响应信息:http响应代码对应得响应信息,例如:HTTP/1.1 200 ok  取值为ok

引用名称:变量名,由用户指定,最好有意义

正则表达式:

  • 用来获取服务器响应值的正则表达式
  • 括起来的部分就是要提取的
  • 写法(大部分情况有效):左边界(.*?)右边界

模板:填写的是位置变量$N$,或者是常量字符串,如果正则表达式需要提取多个值这里可以写多个:$1$$2$...

匹配数字:

  • 0表示随机取值
  • 1表示第一个,正整数代表提取第几个匹配的内容,模板中每个模板都取第一个
  • -1代表全部取值,此时提取结果是一个数组,哪怕结果只有一个值(如果匹配第一个,除了数字选择1,还可以通过${token_1}的方式来取第1个匹配的内容,${token_2}来取第2个匹配的内容,token是引用名称)

缺省值:如果参数没有取得到值,那默认给一个值让它取,最好是有特征的,方便出错的时候看报错信息,比如:----------

1.7.1.3 例子

{
    "data": {
        "orderId": "10000${__Random(100,999,num)}",
        "balanceFlag": true,
        "waitPayAmount": 0
    },
    "respMsg": "success",
    "respCode": "200"
}

取出orderId和respMsg 只用一个表达式

答案:"orderId": "(.*?)"([\s\S]*)"respMsg": "(.*?)",

 1.7.2  调试后置处理程序 Debug PostProcessor

用于调试

放在取样器下面

查看结果树--响应数据,里面的JMeterVariables,要引用,都可以${变量名}的方式获取

1.7.3 jp@gc-JSON/YAML Path Extractor

1.7.3.1 符号说明

  • $,表示根节点
  • @,当前节点
  • .或者[]用于连接父子节点
  • ..深层扫描
  • *通配符
  • [?(表达式)]
  • [start:end],切片
  • ==~   正则匹配

1.7.3.2 获取数组下的第一个uuid

 1.7.3.3 获取前三个uuid和showname

1.7.3.4 深层扫描

1.7.3.5 获取数组中所有的uuid

1.7.3.6 根据条件获取值

1.7.3.7 根据部分数据获取值(正则模糊匹配)

 1.7.4 BeanShell后置处理程序

 

posted @ 2023-06-21 22:07  万溪汇海  阅读(200)  评论(0编辑  收藏  举报