首页 > 代码库 > JMeter:基本及参数化、关联

JMeter:基本及参数化、关联

一、JMeter和LoadRunner对比

1、lr稳定,使用c写,jmeter跨平台,免费,开源,小巧,java写的;

2、jmeter没有进程方式,只有线程;

3、jmeter没有IP欺骗;

4、lr有不同带宽下的测试,jmeter没有。

 

二、JMeter的配置

1、path环境变量的配置:

程序的执行需要使用外部的指令javac,但是javac仅仅只能在jdk安装目录下的bin目录下执行,因此程序只能写入bin目录。程序开发过程中,不能将源代码写入JDK的安装目录,因此需要将源程序保存到任意位置的指定目录(英文目录),所以需要使javac指令在任意目录下可以运行。

path环境变量的参照形配置方式
创建新的变量名称:JAVA_HOME
为JAVA_HOME添加变量值:JDK安装目录
将path环境变量中JDK目录修改
%JAVA_HOME%\bin;

在切换jdk时,只需要修改JAVA_HOME

2、classpath环境变量的配置:

classpath环境变量配置方式
创建新的变量名称:classpath
值设定为指定的还有class文件的目录,多个目录间使用分号(;)分割
作用:使classpath目录中的.class文件可以在任意目录运行
技巧:通常将配置的目录最前面添加.配置,即当前目录,使.class文件搜索时首先搜索当前目录,然后根据目录配置的顺序依次查找,找到后即运行,因此classpath目录中的配置存在先后顺序

在jmeter配置过程中,jdk的配置中classpath的配置:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

3、配置jmeter环境变量:

JMETER_HOME:D:\apache-jmeter-3.2   → 根据jmeter实际的解压路径填写

calsspath:%JMETER_HOME%\lib\ext \ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\log4j-1.2-api-2.8.1.jar;

 

jmeter最小组成单元是测试计划

任何性能测试工具的实质是:一个请求,外边套上多线程,使用多线程发请求

jmeter录制脚本(如何录制?)

 

拓展:常见的服务器软件(应用程序)分配端口如下:

FTP:21
SSH:22
MYSQL:3306
DNS:53
HTTP:80
POP3:109
Https:443

 

三、JMeter基本说明

使用JMeter录制豆瓣api接口:

1、添加http请求:

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

2、参数:

技术分享

3、JMeter变量/参数作用域:

技术分享

技术分享

新增"线程组2":

技术分享

技术分享

由此可知全局变量Identify一样作用于线程组2

技术分享

如果将查看结果树,放置和线程组同级,那么在请求完毕后,查看结果树中,会出现两个请求,如上图。

技术分享

技术分享

技术分享

发送请求后:

技术分享

技术分享

技术分享

 

四、参数化

1、取值方式

1)随机取值:

技术分享

技术分享

2)固定取值:

技术分享

在D盘下,建立文本文件lhy.txt,并初始化文本文件内容:

技术分享

 

文件值以参数的形式传递:

配置Jmeter如下图:

技术分享

相关字段说明:

filename:文件的绝对路径和文件名
file encoding:文件的编码方式,一般情况下,留空就好
varable names:对外进行值传递的key(key的名称不能重复,即使有多个CSV DATA SET Config),jmeter的文本文件中,没有key列,数据全部标识值
delimeter:分隔符
如果不想定义多个CSV DATA SET Config的话,就在一个CSV DATA SET Config文件中,配置多列,用约定的分隔符进行列的分割;如果想一个CSV DATA SET Config对应的文件中,只有一列,当需要传递多个参数时,就定义多个CSV DATA SET Config,并建立对应的文本文件保存相关的值。

 

http请求中,配置参数wd取配置的参数文件中的key2即lhy.txt文件的第二列的值:

技术分享

发送请求,测试参数化的值传递:

技术分享

对应lhy.txt文本文件第二列的值,已经对服务器发送了请求。

 

是否去除引号:

修改lhy.txt文件,如下图:

技术分享

修改http请求中参数wd的取值:

技术分享

发送请求:

技术分享

反之,可以测试"Allow quoted data?:"值为true的情况,在请求中双引号给去除了。

 

值不够是否循环:

技术分享

修改lhy.txt文件,如下图:

技术分享

修改线程组循环次数:

技术分享

执行请求:

技术分享

查看结果可知,向服务器发送了3次请求,并且3次请求中wd的取值分别对应lhy.txt文本文件第一列的值。

在线程组中设置循环次数为4,发送请求:

技术分享

技术分享

 

sharing mode  → All threads:

首先来看下线程组(相当于lr中的场景设置)的基本设置:

技术分享

如果使用使用调度器的话,图中的循环次数就失效了,调度器下的持续时间(秒),相当于lr中controller里的运行时间

如果启动延时,那么图中线程属性里的Ramp -Up Period就失效了

如果设置了启动时间和结束时间,那么持续时间就失效了

线程组中的循环相当于lr中的迭代,线程数相当于lr中的vu即并发用户数

 

测试CSV Data Set Config中的Sharing mode,如下图:

技术分享

①首先测试All threads:

思想:lr中的取值策略分为:顺序、随机、唯一,更新lhy.txt文件,增加key1列的值到10记录

A、在线程组中,设置线程数为1,循环次数为4,发送请求,分析请求中的wd参数的值分别为lhy1,lhy2,lhy3,lhy4,由此可以排除该项取值策略为随机的可能;

B、那么如何验证该选项的取值策略到底是顺序还是唯一呢?

加并发。在线程组中,设置线程数(并发)为2,循环次数为3:

如果是顺序:线程1 → lhy1,lhy2,lhy3  线程2 → lhy1,lhy2,lhy3

如果是唯一:线程1 → lhy1,lhy2,lhy3  线程2 → lhy4,lhy5,lhy6

发送请求,查看结果:

线程1 → lhy1,lhy2,lhy3  线程2 → lhy4,lhy5,lhy6

可以确定,All threads的取值策略是唯一的。

C、对比lr中,值的变更方式有迭代、每次出现、OCNE,那么如何验证All threads值的变更策略呢?

思考:All threads值的变更策略如果是ONCE的话,如上B的设置,2个线程,3次循环,执行的结果应该是:

线程1 → lhy1,lhy1,lhy1  线程2 → lhy2,lhy2,lhy2

那么,在线程组的step1下,再新增一个请求,以确定值的更新方式:

技术分享

上图中,step1相对于lr脚本中的循环,step中的循环和线程组中的循环(迭代)构成嵌套循环,添加方式:

技术分享

设置线程数(用户数)为1,循环次(迭代)为1:

如果是唯一+每次迭代:线程1 → lhy1  线程2 → lhy1

如果是唯一+每次出现:线程1 → lhy1  线程2 → lhy2

查看请求发送的参数,得到如下的执行结果:

线程1 → lhy1  线程2 → lhy1

由此可知All threads对应的是唯一+每次迭代。线程组和线程组之间严格的遵循唯一。

 

练习:设置3线程,4次迭代,2次循环,Recycle on EOF(false),Stop thread on EOF(false),预计输出:

T1: 1 1     4 4   7 7     10 10

T2: 2 2     5 5   8 8     EOF EOF

T3: 3 3     6 6   9 9     EOF EOF

 

sharing mode  → Current  threads:

同上:

A、设置 1线程  3次迭代 得到结果如下:

T:lhy1,lhy2,lhy3,确定取值方式唯一或者顺序

B、设置 2线程  3次迭代 得到结果如下:

线程      第一次迭代    第二次迭代     第三次迭代

T1:         lhy1,          lhy2,           lhy3

T2:         lhy1,          lhy2,           lhy3

由此可以确定取值方式为顺序

C、增加一个请求数,确定值更新策略,设置 1线程  1次迭代,得到结果如下:

线程    第一次请求   第二次请求

T1:       lhy1            lhy1

由此可以确定Current threads 方式为:顺序+每次迭代。不同线程组间也是一样,遵循顺序+迭代这个标准。

 

sharing mode  → All threads:

技术分享

分别设置两个线程组中的线程数为2,循环次数为3:

线程组1的取值:

T1:1 3 5

T2:2 4 6

线程组2的取值:

T1:1 3 5

T2:2 4 6

由此可得出结论:

同线程组下是唯一+每次遇见的取值,不同线程组之间取值是顺序+迭代的取值方式。

 

五、关联

JMeter的关联是用正则表达式完成的

技术分享

 技术分享

Apply to:在哪里取关联的值
引用名称:关联值的变量名
模版:默认$1$
匹配数字:相当于lr关联函数web_reg_parameter_ex中的ordinal

 

关联的步骤:

1、设置要传递的值:在request1的请求中,设置参数wd的值为besttest;

2、在查询结果树的返回值里边搜索需要关联值,确定要取值的位置;

3、通过正则表达式界面,确定需要关联值的左右边界:

技术分享

4、在request2的请求参数中,将wd的值替换为:${tital};

5、发送请求,查询值是否关联成功。

 

六、断言

相当于lr中检查点的概念

技术分享

技术分享

请求没有报错,说明断言成功。

--------------------------------------------

所有困难终会过去,努力才不枉来这世上走一遭... ...

技术分享

 

JMeter:基本及参数化、关联