一、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中检查点的概念
请求没有报错,说明断言成功。
--------------------------------------------
所有困难终会过去,努力才不枉来这世上走一遭... ...