jmeter构造测试数据

软件环境

软件名称

软件版本

说明

JMeter

5.4.1

构造测试数据工具,建议使用最新版本

Java

8

Java环境

Mysql

5.7

数据库

mysql-connector-java-5.1.45-bin.jar

5.1

数据库依赖包

系统

--

Windows/Linux均可

本文档已mysql数据库为例讲解,但不只限于mysql数据库,支持的数据库如下:

jmeter构造测试数据_第1张图片

使用场景

场景名称

使用说明

单表数据构造

在jmeter中使用一个线程组运行即可

多表数据构造

在jmeter中使用多个线程组运行,每一个线程组配置不同的数据表

多表关联数据构造

关联字段可以使用同一个变量(把变量设设置为公共变量即可)

本文档主要是针对单表插入数据进行说明

支持构造的数据类型

数据类型

解决方法

使用方法

ID自增

使用Jmeter 计数器组件

Id字段

随机整数

使用Jmeter random 函数

${__Random(10,20,)}生成10-20之间的随机整数

求和

使用 Jmeter intSum函数

${__intSum(10,5,sum)} 5+10的和

随机日期

使用 Jmeter RandomDate 函数

${__RandomDate(,1990-01-01,2021-12-31,,)},生成1990-01-01到2021-12-31的随机日期

随机字符串

使用 Jmeter RandomString 函数

${__RandomString(3,abcdefg)}

随机从abcdefg中生成长度为3的字符串

时间戳

使用 Jmeter Time函数

${__time(,)}默认为当前时间的时间戳,精确到毫秒1630398198008

字符串/数字加密

使用 Jmeter digest函数

${__digest(MD5,18910554406,,,)}

将字符串进行MD5加密:c49f00b92667a35c63708933384dad52

日期格式转换

使用 Jmeter dateTimeConvert函数

${__dateTimeConvert(20180112, yyyyMMdd,yyyy/MM/dd,)}

将20180112转换为2018/01/12

支持构造的数据类型

字段

解决方法

说明

判断两个数字/字符是否相等

使用 Jmeter if函数

多字段逻辑计算

使用 Jmeter jexl3函数

比如多个字段需要进行加减乘除计算

枚举值

使用 Jmeter CSV组件

比如:省份

字符串拼接

使用 Mysql CONCAT函数

CONCAT(“130",“434 ",“19901012 ", “6935")

随机小数

使用Mysql random 函数

数据格式0.540444841180411

四舍五入

使用Mysql ROUND函数

ROUND(99.999999,2)

返回结果:99.99

UNIX时间戳

使用Mysql UNIX_TIMESTAMP()函数

精确到秒:1630399894

目前就整理了这么多,如果有需要可以在进行补充

自增ID_计数器组件

jmeter构造测试数据_第2张图片

 Starting value:给定计数器的起始值、初始值,第一次迭代时,会把该值赋给计数器 

递增:每次迭代后,给计数器增加的值

Maximum value:计数器的最大值,如果超过最大值,重新设置为初始值(Start),默认的最大值为Long.MAX_VALUE,2^63-1(如果持续压测,建议最好不要设置最大值)

数字格式:可选格式,比如000,格式化为001,002

引用名称:用于控制在其它元素中引用该值,形式:$(id}

随机数_random 函数

    random 函数返回一个介于给定最小值和最大值之间的随机数

属性

说明

是否必填

第一个参数

最小值

第二个参数

最大值

第三个三处

变量名称

例子:

${__Random(0,10,MYVAR)}

将返回 0到10之间的随机数,并将其结果存储在MYVAR变量中

求和_intSum 函数

    intSum 函数可用于计算两个整数值的总和

属性

说明

是否必填

第一个参数

第一个 int 值

第二个参数

第二个 int 值

最后一个

用于重用此函数计算的值的引用名称。如果指定,引用名称必须至少包含一个非数字字符,否则它将被视为要添加的另一个 int 值。

例子:

${__intSum(2,5,MYVAR)}

将返回 7 (2+5) 并将结果存储在 MYVAR 变量中。所以${MYVAR}将等于 7。

随机日期_RandomDate 函数

RandomDate 函数返回位于给定开始日期和结束日期值之间的随机日期。

属性

说明

是否必填

第一个参数

时间格式(默认yyyy-MM-dd)

第二个参数

开始日期,默认为现在

第三个参数

结束日期

必填

第四个参数

语言环境的字符串格式。语言代码必须小写。国家/地区代码必须大写。分隔符必须是下划线,例如en_EN

第五个参数

要设置的变量名称

例子1:${__RandomDate(,,2050-07-08,,)}

将返回now和2050-07-08之间的随机日期。例如2039-06-21

例子2:${__RandomDate(dd MM yyyy,,08 07 2050,,)}

将返回一个带有自定义格式的随机日期,如04 03 2034

随机字符串_RandomString 函数

RandomString 函数使用要使用的字符中的字符返回长度随机的字符串

属性

说明

是否必填

第一个参数_长度

生成字符串的长度

第二个参数_要使用的字符串

生成字符串的范围

第三个参数_变量名

引用变量

例1:${__RandomString(5)}

将返回一个 5 个字符的随机字符串,该字符串可以是可读的,也可以是不可读的

例2:${__RandomString(10,abcdefg)}

将返回从abcdefg集合中选取的 10 个字符的随机字符串,例如cdbgdbeebd或adbfeggfad,...

例3:${__RandomString(6,a12zeczclk, MYVAR)}

将返回从a12zeczclk集合中选取的 6 个字符的随机字符串并将结果存储在MYVAR 中,MYVAR将包含像2z22ak或z11kce这样的字符串,...

时间_time 函数

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

属性

说明

是否必填

第一个参数_格式

要传递给SimpleDateFormat的格式。该函数支持各种速记别名,如果省略,该函数返回自纪元以来的当前时间(以毫秒为单位)。

第二个参数_变量名

要设置的变量的名称。

时间速记名别名:

YMD = yyyyMMdd

HMS = HHmmss

YMDHMS = yyyyMMdd-HHmmss

可以通过设置适当的 JMeter 属性来更改默认值,例如 time.YMD=yyMMdd

例1:${__time(dd/MM/yyyy,)}

如果在 2018 年 1 月 21 日运行, 将返回21/01/2018

例2:${__time(YMD,)}

如果在 2018 年 1 月 21 日运行, 将返回20180121

例3:${__time()}

将以毫秒为单位返回时间1516540541624

加密_digest函数

time 函数返回特定散列算法中的加密值。

属性

说明

是否必填

第一个参数_算法

支持的加密算法如下:MD2,MD5,SHA-1,SHA-224,SHA-256,SHA-384,SHA-512

第二个参数

要加密的字符串

第三个参数

在加密字符串之后加入其他字符

第四个参数

结果默认为小写。选择 true 到大写结果。

第五个参数

变量名称

例1:${__digest(MD5,18910554406,,,)}

返回c49f00b92667a35c63708933384dad52

例2:${__digest(SHA-256, MD5,18910554406,,,)}

返回a3bc6900fe2b2fc5fa8a601a4a84e27a079bf2c581d485009bc5c00516729ac7

幻灯片13

日期格式转换_dateTimeConvert函数

__dateTimeConvert函数转换即在源格式转换成目标格式任选将结果存储在变量名的日期。

属性

说明

是否必填

第一个参数_日期字符串

要从源日期格式转换为目标日期格式的日期字符串。如果源日期格式为空,则可以在此处使用日期作为纪元时间

第二个参数_源日期格式

原始日期格式。如果为空,则日期字符串字段必须是纪元时间。

第三个参数_目标日期格式

新的日期格式

第四个参数

变量名称

例1:${__dateTimeConvert(01212018,MMddyyyy,dd/MM/yyyy,)}

返回21/01/2018

具有纪元时间值:1526574881000,

例2:${__dateTimeConvert(1526574881000,,dd/MM/yyyy HH:mm,)}

返回17/05/2018 16:34 UTC 时间(-Duser.timezone=GMT)

幻灯片14

字符串大小写转换_changeCase函数

change case 函数返回一个字符串值,该值已按照特定模式更改。结果可以选择保存在 JMeter 变量中。

属性

说明

是否必填

第一个参数

将更改大小写的字符串

第二个参数

用于更改大小写的模式,例如ab-CD eF:

UPPER:结果为 AB-CD EF

LOWER: 结果为 ab-cd ed

第三个参数

变量名称

例1:${__changeCase(Avaro omnia desunt\, inopi pauca\, sapienti nihil,UPPER,)}

将回归AVARO OMNIA DESUNT、INOPI PAUCA、SAPIENTI NIHIL

例2:${__changeCase(LABOR OMNIA VINCIT IMPROBUS,LOWER,)}

将返回劳动omnia vincit improbus

幻灯片15

判断_if函数

if函数判断给定条件是否成立

属性

说明

是否必填

第一个参数

实际值

第二个参数

预期值

第三个参数

如果相当择返回的值

第四个参数

如果不相等返回的值

第五个参数

变量名称

例1 中文比较:${__if(中文,中文,true,false,)}

相等,所以返回 true

例2 字符串比较 :${__if(abc,abc,true,false,)}

相等,所以返回 true

例3 数字比较 : :${__if(1000,1000,true,false,)}

相等,所以返回 true

逻辑计算__jexl3函数

jexl 函数返回计算Commons JEXL 表达式的结果

属性

说明

是否必填

第一个参数

表达式,例如,6*(5+2)

第二个参数

变量名称

例:

求两个数的平均值:

${__jexl3((100+80)/2,avg)}

枚举值_ CSV 数据文件设置 组件

jmeter构造测试数据_第3张图片

 字段说明:

1.文件名: 建议写文件的绝对路径

2.变量名称:多个变量用逗号隔开,第一个变量对应文件中的第一列,第二个变量对应的是第二列一次类推

3.忽略首行:根据实际情况选即可,如果文件中有标题就需要忽略首行

4.其他字段保持默认即可

5.变量引用:直接${prov}即可

字符串拼接__CONCAT函数

函数

说明

函数所属

示例

CONCAT(s1,s2...sn)

字符串 s1,s2 等多个字符串合并为一个字符串

MySQL

SELECT CONCAT("SQL ", "Runoob ", "Gooogle ", "Facebook") AS ConcatenatedString;

例:身份证号拼接

SELECT CONCAT('130', '434', '19901012', '6935’)

CONCAT('131','434',${__dateTimeConvert(${var},yyyy-mm-dd,yyyymmdd,)},'6935')

结果:

130434199010126935

随机数__RAND函数

函数

说明

函数所属

示例

RAND()

返回 0 到 1 的随机数  

MySQL

SELECT RAND() --0.93099315644334

例1:

SELECT RAND();

结果:

返回 0 到 1 的随机数  

例2:

SELECT RAND() * 100;

结果:

返回100以内的随机数

幻灯片20

Mysql日期/时间数据类型

函数

说明

函数所属

示例

CURDATE()

返回当前日期

MySQL

SELECT CURDATE();

返回结果:2021-08-24

CURRENT_TIME()

返回当前时间

MySQL

SELECT CURRENT_TIME();

返回格式:16:44:08

CURRENT_TIMESTAMP()

返回当前日期和时间

MySQL

SELECT CURRENT_TIMESTAMP();

返回格式:2021-08-24 16:45:33

ROUND()

四舍五入

MySQL

SELECT ROUND(99.999999,2);

返回结果:99.99 保留两位小数

UNIX_TIMESTAMP()

默认返回当前时间的时间戳(秒)

MySQL

SELECT UNIX_TIMESTAMP()

返回:当前时间时间戳,格式1629855415

SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19’);

返回:传入时间的时间戳

1447431619

JSON_OBJECT()

评估键值对(可能为空)列表并返回包含这些对的 JSON 对象。如果任何键名称是NULL或参数数量是奇数,则会发生错误。

mysql

SELECT JSON_OBJECT('id', 87, 'name', 'carrot’);

返回结果:{"id": 87, "name": "carrot"}

多表关联

示例:从多个表中抽出部分字段合成一个新的数据表,现在以两个表为例进行说明

表1:学生表(student),数据如下:

jmeter构造测试数据_第4张图片

表2:班级表(class),输入如下:

jmeter构造测试数据_第5张图片

需求:要将student表中的stu_id,stu_name,gender三个字段和class表中的class_name字段抽取,并输出到一张新表(stu_class)中

多表关联

具体步骤如下:

1.添加输入表JDBC Request组件,并在组件中进行配置

jmeter构造测试数据_第6张图片

 多表关联

参数说明:

1).要添加的JDBC Request组件

2).Query Type:选择Select Statement

3).具体查询的SQL语句,查询的结果不要使用”*”,要写具体的字段

4).Variables names:将查询的结果存入定义的变量中,变量定义的顺序要跟SQL中查询结果的字段要一一对应,比如第一个变量对应的查询结果中的第一个字段,以此类推.

多表关联

2.创建输出表JDBC Request组件,并进行配置,见下图:

jmeter构造测试数据_第7张图片

多表关联

上图参数说明:

1)Query Type:这里选择Update Statement(新增数据和修改数据都选择此项)

2)Query:这里输入插入数据的SQL语句,对应的字段为输入表JDBC Request组件中添加的变量,见上图

这里需要注意下,输入表JDBC Request组件中添加的变量不能够直接使用,需要配置V函数进行使用,使用格式为:${__V(stu_name_${num})}

函数中的stu_name为输入表JDBC Request组件中添加的变量,${num}为计数器组件中设置的引用变量名称,

当变量的值为1时${__V(stu_name_1)}代表stu_name名称列的第一条数据,当变量的值为2时${__V(stu_name_2)}代表stu_name名称列的第二条数据,以此类推

多表关联

3.输入和输出都配置好之后可以运行脚本并查看结果,将线程数设置成5,并执行脚本

jmeter构造测试数据_第8张图片

jmeter构造测试数据_第9张图片右图可见数据已经成功的插入新表中了,如果需要对插入的数据字段做处理,可以参考之前的章节调用对应的和函数和组件即可

你可能感兴趣的:(数据库,jmeter,压力测试,测试工具,数据库)