一、JMeter脚本开发实战
实例:查询一个城市的天气预报
使用抓包工具观察请求所产生的请求列表,筛选最核心API。
A、获取城市代码
http://toy1.weather.com.cn/search?cityname=西安
B、获取天气
http://www.weather.com.cn/weather1d/101110101.shtml#search
C、编写JMeter脚本
1、JMeter参数化,用户自定义变量,也可以通过csv Data setConfig引入大量数据。
2、添加HTTP请求,获取城市代码。
通过${var}方式引用之前定义的变量,设定编码为UTF-8,否则结果为乱码。
3、为此次HTTP请求,增加HTTP头信息、响应断言、结果树。
响应断言:当断言失败时,断言结果会指出失败原因。
4、通过正则表达式,提取城市编码。
5、添加HTTP请求,获取具体城市天气预报。
二、场景设计
A、运行场景
- 运行方式:GUI、命令行
- 运行架构:本地运行、远程运行
1、GUI运行、本地运行 - 参考上文
2、命令行运行
命令行模式运行JMeter测试脚本能够大大缩减所需要的系统资源。
1).需要设置PATH环境变量把JMeter软件目录囊括进去
JMETER_HOME=D:\JavaDEV\Java\apache-jmeter-5.1.1
PATH=%JMETER_HOME%\BIN
2).命令行执行
jmeter -n -t "D:\JavaDEV\Java\apache-jmeter-5.1.1\bin\demo\天气预报.jmx"
常用参数:
- -h,帮助 - 打印帮助信息并退出
- -n,非GUI模式 - 非GUI模式下运行JMeter
- -t,测试文件 - 要运行的JMeter测试jmx文件
- -l,日志文件 - 记录结果的文件
- -r,远程执行 - 启动远程服务
- -H,代理主机 - 设置JMeter使用的代理主机IP
- -P,代理端口 - 设置JMeter使用的代理主机的端口号
3).结果查看
JMeter GUI->添加聚合报告->所有数据写入一个文件,选择刚生成的log文件就可以对执行结果进行直观分析了。
3、远程运行
1).修改设置控制机jmeter.properties文件,假设远程机的地址为192.168.0.10
# Remote Hosts - comma delimited
remote_hosts=127.0.0.1,192.168.0.10
remote_hosts=localhost:1099,localhost:2010
2).运行远程机的jmeter-server.bat批处理文件
3).在控制机上运行远程按钮
B、性能参数配置
JMeter运行在JVM之上,因此可以根据场景修改JVM配置,具体的JVM参数参考相关总结。
三、JMeter元件库
元件的运行顺序和作用域是JMeter最精髓的所以,也是JMeter优缺点的体现。
A、执行顺序
元件执行顺序,配置元件config elements->前置处理程序Per-processors->定时器timers->取样器sampler->后置处理程序post-processors->断言assertions->监听器listeners。
B、元件作用域
- 配置元件,影响作用域内所有元件
- 前置处理程序,作用域内每个取样器之前执行
- 定时器,作用域内每个取样器有效
- 取样器,无作用域
- 后置处理程序,作用域内每个取样器之后执行
- 断言,作用域内
C、线程组
通过「线程组」实现并发,同时去执行相同的一批次任务,每个线程之间都是隔离的,互不影响的。线程的执行过程中,操作的变量,不会影响其他线程的变量值。
Delay Thread creation until needed(延迟创建线程直到需要): 默认情况下,测试开始的时候,所有线程就被创建完了。如果勾选了此选项,那么线程只会在合适的需要用到的时候创建。
Ramp-Up Period:线程启动时间,多少个线程,多长时间启动(秒),每个线程执行多少次循环。
取样器错误:当线程执行取样器失败的时候,要执行的策略选项
- 继续:忽略错误,继续执行
- Start Next Thread Loop(启动下一线程循环):忽略错误,线程当前循环终止,执行下一个循环
- 停止线程:当前线程停止执行,不影响其他线程正常执行
- 停止测试:整个测试将在当前正在执行的线程执行完毕后停止
- 立即停止测试:整个测试会立即停止执行,当前正在执行的取样器如果可能会被中断
调度器:
If Loop Count is not 1 or Forever, duration will be min(Durationm, Loop Count * iteration duration).
如果不想立即执行执行,可以通过调度器控制测试执行的开始时间和结束时间。
- 持续时间(秒):控制测试执行的时间
- 启动延迟(秒):控制测试多久后启动执行
D、汇总报告(summary Report)
- Label:取样器名称
- Samples:发送的请求总数
- Average:平均响应时间
- Min:最小响应时间
- Max:最大响应时间
- Std.Dev.:所有请求响应时间的标准差
- Error%:出错率(出错的request数/所有的request数)
- Throughput:吞吐量,每秒/每分钟(具体看单位)处理的request数
- Received KB/sec:每秒从服务器端接收到的数据量
- Avg.Bytes:服务端返回给request数据的平均值,可以理解为:服务端返回所有数据/请求数
E、聚合报告(Aggregate Report)
类似汇总报告。
F、HTTP代理服务器
对于一些HTTPS协议的系统需要在启动代理后,安装JMeter/bin下的证书,才能使用代理服务器,如果手机的录制,需要设置手机的代理服务器、端口,并在手机端安装证书。
- TYPE,默认为空,可选项HttpClient4、Java、空值
- Java,使用JDK中的net包模拟浏览器
- HttpClient4,使用Apache HttpClient4模拟浏览器
- 默认为空值,使用jmeter.properties中jmeter.httpsampler的配置
- Requests Filtering->Content-Type filter
- Include,Content-Type白名单,表示哪些Content-Type可以通过
- Exclude,Content-Type黑名单,表示哪些Content-Type被拒绝
- Prefix,对每个录制的HTTP请求的前缀命名,默认为空,则录制的请求会按照数字递增的方式进行命名
- 自动重定向,当发送HTTP请求后得到的响应是302/301时,JMeter自动重定向到新的页面,比如从页面A重定向到页面B,只会记录页面B的信息,页面A的信息称之为过程信息,如果要做关联就不能搞定了。另外自动重定向只针对GET和HEAD请求,不能使用在PUT和POST上
- 跟随重定向,是否启用跟随重定向,是指发生重定向时,会生成Sampler请求
- Use KeepAlive,JMeter和目标服务器之间使用Keep-Alive方式进行HTTP通信,默认选中,KeepAlive有一个保持时间,可以在不同的web服务器中设定这个时间
- 从HTML文件获取所有内含的资源,当该选项被选中时JMeter在发出HTTP请求并获得响应的HTML文件内容后,还对该HTML进行Parse并获取HTML中包含的所有资源(图片、Flash等)
G、HTTP请求
- 参数Parameters - 随着请求一起发送的参数,可以是GET/POST方法
- 协议 - HTTP、HTTPS、FILE,默认为HTTP
- 消息体数据Body Data:使用POST时用到
- 文件上传File Upload - 当需要文件上传时用到,MIME类型可以通过网络抓包工具获取
- 保存响应为MD5哈希Save response as MD5 hash:选中该项,在执行时仅记录服务端响应数据的MD5值,而不记录完整的响应数据;在需要进行数据量非常大的测试时,建议选中该项以减少取样器记录响应数据的开销
H、用户定义的变量
名称、值、描述。
使用变量的方法:${variableName}
I、Http Cookie管理器
- 每次清除Cookies - 每次线程组启动时都会清除Cookie
- Cookie Policy - Cookies策略
- ignoreCookies - 忽略所有Cookies,用来防止HttpClient接受和发送Cookies
J、Http Header管理器
头信息管理,User-Agent、Content-Type、Accept、Cookie等头部信息。
四、其他元件库
A、定时器
B、逻辑控制器
C、配置元件
D、前置处理器
E、后置处理器
F、断言
G、监听器
五、脚本开发
A、BeanShell
1、BeanShell概念
- BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法。
- BeanShell是一种松散类型的脚本语言。
- BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有脚本语言特性,非常精简的解释器Jar包大小为175k。
- BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。
2、JMeter中常用的Bean Shell
- 定时器:BeanShell Timer
- 前置处理器:BeanShell PreProcessor
- 采样器:BeanShell Sampler
- 后置处理器:BeanShell PostProcessor
- 断言:BeanShell断言
- 监听器:BeanShell Listener
3、BeanShell的用法
JMeter的BeanShell中内置了变量,使用者可以使用内置变量与JMeter进行交互。
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。