《零成本实现Web性能测试:基于Apache JMeter》读书笔记
1、性能测试概念
性能测试目的:
- 评估系统能力,验证系统是否符合预期性能指标
- 识别系统中的弱点
- 系统调优,改进系统性能
- 检测长时间运行可能发生的问题,揭示隐含问题
- 验证稳定性、可靠性
常见性能指标
-
B/S架构(h5页面属于B/S架构):一般关注web服务器性能指标
- 平均每秒钟响应次数=总请求次数/秒数
- 平均每秒业务脚本迭代次数
- 成功的请求
- 失败的请求
- 成功的点击次数
- 失败的点击次数
- 每秒点击次数
- 每秒成功的点击次数
- 每秒失败的点击次数
- 尝试连接数
- 吞吐量
-
C/S架构(native属于C/S架构):软件后台通常为数据库
- 用户连接数,即数据库的连接数量
- 数据库死锁
- 数据库cache的命中情况
测试环境平均并发数
C=(最大在线人数*10%)/n,n是生产环境和测试环境服务器配置折算比,一般为4。
2、Jmeter介绍
jmeter工作原理
jmeter可以作为web服务器与浏览器之间的代理网关来捕获浏览器的请求和web服务器的响应,如此生成性能测试脚本
jmeter安装目录
-
jmeter调优设置:调整bin文件夹下的Jmeter.bat
set HEAP=-Xms512m -Xmx512m set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m set SURVIVOR=-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=50% set TENURING=-XX:MaxTenuringThreshold=2
据经验,堆值(HEAP)最多设置为物理内存的一半,默认为512MB。若超过一半,Jmeter运行速度会变慢,甚至会出现“内存溢出”错误。若运行异常,可在jmeter.log日志中查看信息。
-
详细日志获取:用户若想获取更详细日志,可修改bin目录下jmeter.properties文件中log_level.jmeter。默认为INFO,查错时可修改为DEBUG。 属性设置也有图形界面,选择工作台右键“添加”-》“非测试元件”-》“Property Display”
-
printable_docs的usermanual子目录下为用户手册文档,其中component_reference.html为最常用核心元件帮助文档。用户也可在图形界面的帮助文档中查看。
-
jmeter启动:jmeter有多种启动模式,进入到jmeter安装目录的bin文件夹(unix系统)
- ./jmeter:运行jmeter(默认GUI模式)
- jmeter-server:衣服武器模式启动Jmeter,通过合适参数调用jmeter脚本
- jmeter.sh:没有指定JVM选项的非常基础的jmeter脚本
- mirror-server.sh:在非GUI模式下启动Jmeter镜像服务器
- shutdown.sh:关闭一个非GUI实例(优雅的)
- stoptest.sh:停止一个非GUI实例(中断式的)
-
jmeter带参数启动:
- -h 帮助 -> 打印出有用的信息并退出
- -n 非 GUI 模式 -> 在非 GUI 模式下运行 JMeter
- -t 测试文件 -> 要运行的 JMeter 测试脚本文件
- -l 日志文件 -> 记录结果的文件
- -r 远程执行 -> 启动远程服务
- -H 代理主机 -> 设置 JMeter 使用的代理主机
- -P 代理端口 -> 设置 JMeter 使用的代理主机的端口号
-
例:jmeter -n -t test1.jmx -l logfile1.jtl -H 192.168.1.1 -P 8080
-
使用代理服务器:若测试对象隐藏在防火墙/代理服务器之后,则应向jmeter提供防火墙/代理服务器的主机名和端口号,需携带已下参数:
- -H
- -P
- -N:不使用代理的主机(如localhost)
- -u:代理验证的用户名,若需要
- -a:代理验证的密码,若需要
-
注:jmeter内置http代理服务器用户录制http/https协议的浏览器会话,与上文中代理功能不同,不可混淆
例:jmeter -H my.proxy.server -P 8000 -u username -a password -N localhost
3、web性能测试脚本录制与开发
jmeter常用测试元件
-
线程组
- Ramp-Up参数用来设置jmeter达到最大线程数需要的时间,不可设置过长或过短,建议初始值设为Ramp-Up=总线程数
- 调度器可展开额外的调度控制面板,可设定“启动时间”“结束时间”“持续时间”“启动延迟”,“启动延迟”会使“启动时间”无效,“持续时间”会使“结束时间”无效
-
控制器——采样器
- 采样器告诉jmeter发送一个请求到指定服务器,并等待服务器请求。
- 包含:FTP request,HTTP request, JDBC request。。。
- 若打算向同一个服务器发送同一类请求,可以考虑使用默认配置元件
- 可见如断言,断言中可使用正则表达式
- 控制器-逻辑控制器
- 可以帮助控制测试逻辑,特别是请求次数和顺序
- 所有web测试都应该添加cookie管理器,否则jmeter就会忽略cookie。将cookie管理器添加到线程组层级,就能确保所有HTTP请求使用相同的cookie。
- 监听器
- 定时器
- 默认情况下,线程在发送请求之间没有间歇
- 定时器可作为采样器或者逻辑控制器的子项,只影响作用域内的采样器
- 要在测试计划中某个位置添加暂停,可以使用“test action”采样器
- 断言
- 断言会影响作用于内所有采样器。若要只影响某个采样器,需要将断言作为该采样器的子项
- 配置元件
- 可以添加或者修改请求
- 仅对其所在的测试数分支有效。例,假设在一个simple controller中放置了一个http cookie管理器,则该cookie管理器只对防止在simple controller内的其他逻辑控制器生效。如下图,该cookie管理器对“web page1”和“web page2”有效,对“web page3”无效
- 相比父分支的配置元件,子分支内部的配置元件优先级更高。**注:配置元件“用户定义的参数”会在测试初始阶段执行,无论它处于何处,因此建议将其放在线程组开始部分**
-
前置处理器
- 在采样器发出请求前做一些特殊操作,常用于发出请求前修改或更新采样器的某些设置或变量值
- 若附着在某个采样器之下,则只会在该采样器运行之前执行
-
后置采样器
Jmeter执行顺序作用域规则
- 配置元件
- 前置处理器
- 定时器
- 采样器
- 后置处理器
- 断言
- 监听器
*例,在如下测试过程中
`Controller
Post-Processor1
Sampler1
Sampler2
Timer1
Assertion1
Pre-Processor1
Timer2
Post-Processor2
`
执行顺序为:
`Pre-Processor1
Timer1
Timer2
Sampler1
Sampler2
Post-Processor1
Post-Processor2
Assertion1
`
注1:某些元件遵循分层规则。即:如果该元件的父测试元件是一个采样器,则它仅对该采样器生效;若父测试元件是一个逻辑控制器,则它对该逻辑控制器下的所有子采样器都生效
注2:配置元件(HTTP信息头管理器,cookie管理器和HTTP授权管理器)与默认配置元件(Configuration Default Element)的处理方式不同。默认配置元件包含的设置会被合并成一系列变量值,而配置元件的设置不会被合并。对一个采样器而言,如果在相同作用域范围内有多个配置元件,则只有一个配置元件会被应用。
jmeter属性变量
- jmeter属性是全局可见,通常用来定义一些jmeter使用的默认值。不能作为特定线程的变量值。
- Jmeter变量对于测试线程而言是局部变量。注:通过测试计划和“用户定义的变量”(配置元件)两种方式定义的变量,对整个测试计划可见。如果同一变量在多个“用户定义的变量”中被定义,则只在最后一个定义中会生效。一旦某个线程启动后,则整个变量集合的初始值会被复制到该线程中。其他测试元件,如“用户变量”(前置处理器)或“正则表达式提取器”(后置处理器)可以被用来重新定义变量,且仅仅影响当前线程。
- 属性和变量大小写敏感
- 使用变量参数化测试,可以采用变量,或者对于大并发的压力测试,最好使用Jmeter属性
录制web测试脚本
- jmeter代理目前不支持录制https协议,因为HTTPS是安全协议,代理无法破译其通信内容并录制请求参数或者cookie;但可用badboy工具。
-
jmeter代理基本步骤
- 启动jmeter,右击测试计划,添加一个新的线程组:Add-》Thread Group;添加“HTTP请求默认值”,填写协议:http,IP如www.baidu.com,Path保留为空,端口号为80.
- 选中工作台,右键 添加“HTTP Proxy Server”.
- Port域:8088 指明代理使用的端口号;
- Target Controller:选择“Test Plan->Thread Group” 指明代理录制的脚本会挂在测试树的哪个分支下;
- 单击“Patterns to Include”中的add,产生一个空白输入域,输入“.*.html”。
- 单击“Patterns to Exclude”中的add,产生一个空白输入域,输入“.*.gif”
- 单击底部的start按钮 -启动浏览器,但是不关闭Jmeter
- 针对不同站点录制脚本时,需相应调整过滤样式。浏览器设置:
- 选择Tools-》Internet Options-》connection-》Lan Settings-》Use a proxy server for your lan
- Address:输入“Localhost”或者是机器的IP地址
- Port:输入8088(与代理设置的端口号一致)
- 在浏览器地址栏输入“http://www.baidu.com”,随便单击页面上几个链接 -关闭浏览器,回到jmeter窗口
-
实际操作中遇到的问题:
-
在HTTP Proxy Server中点击start时,报错如下:
2015/09/17 16:24:21 ERROR - jmeter.protocol.http.proxy.ProxyControl: Could not initialise key store java.io.IOException: >> keytool���� java.io.FileNotFoundException: proxyserver.jks (Permission denied) << Command failed, code: 1 'keytool -genkeypair -alias :jmeter: -dname "cn=JMeter Proxy (DO NOT TRUST)" -keyalg RSA -keystore proxyserver.jks -storepass {redacted} -keypass {redacted} -validity 7'
-
网上搜索原因,A、部分人说是因为java1.7的SDK路径设置不正确,然而我的已经设置成功。B、部分人说要将路径在jmeter.bat中修改,于是尝试修改该文件,修改后依然报改错。C、部分人说在mac上应该在jmeter.sh文件中添加sdk的路径,于是添加如下:
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin export JAVA_HOME PATH=$JAVA_HOME:$PATH export PATH
添加后报了另一个错误。D、从一个人的网站上看到另一个处理办法是设置JVM参数,于是尝试如下:
export JVM_ARGS=-Dproxy.cert.directory=`readlink -f ~`; /opt/apache-jmeter-2.12/bin/jmeter
继续报错:"readlink: illegal option -- f"
,原因是mac下readlink无法使用,需依赖brew安装greadlink替代,最终解决方案如下:
a. brew安装,brew官方网站http://brew.sh/对其进行了详细描述:ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
b. 运行命令brew install coreutils
c. export JVM_ARGS=-Dproxy.cert.directory=`greadlink -f /Users/ting`
d. 运行jmeter,./jmeter
该问题解决。再运行代理录制,不再报错。
4、详解Jmeter测试元件
Jmeter逻辑控制器
- 简单控制器:用于组合采样器和其他逻辑控制器
- 循环控制器:循环次数由循环控制器设定
- 仅一次控制器:告诉Jmeter只执行一次,接下来测试计划中的循环执行会跳过该控制器下的所有请求
- 交替控制器:若将采样器或逻辑控制器放到其下,则每次循环jmeter都会交替执行该控制器下的测试元件
- 随机控制器:每次循环随机挑选一个执行
- 随机顺序控制器:其每一个子测试元件都至多执行一次,但执行顺序随机
- 吞吐量控制器(Throughput Controller):允许用户设定其被执行的频率。分为percent execution 和 total executions
- 运行时长控制器:控制其子测试元件允许运行的时长
- 模块控制器:在当前测试计划中动态地替换测试计划片段
配置元件
可用于初始化默认值和变量,这些配置元件将在作用域的初始阶段处理
- CSV Data Set Config
- HTTP授权管理器:帮助测试人员指定针对web页面的一个或多个登录。当使用浏览器访问一个受限页面时,测试人员就可以看到这类校验,浏览器会展示一个登录对话框,当遇到这类页面时,jmeter就会传输登录信息。
- HTTP Cache Manager
- HTTP Cookie管理器:它像浏览器一样存储和发送Cookie
- HTTP请求默认值:可设置HTTP请求使用的默认值
- HTTP信息头管理器:可以添加或重载HTTP请求头(我理解是 http请求的首部的管理器)
- JDBC Connection Configuration
- 登录配置元件:可以使用登录配置元件来为采样器(将用户名和密码作为其初始设置的一部分)添加或重载用户名和密码
- 用户定义的变量
定时器
定时器的处理先于统一作用域范围内的采样
- 固定定时器:若测试人员希望每个线程在请求之间间隔固定时长,就使用此定时器。
- 高斯随机定时器
- Constant Throughput Timer:该定时器引入可变暂停时长,通过计算来保证总吞吐量尽可能接近指定的值。若测试服务器无法处理这么多请求,该定时器也无法保证吞吐量不下降
- 该定时器被采用后,吞吐量值并不一定恒定,可以由一个变量或者函数调用来定义,这样其值就可以在测试运行期间动态改变。
- 吞吐量在测试运行期间不应该太频繁地改变,需一定时间新值才能生效
- Synchronizing Timer:目的是阻塞线程,直到n个线程被阻塞,然后将一起被释放。如此Synchronizing Timer就可以在测试计划的多个点上创建大量瞬间压力。类似于LR的集合点功能。
前置处理器
- 用户参数