JMeter接口测试-3.断言及参数化测试

1. 断言

JMeter官方断言(Assertion)的定义

  • 用于检查测试中得到的响应数据是否符合预期,用于保证测试过程中的数据交互与预期一致

断言的目的:

  • 一个取样器可以添加多个不同形式的断言,根据你的检查需求来添加相应的断言,当Sampler下所有的断言都通过了, 那才算取样器HTTP请求验证成功。

常用四种断言

一、Response Assertion(响应断言)
二、JSON Assertion(JSON断言)
三、Duration Assertion(持续时间断言)
四、beanshell 断言(自由断言)

1.1 Response Assertion(响应断言)

作用:判断响应的报文内容
作用对象包含: 响应文本、响应内容、响应状态码、响应信息等

案例

  • 登录用例结果验证

操作步骤:

1. 测试计划-线程组
2. 线程组-HTTP请求
3. HTTP请求->断言->响应断言
4. 测试计划->监听器->察看结果树
5. 测试计划->监听器->断言结果

响应断言详解

  1. Apply to:断言应用的范围

    • 通常发出一个请求只触发一个请求,所以勾选“main sampie only”就可以;若发一个请求可以触发多个服务器请求,就有main sample 和sub-sample之分了
    • Jmeter Variable Name to use
      • 作用于Jmeter变量(输入框中可输入Jmeter的变量名称)
  2. 测试字段:

  • 响应文本
    • 一般的http响应,都勾选“响应文本”
    • 匹配从服务器返回的响应文本(不包括Response Headers)
  • 响应代码
    • http响应代码,如101,200,302,404,501等
    • 当我们要验证404,501等http响应代码时,需要勾选“忽略状态”
    • 因为当http 响应代码为400,500时,jmeter默认这个请求时失败的
  • 响应信息
    • 响应代码对应得响应信息,例如“OK"
  • 响应头
    • 匹配响应头
  • 请求头
    • 匹配请求头
  • url样本
    • 对取样器的url进行断言,如果请求没有重定向,就请求url,如果有重定向,就请求url和重定向url
  • 文档(文本)
    • 匹配文档内容
  • 忽略状态
    • 一个请求多项响应断言时,忽略某一项断言的响应结果,而继续下一项断言
  • 请求数据
    • 匹配请求数据
  1. 模式匹配

    • 包括
      • 返回结果包括你指定的内容,支持正则匹配
    • 匹配
      • 相当于 相等 。当返回值固定时,可以返回值做断言,效果和相等相同
      • 正则匹配 。 用正则表达式匹配返回结果,但必须全部匹配。 即正则表达式必须能匹配整个返回值,而不是返回值的一部分
    • 相等
    • 返回值固定时,与返回值验证
    • 不支持正则匹配
    • 同时对大小写敏感
    • 字符串
      • 指返回结果包括你指定的内容,
      • 与包括类似,但是字符串不支持正则匹配
      • 同时对大小写敏感
      • 就相当于取反
      • 如果断言结果为true,勾选“否”后,断言结果为false
      • 如果断言结果为false,勾选“否”后,断言结果为 true
  2. 要测试的模式

    • 输入结果期望值(空格要去掉)

    • 需要匹配的正则表达式、字符串。可以添加多项,每一项会分开进行验证,若某一项验证失败,则其后的不会再进行验证。

    • 可配置多个验证内容,如下图显示

      在这里插入图片描述

  3. 自定义失败消息

    • 失败时,可自定义显示的信息
    • 例如:“失败了,看看日志吧”

1.2 JSON Assertion(JSON断言)

作用: 针对JSON文档的校验

在这里插入图片描述

JSON断言详解:

  • Assert JSON Path exists

    • Additionally assert value
      • 选中进行验证断言内容
    • Match as regular expression
      • 使用正则表达匹配
  • Expected Value

    • 期望结果内容
  • Expect null

    • 预期为null
  • Invert assertion(will fail if above conditions met)

    • 取反,上面的不符合pass,上面的有符合的fail

JSON断言规则

$ 根节点
@ 现行节点
. 子节点
…不管位置,选择所有符合条件的
* 匹配所有元素节点
[,] 支持迭代器中做多选
?() 支持过滤操作
[] 迭代器的标示,子元素操作符
() 支持表达式计算

案例:

  • 商品信息接口用例结果验证

实现步骤:

  • HTTP取样器-商品信息接口
  • 在HTTP取样器下面创建JSON断言
  • 配置JSON断言
  • 在这里插入图片描述

1.3 Duration Assertion(持续时间断言)

判断是否在给定的时间内返回响应结果

作用: 断言服务器响应请求的时间是否小于指定值;
在这里插入图片描述

  • 持续时间(毫秒):
    • 这里的持续时间为毫秒,比如:10 毫秒。
  • 断言响应时间是否超过设置的值(10),如果超过则断言失败,反之成功

2. 接口参数化

2.1 介绍

参数化使用场景

1. 多个请求都是同一个ip地址,若服务器地址更换了,则脚本需要更改每个请求的ip
2. 注册账号,不允许账号重复;想批量注册用户时
3. 模拟多个用户登录,需要用到不同用户信息登录时

JMeter参数化的概念

  • 进行测试时,若要求每次迭代的数据不一样时,则需进行参数化,然后从参数化的文件中来读取测试数据。
  • 自动化测试脚本的一种常用技巧,可将脚本中的某些输入使用参数来代替,如登录时利用GET/POST请求方式传递参数的场景,在脚本运行时指定参数的取值范围和规则
  • 脚本在运行时,根据需要选取不同的参数值作为输入

参数化的四种方式及使用场景对比

参数化使用场景
1CSV Data Set Config适用于参数取值范围较大的时候使用,该方法具有更大的灵活性
2User Parameters适用于参数取值范围很小的时候使用
3User Defined Variables一般用于Test Plan中不需要随请求迭代的参数设置,如:Host、Port Number
4函数可作为其他参数化方式的补充项,如:随机数生成的函数${__Random(,)}

上述四种方案是互补的,我们可以根据参数化具体场景,选择合适方案

2.2 用户定义的变量

应用场景:

  • 用户可根据需求自定义相应的变量,一般做全局变量使用。

介绍:

​ 用户自定义变量中的定义的所有参数的值在测试计划的执行过程中不能发生取值的改变,因此一般仅将测试计划中不需要随迭代发生改变的参数(只取一次值的参数)设置在此处

案例:

​ 使用定义的变量替换Http请求对应参数值,变量使用格式为:${变量}

步骤:

  • 1.测试计划->线程组->配置元件->用户定义的变量

总结:

  • 测试计划下方也有用户定义变量,用法同上
  • 每一个变量分为变量名称和变量值
  • 同一个变量只能有一个变量值。

2.3 用户参数

使用场景

  • 适合少量参数化需求场景使用

操作步骤:

  1. 添加->前置处理器->用户参数
  2. 设置参数项、参数值
  3. 配置HTTP取样器界面的请求参数

在这里插入图片描述

2.4 CSV Data Set Config

使用场景:

  • 适用于各种复杂场景
  • 参数化用的最多的元件

介绍

  • 按照规定的格式读取并将文本解析成对应的变量,可以供其它模块使用。

案例

  • 登录测试用例

操作步骤

1、创建参数化文件:CSV

2、线程组中添加并配置CSV Data Set Config

3、引用csv文件中的数据

4、设置执行次数运行并查看结果

2.4.1 CSV介绍

  • 英文全称:Comma-Separated Values

  • 以纯文本的形式存储表格数据逗号分隔值,是一种简洁且常见的数据存储格式

  • 用文本文件、Excel都可以打开CSV文件

  • 参数文件格式:无BOM的UTF-8格式

在这里插入图片描述

2.4.2 配置CSV Data Set Config

官网:https://jmeter.apache.org/usermanual/component_reference.html#CSV_Data_Set_Config

在这里插入图片描述

  1. 文件名
  • 配置数据源: 文件路径+文件名+后缀名 如:d:/a.txt;

    • 建议使用相对路径,路径一般对当前项目同级目录

      • 目录结构

        在这里插入图片描述

      • 相对路径

        在这里插入图片描述

      • jmeter默认先去bin目录下查找,然后去脚本目录下查找

  1. 文件编码

    • 默认使用当前操作系统的编码格式
    • 如果文件中包含中文乱码时,可尝试utf-8、gbk等
      • 解决1:修改文件格式属性为utf8
      • 解决2:设置文件编码格式为gb2312
    • 变量名称
      • csv文件中各列的名字(有多列时,用英文逗号隔开列名)
      • 名字顺序要与内容对应,这个变量名称是在其他处被引用的,所以为必填项。
  2. 忽略首行

    • 第1行可以不是测试数据
  3. 分隔符:隔开变量的分隔符

    • 一般情况下,分隔符为英文逗号,保持默认就行
  4. 是否允许带引号

    • 测试数据中有引号操作
    • 此项实际是控制csv文件中的双引号是否为有效字符
    • 如果数据带有双引号且此项设置TRUE,则会自动去掉数据中的引号使能够正常读取数据,且即使引号之间的内容包含有分隔符时,仍作为一个整体而不进行分隔;
    • 如果数据带有引号且此项设置为FALSE,则读取数据报错;
    • 如果希望双引号字段中间再包含双引号,则需要加两个双引号来代表单个双引号。
    • 此项设置为true时,“2,3”–>2,3;"4"“5”–>4"5
  5. 结束符再次循环

    • 到了文件尾是否循环,True—继续从文件第一行开始读取,False—不再循环;
  6. 结束符停止

    • 到了文件尾是否停止线程,True—停止,False—不停止
    • 注意:当Recycle on EOF设置为True时,此项设置无效
  7. 共享模式

    • All threads –所有线程,此元件作用范围内的所有线程共享csv数据,每个线程依次读取csv数据,互不重复

      • 假如说有线程1到线程n (n>1),线程1取了一次值后,线程2取值时,取到的是csv文件中的下一行,即与线程1取的不是同一行。

      • 不管是单个线程组还是多个线程组,每个线程都是依次取下一行。

      • 当一个线程组中有多个请求时,对于每个线程来说,在一次循环中每个请求的取值是一样的。

      备注:

      • 怎么区分不同线程呢?

        • 使用一个函数来判断
          • ${__BeanShell(ctx.getThread().getThreadName().toString())}
            • 输出结果类似线程组1 1-2
            • 前面是当前线程组的名称-线程组1,后面是线程组id,然后是线程id
      • 在All Threads模式下,并发数和循环数都会读取不同的csv数据,但是同一线程组内的多个sampler总是取相同的值。

    • Current thread group—当前线程组,在此元件作用范围内,以线程组为单位,每个线程组内的线程共享csv数据,依次读取数据,互不重复;

      • 以线程组为单位,每个线程组内的线程都会从第1行开始取值并依次往下进行取值
    • Current thread—当前线程,在此元件作用范围内,每次循环中所有线程取值一样

      • 每个线程都会从第1行开始取值并依次往下进行取值,在同一次循环中所有的线程取值一样。

参考:

  • 怎么区分不同线程呢?
    • 使用一个函数来判断
      • ${__BeanShell(ctx.getThread().getThreadName().toString())}
        • 输出结果类似线程组1 1-2
        • 前面是当前线程组的名称-线程组1,后面是线程组id,然后是线程id

在这里插入图片描述

2.4.3 引用csv文件中的数据

  • 将具体值改为变量引用,引用变量:${变量名}
  • 在这里插入图片描述

在这里插入图片描述

2.4.4 设置执行次数

  1. 直接指定线程组的循环次数与CSV文件行数一致(灵活性差,了解即可)

  2. 动态的循环读取文件数据(更灵活)

动态循环读取文件数据

  • 线程组的循环次数设置为永远

  • 修改CSV数据文件设置

在这里插入图片描述

2.5 函数助手

启动jmeter后,可以在JMeter的选项菜单中tools->函数助手对话框

在这里插入图片描述

  • 打开函数助手,可以从下拉列表中选择一个函数,并为其参数设定值,

  • 不同函数要求的参数也不同

  • 表格的左边一列是函数参数的简要描述,右边一列是供用户填充参数的值

详细见jmeter帮助文档

在这里插入图片描述

选择Functions reference

在这里插入图片描述

查看20.4 The Function Helper Dialog

在这里插入图片描述

2.5.1 __CSVRead

在这里插入图片描述

作用:

  • 从一个 CSV 文件中返回一个字符串,支持多个文件名
  • 如果测试用例较多,建议使用 CSV Data Set Config
  • 当第一次调用该函数时,文件将被打开并读取到一个内部数组中。如果检测到空行,这将被视为文件的末尾。
  • 所有对同一文件名的后续引用都使用相同的内部数组,文件名区分大小写。
  • 每个线程都有自己的指向文件数组中当前行的内部指针。
  • 当线程首先引用文件时,它将在数组中分配下一个空闲行,因此每个线程将访问与所有其他线程不同的行(除非数组中的线程多于行)

使用:

  • http请求时参数化username和password
    • 帐号的value为${__CSVRead(./logins.txt,0)}
    • 密码的value值替换为${__CSVRead(./logins.txt,1)}

2.5.2 __Random

随机函数返回位于给定最小值和最大值之间的随机数,这是针对数值类型的(int)

在这里插入图片描述

  • 存储结果的变量名(可选):这个填写了,到时候调用是就用这个做变量名调用

2.5.3 __counter

在这里插入图片描述

  • 每次调用该计数器函数都会产生一个新值,从1开始每次加1。

  • 计数器既可以被配置成针对每个虚拟用户是独立的,也可以被配置成所有虚拟用户公用的。

  • 如果每个虚拟用户的计数器是独立增长的,那么通常被用于记录测试计划运行了多少遍。全局计数器通常被用于记录发送了多少次请求。

  • 计数器使用一个整数值来记录,允许的最大值为 2,147,483,647。

  • 目前计数器函数实例是独立实现的

  • 该函数也有对应的配置元件:计数器,功能类似。

2.5.3 __time

时间函数以各种格式返回当前时间。

1、如果参数为时间戳,那公式为:
${__time(,)} : 默认该公式精确到毫秒级别, 13位数
${__time(/1000,)} : 该公式精确到秒级别, 10位数
2、 如果参数需要为当前日期,那公式为:
${__time(yyyy-MM-dd,)}
${__time(YMDHMS,)}

2.5.5 __property

使用__property__BeanShell配合使用实现跨线程组变量的使用

等讲到关联功能一起给大家进行讲解

2.5.6 __BeanShell

${__BeanShell(vars.put("name"\,"value"))}

3. 关联

什么是关联?

  • 一个请求响应的结果要作为另一个请求提交的数据

注意: 由第一个请求响应的结果,我们在第二次请求中使用, 我们会发现,关联是后置处理器的一部分.

Jmeter关联中常用的两种方式

案例:

  • 个人信息接口用例

实现步骤:

  • 登录接口获取token

  • 个人信息接口HTTP请求头中添加token

  • 发送个人信息接口请求

实现登录接口获取token

  • 正则表达式提取器

3.1 正则表达式提取器

3.1.1 正则表达式提取器配置

实现步骤:

  • 添加元件,添加—后置处理器—正则表达式提取器
  • 配置元件
    • 引用名称:token
    • 正则表达式:{“token”:“(.*?)”,
    • 模板:$1$
    • 匹配数字:1
    • 缺省值:为空或为Not Found
  • 增加调试取样器,用于查看提取变量的内容
  • 运行及调试

在这里插入图片描述

小技巧:

  • 可使用察看结果树:RegExp Tester进行正则表达式的验证

在这里插入图片描述

参数解释:

**Apply to:**应用范围

**要检查的响应字段:**样本数据源。

引用名称:

  • Jmeter变量的名称,存储提取的结果

  • 其他地方引用时的变量名称,如填写title,可自定义设置,引用方法:${引用名称}

  • 例如${title}

正则表达式:

  • 用来匹配服务器响应的数据,()括号里为你要获取的的值。
  • 一般值的名称(键)是不会发生改变的。要获取特定的数据,都会结合不变的内容(左右边界),然后
    将需要提取的服务器数据替换为(.*?)即可
  • 建议在查看结果树中,切换到regexp tester模式,对所写的正则表达式进行测试

模板:

  • 模板:$$格式,属性的作用是用来指定最终存储到参数中的值
  • $1$表示解析到的第1个值,可以理解为将正则表达式中的第一对括号所对应匹配到的值赋值给参数。
  • 如果匹配有2个值,第二个值$2$,以此例推

匹配数字:

  • 正则表达式匹配数据的所有结果可以看做一个数组,匹配数字即可看做是数组的第几个元素。
  • -1表示全部,0随机,1第一个,2第二个,以此类推。若只要获取到匹配的第一个值,则填写1
  • 数字0:就表示将所匹配到的值随机提取一个赋值给参数。
  • 负数:通常是-1,就表示将所有匹配到的值以类似于数组的方式存入参数数组
    • 如果匹配数字为-1,就表示希望对所有数据进行遍历操作
    • 此时需要结合Jmeter的逻辑控制器, -foreach 控制器来实现遍历操作

缺省值:

  • 匹配失败时的默认值。可以不写,如果写通常ERROR

正则表达式

  1. .

    • 匹配任意单个字符
  2. *

  • 匹配前面的子表达式(也可以是一个字符)任意次。
  • 例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”。*等价于o{0,}
  1. +
  • 匹配前面的子表达式一次或多次(大于等于1次)。
  • 例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
  1. ?
  • 匹配前面的子表达式零次或一次。
  • 例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。
  1. \d数字

  2. \w 数字或者字母

  3. {n} 表示n个字符

  4. {n,m} 表示n-m个字符

  5. \s 表示空白符

  6. 括号[] 表示范围,比如:

    [0-9a-zA-Z\_] 可以匹配一个数字、字母或者下划线

  7. ^ 表示行的开头,^\d表示必须以数字开头

  8. $ 表示行的结束,\d$表示必须以数字结束

  9. A|B  `可以匹配A或B,如`(P|p)ython`可以匹配`'Python'`或者`'python'
    
  10. () 表示的就是要提取的分组

组合:

  • .* 具有贪婪的性质,匹配到不能匹配为止,最大匹配原则。

  • +或*后跟?表示非贪婪匹配,即尽可能少的匹配,最小匹配原则。

  • .*? 表示在能匹配成功的前提下尽可能少的匹配,最小匹配原则。

  • 安装Dummy插件

    • 这个插件可以模拟服务器返回,相当于一个mockserver了

    • 选项–插件管理–可选插件–Dummy

    • 勾选后,点击Apply Changes and Restart JMeter即可

      在这里插入图片描述

  • Dummy插件使用

    在这里插入图片描述

    • 查看dummy元件

      • 在线程组下添加Dummy取样器(在Dummy取样器的响应数据中填入模拟返回数据)、查看结果树监听器,在Dummy下添加正则表达式提取器、调试后置处理程序(用于查看提取结果的)

      在这里插入图片描述

  • 提取多个内容

    • 以登录接口返回内容为例

    • {"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6Ijk1MjY3MzYzOEBxcS5jb20iLCJleHAiOjE1ODEwNDEyOTEsInVzZXJuYW1lIjoicHl0aG9uIiwidXNlcl9pZCI6MX0.Xh1AdjG_a5o9Sg02YnEkpOEpnpr8ZbPF7efImyHaxHM","username":"python","user_id":1}
      
    • 想获取username和user_id拼接成新的字符串

    •  - username_user_id- "username":"(.*?)","user_id":(.*?)}- $1$_$2$- 1
      

      在这里插入图片描述

3.1.2 HTTP信息头管理器

实现:个人信息接口HTTP请求头中添加token

步骤:

  • 查看接口文档:HTTP信息头中添加内容

  • 使用JWT ${token}进行字符器的拼接

    • JWT  ${token}
      #注意JWT与token连接有空格 
      

在这里插入图片描述

备注:

  • 也可以使用函数助手__property来调用token
    • ${__property(token)}

3.1.3 扩展: dummy插件讲解正则表达式:

  • Jmeter插件

  • 下载地址:https://jmeter-plugins.org/downloads/

    • 在这里插入图片描述

    • 安装: 下载后文件为plugins-manager.jar格式,将其放入jmeter安装目录下的lib/ext目录,然后重启jmeter,即可。

    • 启动:启动jemter,点击选项,最下面的一栏,Plugins Manager

      • 在这里插入图片描述

      • Installed Plugins(已安装的插件):即插件jar包中已经包含的插件,可以通过选中勾选框,来使用这些插件

      • Available Plugins(可下载的插件):即该插件扩展的一些插件,可以通过选中勾选框,来下载你所需要的插件

      • Upgrades(可更新的插件):即可以更新到最新版本的一些插件,一般显示为加粗斜体,可以通过点击截图右下角的Apply Changes and Restart Jmeter按钮来下载更新;

      • http://www.jmeter-plugins.org/wiki/Start/,有对应插件的使用说明

  • 安装Dummy插件

    • 这个插件可以模拟服务器返回,相当于一个mockserver了

    • 选项–插件管理–可选插件–Dummy

    • 勾选后,点击Apply Changes and Restart JMeter即可
      在这里插入图片描述

  • Dummy插件使用

    在这里插入图片描述

    • 查看dummy元件

      • 在线程组下添加Dummy取样器(在Dummy取样器的响应数据中填入模拟返回数据)、查看结果树监听器,在Dummy下添加正则表达式提取器、调试后置处理程序(用于查看提取结果的)

      在这里插入图片描述

  • 提取多个内容为一个字符串

    • 以登录接口返回内容为例

    • {"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6Ijk1MjY3MzYzOEBxcS5jb20iLCJleHAiOjE1ODEwNDEyOTEsInVzZXJuYW1lIjoicHl0aG9uIiwidXNlcl9pZCI6MX0.Xh1AdjG_a5o9Sg02YnEkpOEpnpr8ZbPF7efImyHaxHM","username":"python","user_id":1}
      
    • 想获取username和user_id拼接成新的字符串

    •  - username_user_id- "username":"(.*?)","user_id":(.*?)}- $1$_$2$- 1
      

      在这里插入图片描述

  • 提取多个内容为多个字符串

    • 单独提取

      在这里插入图片描述

      • 建立2个正则表达式提取器
      • 分别进行正则匹配
        • 在这里插入图片描述

        • 在这里插入图片描述

    • 根据模板$1$$2$进行获取

      • 在这里插入图片描述

      • 在这里插入图片描述

备注:

  • 访问linux,插件jmeter-ssh-sampler
    • https://github.com/yciabaud/jmeter-ssh-sampler/releases

3.2 JSON提取器

用处:
当前接口响应返回的json中提取内容,作为变量可以在不同的请求中传递。如下,从登陆接口返回的json中提取user id,变量名设置为id,在其他请求中可以直接调用这个变量,或者作为post参数。此插件对于restful接口非常好用。

json串 []表示对象组成的数组,{}表示对象。

对象里包含多个 “属性”:属性值。属性值可以是值,或数组,或对象。

官网链接:

  • http://jmeter.apache.org/usermanual/component_reference.html#JSON_Extractor

在这里插入图片描述

步骤:

  • 配置json提取器

参数解释:

  • Names of created variable :保存的变量名,后面使用${Variable names}引用
  • JSON Path expressions:json path表达式
  • Match Numbers:匹配数字(0代表随机,1代表第一个,-1代表所有),后续引用用 变量名_N 取第N个值
  • Compute concatenation var(suffix_ALL):是否统计所有,即将匹配到的所有值保存,名为“变量名_ALL”,使用场景需要获取的值有多个,后面需要对这一组数据进行操作
  • Default Values:找不到时默认值,一般设置为NOT FOUND

备注:

  • $表示接口的返回值
  • 如果取字典key的value,用
  • 如果是取列表的某个值,用索引

名称:json后置表达式的名称,标识作用,建议使用有意义的名字

步骤:

  • 配置json提取器

在这里插入图片描述

备注:

  • 多个数据json表达式为:$.userSession[0].sessionId,提取第一个值。

  • dummy请求结果:多个数据json

  • [{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6Ijk1MjY3MzYzOEBxcS5jb20iLCJleHAiOjE1ODEwNDEyOTEsInVzZXJuYW1lIjoicHl0aG9uIiwidXNlcl9pZCI6MX0.Xh1AdjG_a5o9Sg02YnEkpOEpnpr8ZbPF7efImyHaxHM",
    "username":"python","user_id":1},{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6Ijk1MjY3MzYzOEBxcS5jb20iLCJleHAiOjE1ODEwNDEyOTEsInVzZXJuYW1lIjoicHl0aG9uIiwidXNlcl9pZCI6MX0.Xh1AdjG_a5o9Sg02YnEkpOEpnpr8ZbPF7efImyHaxHM",
    "username":"python2","user_id":2},{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6Ijk1MjY3MzYzOEBxcS5jb20iLCJleHAiOjE1ODEwNDEyOTEsInVzZXJuYW1lIjoicHl0aG9uIiwidXNlcl9pZCI6MX0.Xh1AdjG_a5o9Sg02YnEkpOEpnpr8ZbPF7efImyHaxHM",
    "username":"python3","user_id":3},]
    
  • 在这里插入图片描述

  • 按索引方式取值

    • 方法1:$[0].username 0表示第1个,如果是想选第2个,则$[1].username

    • 在这里插入图片描述

    • 方法2:$[*].username *表示全部数据,Match NO 添加为3,表示取数据中第3个数据

    • 在这里插入图片描述

  • 获取所有数据

    • 所有数据需要Match No添写为-1,sufiix_all需要选中
    • 在这里插入图片描述

扩展:

  • jsonpath在线分析:http://jsonpath.com/

3.3 边界提取器

不需要写复杂的正则表达式,只要填写左右边界即可,和Loadrunner中左右边界值获取值是一样

  • 右键HTTP请求,选择添加->后置处理器->边界提取器

  • 输入参数名称和左右边界(最好是通过JMeter的日志中获取的返回值输入左右边界)

    • 可通过察看结果树-边界提取器测试进行调试
    • 在这里插入图片描述
  • 具体内容如下图:

在这里插入图片描述

3.4 跨线程组的关联

需求:

  • 线程组1编写登录接口用例
  • 线程组2编写个人信息接口用例
  • 实现线程组2成功获取个人信息

实现步骤

  • 线程组1 登录接口添加BeanShell取样器

    ${__setProperty(authorizations,${token},)}
    

KaTeX parse error: Expected group after '_' at position 2: {_̲_setProperty(au…{token},)}

在这里插入图片描述

  • 线程组2 个人信息接口,修改信息头管理器

    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/874512.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动驾驶系列—智能巡航辅助功能中的路口通行功能介绍

自动驾驶系列—智能巡航辅助功能中的车道中央保持功能介绍 自动驾驶系列—智能巡航辅助功能中的车道变换功能介绍 自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍 自动驾驶系列—智能巡航辅助功能中的路口通行功能介绍 文章目录 2. 功能定义3. 功能原理4. 传感器架构5. 实…

Java语言程序设计基础篇_编程练习题**15.18(使用鼠标来移动一个矩形)

**15.18(使用鼠标来移动一个矩形) 请编写一个程序显示一个矩形。可以使用鼠标单击矩形内部并且拖动(即按住鼠标移动)矩形到鼠标的位置。鼠标点成为矩形的中央习题思路: 新建一个面板Pane(),新建一个Rectangle() 为Rectangle注册…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十九章 Linux MISC驱动

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

web每日一练

每日一题 每天一题罢了。。 ctfshow内部赛签到 扫到备份文件 login.php <?php function check($arr){ if(preg_match("/load|and|or|\||\&|select|union|\|| |\\\|,|sleep|ascii/i",$arr)){echo "<script>alert(bad hacker!)</script>&q…

微服务和VUE入门教程(16): zuul 熔断

1. 前言 在开发工程中&#xff0c;我们发现当一个微服务挂掉之后&#xff0c;如果我们访问此微服务的接口&#xff0c;zuul也会挂掉。因为zuul负责分配请求&#xff0c;当目标微服务挂掉之后&#xff0c;zuul便找不到目标微服务&#xff0c;因为我们需要设置一个熔断&#xff0…

电机调速控制模块说明文档

电机调速控制模块说明文档 图1-1总览图片 概述本电机控制模块是用于精确控制直流无刷电机运行、以及转速的关键组件&#xff0c;它能够实现对电机的启动、停止、调速、转向等操作&#xff0c;并提供多种保护功能&#xff0c;以确保电机的安全稳定运行。 驱动方式&#xff1a;…

如何学习Python:糙快猛的大数据之路(学习地图)

在这个AI和大数据主宰的时代,Python无疑是最炙手可热的编程语言之一。无论你是想转行还是提升技能,学习Python都是一个明智之选。但是,该如何开始呢?今天,让我们聊聊"糙快猛"的Python学习之道。 什么是"糙快猛"学习法? "糙快猛"学习法,顾名思…

OpenGL笔记十四之GLM数学库的配置与使用

OpenGL笔记十四之GLM数学库的配置与使用 —— 2024-07-20 中午 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记十四之GLM数学库的配置与使用1.旋转变换运行效果2.平移变换运行效果3.缩放变换运行效果4.复合变换&#xff1a;先旋转 再平移运行效果5.复合…

OpenTeleVision复现及机器人迁移

相关信息 标题 Open-TeleVision: Teleoperation with Immersive Active Visual Feedback作者 Xuxin Cheng1 Jialong Li1 Shiqi Yang1 Ge Yang2 Xiaolong Wang1 UC San Diego1 MIT2主页 https://robot-tv.github.io/链接 https://robot-tv.github.io/resources/television.pdf代…

八股文之java基础

jdk9中对字符串进行了一个什么优化&#xff1f; jdk9之前 字符串的拼接通常都是使用进行拼接 但是的实现我们是基于stringbuilder进行的 这个过程通常比较低效 包含了创建stringbuilder对象 通过append方法去将stringbuilder对象进行拼接 最后使用tostring方法去转换成最终的…

独立开发者系列(31)——fastadmin项目的二次开发

在前面构建项目的fastadmin入门 里面&#xff0c;我们已经能快速搭建该体系和根据数据表建立最简单的CURD项目。类似练手的图书管理系统&#xff0c;内部项目修改管理&#xff0c;也对系统进行了简单的部署。这梳理拿到真正项目的开发流程。 默认的开发目录和代码程序运行的是p…

【Linux系统化学习】数据链路层

目录 数据链路层解决的问题 以太网 认识局域网 以太网帧格式 两个问题 认识MAC地址 认识MTU ARP协议 ARP协议的作用 ARP数据报格式 ARP协议的工作流程 数据链路层解决的问题 对于TCP/IP四层协议来说&#xff0c;数据链路层才是真正从传送数据进行跑腿办事情的&…

excel批量新建多个同类型的表格

背景引入 比如&#xff0c;一个企业有多个部门&#xff0c;现在需要按照某一个excel表模板收集各个部门的信息&#xff0c;需要创建数十个同类型表格&#xff0c;且标题要包含部门名称。 1.修改模板表格标题 在一个文件夹下面放入需要发放给各个部门的表格&#xff0c;将标题…

微软蓝屏事件暴露的网络安全问题

目录 1.概述 2.软件更新流程中的风险管理和质量控制机制 2.1.测试流程 2.2.风险管理策略 2.3.质量控制措施 2.4.小结 3.预防类似大规模故障的最佳方案或应急响应对策 3.1. 设计冗余系统 3.2. 实施灾难恢复计划 3.3. 建立高可用架构 3.4. 类似规模的紧急故障下的响应…

Kotlin泛型实化

内联函数 reified实现 1. 内联函数 内联函数中的代码会在编译的时候自动被替换到调用它的地方&#xff0c;这样的话也就不存在什么泛型擦除的问题了&#xff0c;因为代码在编译之后会直接使用实际的类型来替代内联函数中的泛型声明。 2. reified关键字 在Kotlin中&#xff0…

秒杀优化: 记录一次bug排查

现象 做一人一单的时候&#xff0c;为了提升性能&#xff0c;需要将原来的业务改造成Lua脚本加Stream流的方式实现异步秒杀。 代码改造完成&#xff0c;使用Jmeter进行并发测试&#xff0c;发现redis中的数据和预期相同&#xff0c;库存减1&#xff0c;该用户也成功添加了进去…

【Node】npm i --legacy-peer-deps,解决依赖冲突问题

文章目录 &#x1f356; 前言&#x1f3b6; 一、问题描述✨二、代码展示&#x1f3c0;三、运行结果&#x1f3c6;四、知识点提示 &#x1f356; 前言 npm i --legacy-peer-deps&#xff0c;解决依赖冲突问题 &#x1f3b6; 一、问题描述 node执行安装指令时出现报错&#xff…

ES中的数据类型学习之ALIAS

Alias field type | Elasticsearch Guide [7.17] | Elastic 这里只针对data type的alias&#xff0c;暂时不说 index的alias。直接实战开始 PUT trips { "mappings": { "properties": { "distance": { "type": &…

Linux、Windows和macOS上使用Telnet

文章目录 LinuxWindowsmacOS 在Linux、Windows和macOS上使用Telnet时&#xff0c;不同的系统有不同的工具和设置方法。以下是在这些系统上使用Telnet的简要说明&#xff1a; Linux 在Linux上&#xff0c;Telnet通常是通过telnet命令来使用的。首先&#xff0c;你需要确保你的系…

前端:Vue学习-3

前端&#xff1a;Vue学习-3 1. 自定义指令2. 插槽2.1 插槽 - 后备内容&#xff08;默认值&#xff09;2.2 插槽 - 具名插槽2.3 插槽 - 作用域插槽 3. Vue - 路由3.1 路由模块封装3.2 声明式导航 router-link 高亮3.3 自定义匹配的类名3.4 声明式导肮 - 跳转传参3.5 Vue路由 - 重…