JMeter性能测试工具·下

|----------------|
| 你好,我是安然无虞。 |

文章目录

一、JMeter断言

作用: 让脚本自动化执行的过程中, 能够自动的判定执行结果是否正确, 需要添加断言.

1.响应断言

添加: 线程组------HTTP请求------断言: 响应断言

配置:

  • 测试字段: 需要检查的字段
  • 模式匹配规则: 需要使用什么规则来进行检查
    • 且、或者、非
    • 相等、包含子字符串
  • 测试模式: 需要校验的值
    • 填写多个值

2.JSON断言

JSON断言适用于返回的HTTP响应为JSON格式.

比如请求一个网址时, 返回的内容如下:

添加: 线程组------HTTP请求------断言: JSON断言

配置:

  • JSON PATH: 其中 . 表示的是JSON字符串的根路径, 这里是 .weatherinfo.city
  • 勾选 "Additional assert value"
  • 在expected value 里面填写期望值

3.断言持续时间

适用于性能测试的时候, 检查HTTP请求的响应时间是否超过预期值.

添加: 线程组------HTTP请求------断言: 断言持续时间

配置: 预期时间

比如这里的请求响应时间花了36毫秒, 那么断言持续时间就会不通过:

二、JMeter接口关联

当多个请求之间有依赖关系, 后一个请求的参数需要使用前一个请求的相关数据时, 需要用到关联.

JMeter关联的分类:

  • 正则表达式提取器
  • xpath提取器
  • JSON提取器

1.正则表达式提取器

其实就是找左右边界.

html 复制代码
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title>

这里想提取出 百度一下, 你就知道 , 所以可以这样设置正则表达式:

shell 复制代码
<title>.*?</title>

其中:

  • .: 是通配符, 可以代表任意字符
  • *: 代表前面的字符出现任意次
  • ?: 代表非贪婪匹配, 找到左边界后, 往右查找匹配右边界, 只要有匹配的右边界就停止继续查找; 然后再次查找左边界和右边界.

所以对于正则表达式提取器来说, 是这样的:

添加: 线程组------HTTP请求------后置处理器------正则表达式提取器

配置:

  • 要检查的响应字段: 默认响应体
  • 引用名称: 匹配后的数据要存储的变量名
  • 正则表达式: <title>(.*?)</title>, ()中是要保存的数据
  • 模版: 1 1 1
    • 数字1代表上面正则表达式中第几个
  • 匹配数字: 0代表随机值, 1代表第一个结果, -1代表所有结果
  • 缺省值: 当没有匹配上时将该值保存在变量里

引用:

  • 如果匹配数字为1, 则直接使用变量名来引用: ${变量名}
  • 如果匹配数字为-1, 则使用变量名+后缀的方式来引用: ${变量名_数字}

这里的话, 其实设置 调试取样器 就能看到运行后产生的所有变量名:

比如将 匹配数字设置为1, 看调试取样器中的变量名:

如果将 匹配数字设置为-1, 调试取样器中的变量名多了以数字的后缀:

如果是这样的话, 在使用这个变量时, 就不能直接采用 {title}这种形式, 而是 {title_后缀}.

2.XPath提取器

这里就不过多赘述了, 语法方面请自行复习.

3.JSON提取器

详情请看前面的JSON断言.

三、JMeter直连数据库

这里大家知道JMeter是可以连接数据库并使用的, 后面用到时详细说.

四、逻辑控制器

控制元件的执行顺序.

1.IF控制器

有一个需求:

  1. 使用用户自定义的变量, 定义一个变量name, name的值可以是baidu或bilibili
  2. 根据name的变量值实现对应网站的访问

注意看IF控制器的设置:

有个警告, 大概意思是: 为了性能需要勾选 Interpret Condition... 并且使用 __jexl3函数... 去比较.

所以, 如果我们不勾选这个选项, 也就可以不采用函数的方式, 而是采用JS语法, 像下面这样:

如果勾选这个选项, 就得使用JMeter函数的方式, 比如:

首先使用之前的JS语法生成对应的函数字符串:

然后设置IF控制器:

所以对IF控制器进行总结:

配置:

  • 使用JS语法: "${name}" == "baidu"
  • 使用JMeter函数的方式: KaTeX parse error: Expected group after '_' at position 2: {_̲_jexl3("{name}" == 'baidu',)}
  • 推荐使用函数的方式, 性能高

2.循环控制器

循环控制器中的循环次数配置m和线程组中的循环次数配置n对比:

  • 关系: 如果同时配置, 循环控制器下HTTP请求实际的执行次数应该是m*n
  • 区别: 这两个循环次数的作用域不同

3.ForEach控制器

有一个需求:

  1. 有一组关键字 [hello, python, 测试], 使用用户定义的变量存储
  2. 要依次提取出关键字, 并在百度搜索: 例如 http://www.baidu.com/s?wd=python

首先, 定义变量: (注意哦, 这里的变量名后缀不是随便设置的)

接下来配置ForEach控制器:

对于HTTP请求, 我们要引用之前输出的变量名称:

所以, 总结来说:

ForEach控制器与 用户定义的变量 或者 正则表达式提取器 配合使用, 循环读取返回的变量中的值, 执行一次或者多次.

配置起来也很简单:

  • 用户定义的变量
    • 变量名: 固定前缀+连续数字
  • ForEach控制器
    • 变量前缀: 用户定义的变量中配置的固定前缀
    • 起始数字: 连续数字的最小值-1
    • 结束数字: 连续数字的最大值
    • 输出变量名称: 依次读取变量值后存储到参数中, 供HTTP请求来引用.
  • HTTP请求
    • 引用输出的变量名称

在实际工作中, ForEach控制器经常与正则表达式配合使用:

  • 先通过正则表达式提取器, 提取出请求中所有满足条件的数据
  • 添加ForEach控制器, 并配置提取所有满足条件的数据, 并保存为变量
  • 在其子节点下, 添加HTTP请求并引用变量, 即可循环读取正则表达式中匹配的所有数据

五、定时器

1.同步定时器

当前需要进行 大量用户的并发测试 时, 为了让用户能真正的同时执行, 添加同步定时器, 用于阻塞线程, 直到线程数达到预先配置的数值, 才开始执行取样器的操作.

配置:

  • 并发数: 同时达到多少用户才开始发送数据
  • 超时时间:
    • 必须配置: 否则当虚拟用户数无法被并发数整除时, 就会有部分的用户挂起无法执行
    • 配置超时时间不能太短, 必须比上面配置的并发数加载的时间要长, 否则无法达到并发数的要求, 数据就会被释放掉

2.常数吞吐量定时器

用于性能测试时模拟用户产生的业务压力, 通过指定QPS来对服务器发送固定频率的请求.

六、JMeter分布式测试

1.应用场景

当测试机无法模拟用户需要的业务负载量时, 需要使用多台测试机配合测试.

比如上面一台机器的吞吐量每秒只能发送10次, 我们想要的吞吐量是20次/秒, 这时候就需要使用多台测试机配合使用.

2.原理

  • 分布式测试分为一台控制机和多台代理机
  • 控制机负责发布测试任务给代理机
  • 代理机接收任务并向服务器发送请求, 并接收服务器返回的响应, 然后将测试结果返回给控制机
  • 有控制机对测试结果数据进行汇总统计

3.分布式相关的注意事项

  • 所有的测试机防火墙都已关闭
  • 所有的测试机及服务器在同一个网络内
  • 所有测试机的JMeter版本和JDK版本完全相同
  • 关闭JMeter里的RMI SSL开关

4.分布式配置

配置:

  • 代理机:
    • server_port: 不重复. 如果使用多台代理机, 可不用配置
    • 关闭 RMI SSL (在配置文件中)
  • 控制机
    • remote_server: 所有代理机的IP+port, 有多台代理机时用空格分隔
    • 关闭 RMI SSL

运行:

  • 代理机:
    • jmeter-server.bat运行
  • 控制机:
    • jmeter.bat运行
    • 控制代理机执行脚本: 运行------>远程启动多所有

|----------------------|
| 遇见安然遇见你,不负代码不负卿。 |
| 谢谢老铁的时间,咱们下篇再见~ |

相关推荐
4***R2401 小时前
C++在音视频处理中的库
开发语言·c++·音视频
embrace992 小时前
【C语言学习】结构体详解
android·c语言·开发语言·数据结构·学习·算法·青少年编程
无心水2 小时前
【Python实战进阶】4、Python字典与集合深度解析
开发语言·人工智能·python·python字典·python集合·python实战进阶·python工业化实战进阶
代码不停2 小时前
Java单链表和哈希表题目练习
java·开发语言·散列表
Dxxyyyy2 小时前
零基础学JAVA--Day37(坦克大战1.0)
java·开发语言
u***u6853 小时前
PHP在电商中的WooCommerce
开发语言·php
冠希陈、3 小时前
PHP 过滤敏感词(含类库)
开发语言·php·内容敏感词
qq_401700413 小时前
Qt Positioning 模块访问设备地理位置信息
开发语言·qt
1***s6323 小时前
C++移动语义优化
开发语言·c++