Jmeter 的有多种变量类型,有其各自的作用域。有时候不小心就会使它们之间相互冲突或者覆盖,本文梳理各种类型变量的生成方法、使用特点、作用范围。

目录

变量类型

Jmeter 中的变量分别有以下几种:

User Defined Variables

User Parameters

属性 Properties

运行中创建的变量

我们分开单独研究各自的特点。

User Defined Variables(UDV)

User Defined Variables 是一种 Config Element,简称 UDV,用于在测试开始时,设定静态值,添加方法如下所示:

Add > Config Element > User Defined Variables

初始化

UDV 在测试计划开始时初始化, 官方文档 是这么解释的:

不能将每次调用都会改变返回值的函数作为 UDV 的取值来源,如果这么做了,仅第一次返回值会被保存在 UDV 中。

这说明 UDV 是在测试开始时初始化,所以 UDV 无法引用那些后续测试元件中才出现的变量。

静态值

UDV 的值在整个测试期间是不变的,用于保存在整个测试期间的静态值。使用 UDV 的好处是方便维护测试用例,避免在多个地方重复填写,而且方便后续修改。比如,被测系统的 IP、端口。

作用域

无论 UDV 在任何位置上,都会在测试开始时初始化,并且影响所有线程组。例如,如果在UDV中定义了一个变量 a=1,那么在所有线程组中都可以看到这个变量 a=1

Test Plan

├─Thread Group 1(${a}=1,来自 UDV)

│ └─User Defined Variables (定义a=1)

└─Thread Group 2 (${a}=1,来自 UDV)

不过,为了更好的可读性,应该把 UDV 放置于 Test Plan 的最顶部,当测试用例初始化后,UDV 的值将被复制到各个 Thread Group 中。例如这样:

Test Plan

├─ User Defined Variables (定义a=1)

├─ Thread Group 1 (${a}=1,来自 UDV)

└─ Thread Group 2 (${a}=1,来自 UDV)

如果运行时创建的变量和某个 UDV 重名, UDV 的值会在当前的 Thread Group 内被覆盖。

Test Plan

├─ User Defined Variables (a=1)

├─ Thread Group 1

│ └─ Post Processor

│ └─(${a}=2,覆盖 UDV)

└─ Thread Group 2 (${a}=1,来自 UDV)

User Parameters

首先,User Parameters 是 Pre Processors 的一种,添加方法如下所示:

Add > Pre Processors > User Parameters

用来建立线程间独立的、属于各用户的变量,和 上面的 UDV 最大的不同就是,User Parameters 可以指定各个用户(线程)的变量值。比如设置了如下用户变量值:

Name:

User_1

User_2

User_3

a

1

2

3

那么这时创建多个用户(线程),他们会依次读取列表中的数值。如果用户数量比列表中的数值个数多,则会循环往复。如果创建5个用户,那么每个用户拿到的变量值可能是这样:

运行时动态创建的线程:

Thread 1: ---- a=1 ----

Thread 2: ---- a=2 ----

Thread 3: ---- a=3 ----

Thread 4: ---- a=1 ----

Thread 5: ---- a=2 ----

……

属性 Properties

Properties,属性是 Jmeter 最顶层的命名空间,在整个 Test Plan 里都可读写,可以随时随地的使用,用于在 线程组间共享值 。

Test Plan (读取同一个属性a)

├─ User Defined Variables (读取同一个属性a)

├─ Thread Group 1 (${a}=1,读取同一个属性a)

└─ Thread Group 2 (${a}=1,读取同一个属性a)

声明属性

声明属性的方法有以下几种:

在 bin 文件夹下的 jmeter.properties 文件

${__setProperty} 函数

Jmeter 的启动参数中携带 -J属性名

Groovy 语言中的 props.put 方法

读取属性

读取属性有以下几种途径:

${__property} 函数

${__P} 函数

Groovy 语言中的 props.get 方法

运行中创建的变量

当你使用正则表达式处理器(Regular Expression Extractor)提取出特定的字符串时,就可以自动创建变量,保存提取出的字符串。

这个变量只能在当前的线程组中访问,跨线程组,需要用到 Jmeter 属性 . 访问的方法有: