测试计划定义变量,线程组中设置用户定义变量

在测试计划中添加的变量可以所有的线程组中使用。
image.png
也就是说,变量名只能存在一个。 类似与Postman中 Global 变量。

线程组设置变量

在线程组中添加 【用户定义的变量】,在用户定义的变量中设置的变量,只能在当前线程组中使用,类似Postman中定义 环境变量。
image.png
企业微信的接口中, 前缀 都一样
image.png

image.png

运行之后,可以看到执行的结果中,使用的变量是 线程组中定义的用户变量,没有用 测试计划 中设置的变量。

image.png

常问面试题

  1. jmeter 中设置变量的方式有哪些?
    1. 在【测试计划】中设置变量,可以所有的线程组中使用;
    2. 在【线程组】—【用户定义的变量】设置的变量,可以在所有的线程组中使用。
      1. 如果在两个线程组中分别创建同样的变量,使用的时候不确定用的哪个线程组中变量。
      2. 建议使用 【测试计划】中创建的变量。
    3. 在进行上下游传参的时候,使用JSON提取器,动态获取服务器返回的结果,提取对应值 设置为变量。
      1. 与上面方式不同的是:取到的值是动态的。
      2. 上面两种方式设置的值是固定。
    4. 正则表达式也可以设置变量。变量也是动态的。
    5. 函数助手中也可以使用JMeter内置的函数设置变量。

正则表达式提取器

正则表达式提取器与JSON提取器的 最终目的是一样的: 都是为进行上下游传参设置。

正则表达式更强大,json提取器能提取到的数据,正则也能!

正则提取器能提取到的数据,JSON提取器不一定能。


下面看个例子:
标记单个消息为已读,前提条件是:必须要有未读的消息。
image.png

未读消息的接口:
image.png

这两个接口就有上下游传参

创建上游接口

image.png
查看服务器返回的结果
image.png
里面返回很多数据。

使用Json提取器提取

在查看结果树中,使用json Path Tester 进行查看
image.png

先使用json提取器 提取出来
image.png
对应的json提取器表达式

  1. $.data.hasnot_read_messages[0].id
  • [0] 表示的是 第一个未读消息。
    1. {
    2. "data":{
    3. "hasnot_read_messages":[
    4. {"id":"1111111222"},
    5. {"id":"22222333344"}
    6. ]
    7. }
    8. }
    使用json提取器, 提起data的值
    1. $.data
    data 对应的值是
    1. {
    2. "hasnot_read_messages":[
    3. {"id":"1111111222"},
    4. {"id":"22222333344"}
    5. ]
    6. }
    再次提取 hasnot_read_messages 对应值
    1. $.data.hasnot_read_messages
    取到的值为 对应的数组,数组表示多个数据。
    1. [
    2. {"id":"1111111222"},
    3. {"id":"22222333344"}
    4. ]
    从数组中提取第一个。 索引为0
    1. $.data.hasnot_read_messages[0]
    取到对应的结果
    1. {"id":"1111111222"}
    最后取对应的id值
    1. $.data.hasnot_read_messages[0].id
    设置json路径表达式
    image.png

创建下游接口标记单个消息为已读,通过引用变量的方式。
image.png

附件
json提取器测试计划.jmx


使用正则表达式提取

https://jmeter.apache.org/usermanual/regular_expressions.html

先在查看结果树中测试一下 正则表达式能否找到对应的数据
image.png
比如上面例子中,要提取的是 发布话题返回的topicid。
1、 先找到对应的特征
2、根据特征,将要提取的部分使用 (.+?) 来表示。

创建正则表达式

image.png
在新建话题上添加 正则表达式 提取器
image.png引用名称: 就是设置变量名
正则表达式: 上面写好的正则表达式
模板: 固定写法 $1$


下游接口中引用变量
image.png

现在一个接口返回的数据比较多,如何通过正则表达式来提取自己想要的结果。
image.png

发现要提取字段特征:
"hasnot_read_messages":[{"id":"6118ba5348d7e392e2fc4f3a"
要从这段字符串中提取结果
因为 [``{ 也是正则表达式中的语法。
不能直接使用 "hasnot_read_messages":[{"id":"(.+?)" 这种方式来做正则匹配。
要 [ { 当成为具体的字符来使用。所以 这个正则表达式应该为

  1. "hasnot_read_messages":\[\{"id":"(.+?)"

\ 可以将正则表达式中的字符变为正常的字符来使用。

设置正则表达式提取器
image.png
引用变量
image.png

运行
image.png

附件
线程组-正则表达式提取.jmx

常见面试问题

  1. 你是怎么处理接口中上下游关系的?

参考回答:
在我们的公司内部接口中,因为要测试整个流程,不同的接口之间存在关联,比如我之前做的移动办公项目,里面有会议室管理功能,添加会议室与删除会议室两个接口之间存在上下游关联。
a. 先根据业务确定上下游位置,上游 添加会议室
b. 上游接口中使用 JSON提取器 或者 正则表达式提取器 提取其中的数据,设置变量。
c. 下游接口中 通过引用变量的方式进行参数传递。

  1. json提取器和正则表达式提取器的区别?

参考回答:
正则表达式提取器可以在任意的返回结果中 都可以进行数据提取、
JSON提取器适用于服务器返回结果中为JSON格式的数据。

正则表达式语法复杂,
JSON提取器相对比较简单。

两种方式都是为了解决具体的参数传递问题。我在公司中因为服务器返回结果都是json格式,我一般使用json提取器。