Jmeter的基本使用
一、Jmeter下载与安装
1、地址:http://jmeter.apache.org/
2、配置环境变量
① jmeter是在jdk环境下运行,首先安装jdk,配置Java环境变量
② 第一步:在系统变量框,点击“新建”,建立一个变量:JMETER_HOME,值为解压的jmeter安装路径
③ 第二步:配置classpath变量,若没有则新建classpath,有则编辑
变量值固定为:%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib/logkit-2.0.jar;
④ 第三步:验证是否配置正确。首先进到jmeter安装路径,找到bin文件夹,点击进去,找到jmeter.bat,双击打开
3、注意点
1)解压之后压缩包叫apache-jmeter-4.0.zip,如是src.zip后缀的都不对,打开之后会报错不可用,因为里面缺少我们下一步将要配置的环境变量.jar文件
2)对应的jdk版本不可太低,一般jmeter3.0的对应jdk1.7,jmeter4.0对应jdk1.8以上,否者启用jmeter也会报错
3)一定要确保环境变量配置正确(包括jdk的与jmeter的环境变量配置)
二、Jmeter脚本生成方式
1、手动编写
2、Jmeter自带HTTP代理服务器录制
第一步:右键点击“测试计划”,添加“HTTP代理服务器“。注意点:端口号:要填写这台电脑不被占用的端口号,可以在电脑cmd上面,输入netstat –an查看,哪些端口已被占用
第二步:打开浏览器的Internet选项->连接->局域网设置->勾选LAN。地址:设置为Jmeter所在的电脑IP,端口号要与STEP1设置的一致
第三步:配置排除模式、避免录制无用脚本
① 手动添加排除模式:输入格式为: .*\.js.*| .*\.css.*| .*\.png.*| .*\.gif.*
② 点击Add suggested Excludes按钮、使用建议的排除模式
第四步:启动HTTP代理服务器,点击启动即可
第五步:打开任何浏览器,输入要访问的网址,即可录制脚本
第六步:录制结束。录制结束后应该关闭Jmeter中的HTTP代理服务器,并且取消Internet选项中的代理服务器的勾选,避免影响正常浏览网页
第七步:运行脚本。新建线程组,将HTTP代理服务器下面所有录制的HTTP请求全部移动至线程组下,选择合适的监听器,运行脚本
3、Badboy录制
1)Badboy概念:基于IE内核的,用于web自动化测试的工具,我们借助他用来生成jmeter的脚本
2)优缺点:优点:录制简单、生成的脚本比较简洁;缺点:仅适用于B/S架构的产品录制、IE内核版本很低,所以可能会因为兼容性的问题导致无法录制
3)步骤:
第一步:输入URL开始录制
第二步:录制结束后点击暂停
第三步:导出jmeter格式:File-export to Jmeter
第四步:用Jmeter打开即可
4、三种方式的比较
三、测试案例实操
1、添加本次测试计划 (右键-->添加-->线程(用户)-->线程组)
2、添加协议及相关配置信息
① get请求
② POST请求。注意点:pwuser=zhangsan&pwpwd=123456&hideid=0&cktime=31536000这种类型的数据可以先复制,然后点击剪贴板添加
3、添加断言、校验返回结果
4、为线程添加监听器
四、HTTP Cookie管理器
1、手动添加cookie
第一步:在浏览器中获取已登录用户的cookie值
第二步:添加HTTP Cookie管理器
① 每次反复清除Cookies?:选择后,则每次线程组运行时,都会清除 cookie。(若是手动添加的cookie,则不会被清除)
② Implementation:履行的协议。
③ Cookie Policy:Cookie的管理策略
第三步:运行接口。不需要先登录、也可直接运行后面的接口
2、自动生成cookie
1)无需设置cookie的值
2)需要按照流程设置http请求。登录成功后才能生成cookie,才能执行后面的请求
3)调整登录的位置,则报错
五、Jmeter-参数化
1、Jmeter中参数调用的方式均为${ParamName}
2、用户参数
1)路径:前置处理器-用户参数( User Parameters )
2)将设置后的变量名称可以用于用户登陆等,可以从这里面随机取值
3)注意:引用的参数名跟用户定义变量设置的名称必须保持一致
3、用户定义的变量
1)路径:配置元件-用户定义的变量( User Defined Variables )
2)相当于更改变量名称
3)批量添加的方法
① 第一步:利用text做个表
② 第二步:将表中的所有内容复制到剪切板中(全选+复制)
③ 第三步:在“用户定义的变量”中选择“Add frome Clipboard”
4、函数助手
1)__RandomString:随机获取字符串。应用场景如下:
① 进行多个账号注册,注册信息要求手机号mobilephone不能重复
② 手机号前3位号段固定,那就对手机号后8位进行随机
③ 拷贝生成的函数字符串,粘贴进行参数引用
2)_Random:输入最小值、最大值,随机获取数字。闭区间,[]
通过设置存储结果的变量名称,在后面使用该变量,调用这个随机数的值
3)__jexl3:${__jexl3(表达式,变量名)}。执行通用JEXL表达式,并返回执行结果——True或者False
① ${__jexl3(5>4,num)}
② 与随机数配合使用:${__jexl3(${__Random(1,10,rand)}>18,)}
③ 使用&&或者and、表示与:${__jexl3(${rand}>4 && ${rand}<9,)} 随机数大于4,小于9
④ 使用||或者or、表示或
4)__RandomFromMultipleVars:${__RandomFromMultipleVars(变量名1|变量名2|...,变量名)}。在一定的取值范围内随机取数
① 实现步骤:
第一步:自定义一组变量,并对变量进行赋值
第二步:利用函数助手用自定义的变量进行填充
第三步:在需要的http中加入随机变量
② 注意点1:必须使用变量名,不能使用具体的值,否则不能实现其功能。${__RandomFromMultipleVars(WNCD032|WNCD044|WNCD201,name)}
③ 注意点2:变量名之间只能使用管道符"|",不能使用逗号等其他分隔符,否则不能实现其功能
5、CSV数据文件设置:该组件可以用来读取CSV数据文件,然后通过参数调用的方式提供给作用域内的脚本使用
1)Filename:需要传入文件的完整路径。我的文件位于D盘目录下,文件名为users.txt。
2)File encoding:参数文件的编码格式。一般选择UTF-8
3)Variable Names:对应参数文件中每列的变量名,也是你要引用到请求中的参数变量名。这里第一列是手机号、第二列是昵称。变量名可以自定义。
4)igonre first line(only used if Variable Names is not empty):当 CSV 文件中首行设置了变量名时,该项设为 true,此时每次请求读取文件时会自动忽略首行,直接读取第二行的数据。若首行未设置,则选择False
5)Delimiter:文件中的分隔符,默认英文的逗号分隔。所以注意txt文档中每行多个参数用英文逗号分隔
6)Recycle on EOF: 设置为True后,允许重头循环取值;为False,当读取文件到结尾时,停止读取文件
7)Stop Thread EOF: 当Recycle on EOF为false并且Stop Thread EOF 为true,则读完csv文件中的记录后,停止运行,线程数及执行次数无效。
8)Sharing Mode:共享模式。All threads:所有线程,所有线程循环取值,线程1取第一行,线程2取下一行;Current thread group:当前线程组,各个线程组分别循环取值;Current thread:当前线程,该测试计划内的所有线程都取第一行
六、正则表达式提取器
1、可以用来提取接口响应里的信息,给予后续接口传参用
2、Apply to:应用范围(一般就选择默认的Main sample only),就算有重定向,一般也是提取最终那个请求的接口
3、要检查的响应字段:即样本数据源
1)主体:接口响应主体内容,一般要提取普通http响应结果的数据,都勾选这个
2)信息头:响应头的所有内容
3)Request Headers:请求头的所有内容
4)url:是对sample的url进行匹配,也就是查看结果树里请求内容的第一行url,不包含data里的请求参数(即只能匹配protocol(协议)+host+path+querystring,如:https://www.baidu.com/index.php?tn=monline_3_dg)
5)响应代码:http响应代码,如101,200,302,404,501等
6)响应信息:http响应代码对应的响应信息,例如:OK, Found(HTTP/1.1 200 Ok;HTTP/1.1 302 Found)
4、引用名称:其他地方引用时的变量名称,名称只能是一个,引用方法:${变量名}
5、正则表达式:通用语法:左边界(.*?)右边界,左右边界就是为了能准确定位到想匹配的内容
6、模板:对应正则表达式提取器类型,样式为:$n$。XXX(\d+),XX(.*?)XX。若正则表达式查找到多个值,序号表示出来哪一个值
1)$0$。为整个表达式匹配到的内容,包括小括号内跟小括号外的内容
2)$1$。若模板为:$1$,则对应正则表达式中的第一个(.*?)所匹配的内容
3)$2$。对应正则表达式中的第二个(.*?)所匹配的内容
4)$1$$2$。把2个(.*?)所匹配的内容拼接起来
7、匹配数字:正则表达式匹配数据的最终结果可以看做一个数组,匹配数字即可看做是数组的第几个元素
1)0:随机返回匹配的数据
2)1:返回匹配结果数组的第一个元素
3)负数:表示返回全部元素,并且同时会返回一个元素总数的变量token_matchNr
4)在引用时:通过${变量名_1}的方式来取第1个匹配的内容,${变量名_2}来取第2个匹配的内容
8、缺省值:匹配失败时的默认值,通常用于后续的逻辑判断,建议使用一些特殊含义的,比如0,NULL,ERROR等
七、逻辑控制器(如果(if)控制器)
1、作用:根据给定表达式的值决定是否执行该节点下的子节点
2、用法一:勾选“interpret condition as variable expression”
1)这时expression中不能直接填写条件表达式,需要借助函数将条件表达式计算为true/false,可以借助的函数有_jexl3和_groovy
a.借助函数助手,生成表达式。有时会出现\,去掉即可
b.把生成的表达式,写在if控制器中
2)直接填写5==5或者${rand}>0,无法识别,不能运行关联请求
3、用法二:不勾选“interpret condition as variable expression”。直接输入判断表达式即可,判断表达式为真时,执行if控制器下的请求
1)如“1!=2”,则一定会执行下面的http请求
2)填写判断表达式${rand}>0
八、输出HTML报告
1、环境要求
1)jmeter3.0版本之后开始支持动态生成测试报表
2)jdk版本1.7以上
3)jmx脚本文件
2、直接生成HTML报告。在脚本文件路径下,执行cmd命令:jmeter -n -t jmx文件 -l result.jtl -e -o D:\ResultReport
1)● -n: 非GUI模式执行JMeter
2)● -t: 执行测试文件所在的位置
3)● -l: 指定生成测试结果的保存文件,jtl文件格式
4)● -e: 测试结束后,生成测试报告
5)● -o: 指定测试报告的存放位置
6)注意:结尾的 ResultReport 是自己手动创建的报告文件夹。每次启动命令之前,文件夹内容必须和 jtl 文件一起清空
7)每次运行脚本文件时,必须把报告文件夹下的内容和.jtl文件全部删除,否则会出现如下截图中的错误
解决办法:写一个bat,每次执行bat都自动去清空之前的报告和jtl文件
① 删除文件:del resylt.jtl ② 删除文件夹:rd 文件夹名称 ③ 重建文件夹:md 文件夹路径
3、使用之前的测试结果,生成测试报告
1)先生成测试结果:jmeter -n -t jmx文件 -l result.jtl
2)再生成报告:jmeter -g result.jtl -o D:\ResultReport
4、报告详解:https://www.jianshu.com/p/4f32918d66bb