
|----------------|
| 你好,我是安然无虞。 |
文章目录

一、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控制器
有一个需求:
- 使用用户自定义的变量, 定义一个变量name, name的值可以是baidu或bilibili
- 根据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控制器
有一个需求:
- 有一组关键字 [hello, python, 测试], 使用用户定义的变量存储
- 要依次提取出关键字, 并在百度搜索: 例如 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运行
- 控制代理机执行脚本: 运行------>远程启动多所有
|----------------------|
| 遇见安然遇见你,不负代码不负卿。 |
| 谢谢老铁的时间,咱们下篇再见~ |