《零成本实现Web性能测试:基于Apache JMeter》读书笔记

时间:2023-12-13 09:59:02

1、性能测试概念

性能测试目的:

  • 评估系统能力,验证系统是否符合预期性能指标
  • 识别系统中的弱点
  • 系统调优,改进系统性能
  • 检测长时间运行可能发生的问题,揭示隐含问题
  • 验证稳定性、可靠性

常见性能指标

  1. B/S架构(h5页面属于B/S架构):一般关注web服务器性能指标

    • 平均每秒钟响应次数=总请求次数/秒数
    • 平均每秒业务脚本迭代次数
    • 成功的请求
    • 失败的请求
    • 成功的点击次数
    • 失败的点击次数
    • 每秒点击次数
    • 每秒成功的点击次数
    • 每秒失败的点击次数
    • 尝试连接数
    • 吞吐量
  2. C/S架构(native属于C/S架构):软件后台通常为数据库

    • 用户连接数,即数据库的连接数量
    • 数据库死锁
    • 数据库cache的命中情况

测试环境平均并发数

C=(最大在线人数*10%)/n,n是生产环境和测试环境服务器配置折算比,一般为4。

2、Jmeter介绍

jmeter工作原理

《零成本实现Web性能测试:基于Apache JMeter》读书笔记

jmeter可以作为web服务器与浏览器之间的代理网关来捕获浏览器的请求和web服务器的响应,如此生成性能测试脚本

jmeter安装目录

  1. 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日志中查看信息。

  2. 详细日志获取:用户若想获取更详细日志,可修改bin目录下jmeter.properties文件中log_level.jmeter。默认为INFO,查错时可修改为DEBUG。 属性设置也有图形界面,选择工作台右键“添加”-》“非测试元件”-》“Property Display”

  3. printable_docs的usermanual子目录下为用户手册文档,其中component_reference.html为最常用核心元件帮助文档。用户也可在图形界面的帮助文档中查看。

  4. 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实例(中断式的)
  5. jmeter带参数启动:

    • -h 帮助 -> 打印出有用的信息并退出
    • -n 非 GUI 模式 -> 在非 GUI 模式下运行 JMeter
    • -t 测试文件 -> 要运行的 JMeter 测试脚本文件
    • -l 日志文件 -> 记录结果的文件
    • -r 远程执行 -> 启动远程服务
    • -H 代理主机 -> 设置 JMeter 使用的代理主机
    • -P 代理端口 -> 设置 JMeter 使用的代理主机的端口号
  6. 例:jmeter -n -t test1.jmx -l logfile1.jtl -H 192.168.1.1 -P 8080

  7. 使用代理服务器:若测试对象隐藏在防火墙/代理服务器之后,则应向jmeter提供防火墙/代理服务器的主机名和端口号,需携带已下参数:

    • -H
    • -P
    • -N:不使用代理的主机(如localhost)
    • -u:代理验证的用户名,若需要
    • -a:代理验证的密码,若需要
  8. 注:jmeter内置http代理服务器用户录制http/https协议的浏览器会话,与上文中代理功能不同,不可混淆

    例:jmeter -H my.proxy.server -P 8000 -u username -a password -N localhost

3、web性能测试脚本录制与开发

jmeter常用测试元件

  1. 线程组

    • Ramp-Up参数用来设置jmeter达到最大线程数需要的时间,不可设置过长或过短,建议初始值设为Ramp-Up=总线程数
    • 调度器可展开额外的调度控制面板,可设定“启动时间”“结束时间”“持续时间”“启动延迟”,“启动延迟”会使“启动时间”无效,“持续时间”会使“结束时间”无效
  2. 控制器——采样器

    • 采样器告诉jmeter发送一个请求到指定服务器,并等待服务器请求。
    • 包含:FTP request,HTTP request, JDBC request。。。
    • 若打算向同一个服务器发送同一类请求,可以考虑使用默认配置元件
    • 可见如断言,断言中可使用正则表达式
  3. 控制器-逻辑控制器
    • 可以帮助控制测试逻辑,特别是请求次数和顺序
    • 所有web测试都应该添加cookie管理器,否则jmeter就会忽略cookie。将cookie管理器添加到线程组层级,就能确保所有HTTP请求使用相同的cookie。
  4. 监听器
  5. 定时器
    • 默认情况下,线程在发送请求之间没有间歇
    • 定时器可作为采样器或者逻辑控制器的子项,只影响作用域内的采样器
    • 要在测试计划中某个位置添加暂停,可以使用“test action”采样器
  6. 断言
    • 断言会影响作用于内所有采样器。若要只影响某个采样器,需要将断言作为该采样器的子项
  7. 配置元件
    • 可以添加或者修改请求
    • 仅对其所在的测试数分支有效。例,假设在一个simple controller中放置了一个http cookie管理器,则该cookie管理器只对防止在simple controller内的其他逻辑控制器生效。如下图,该cookie管理器对“web page1”和“web page2”有效,对“web page3”无效

《零成本实现Web性能测试:基于Apache JMeter》读书笔记

- 相比父分支的配置元件,子分支内部的配置元件优先级更高。**注:配置元件“用户定义的参数”会在测试初始阶段执行,无论它处于何处,因此建议将其放在线程组开始部分**
  1. 前置处理器

    • 在采样器发出请求前做一些特殊操作,常用于发出请求前修改或更新采样器的某些设置或变量值
    • 若附着在某个采样器之下,则只会在该采样器运行之前执行
  2. 后置采样器

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属性变量

  1. jmeter属性是全局可见,通常用来定义一些jmeter使用的默认值。不能作为特定线程的变量值。
  2. Jmeter变量对于测试线程而言是局部变量。注:通过测试计划和“用户定义的变量”(配置元件)两种方式定义的变量,对整个测试计划可见。如果同一变量在多个“用户定义的变量”中被定义,则只在最后一个定义中会生效。一旦某个线程启动后,则整个变量集合的初始值会被复制到该线程中。其他测试元件,如“用户变量”(前置处理器)或“正则表达式提取器”(后置处理器)可以被用来重新定义变量,且仅仅影响当前线程。
  3. 属性和变量大小写敏感
  4. 使用变量参数化测试,可以采用变量,或者对于大并发的压力测试,最好使用Jmeter属性

录制web测试脚本

  1. jmeter代理目前不支持录制https协议,因为HTTPS是安全协议,代理无法破译其通信内容并录制请求参数或者cookie;但可用badboy工具。
  2. 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窗口
  3. 实际操作中遇到的问题:

    • 在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 -fsSLhttps://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逻辑控制器

  1. 简单控制器:用于组合采样器和其他逻辑控制器
  2. 循环控制器:循环次数由循环控制器设定
  3. 仅一次控制器:告诉Jmeter只执行一次,接下来测试计划中的循环执行会跳过该控制器下的所有请求
  4. 交替控制器:若将采样器或逻辑控制器放到其下,则每次循环jmeter都会交替执行该控制器下的测试元件
  5. 随机控制器:每次循环随机挑选一个执行
  6. 随机顺序控制器:其每一个子测试元件都至多执行一次,但执行顺序随机
  7. 吞吐量控制器(Throughput Controller):允许用户设定其被执行的频率。分为percent execution 和 total executions
  8. 运行时长控制器:控制其子测试元件允许运行的时长
  9. 模块控制器:在当前测试计划中动态地替换测试计划片段

配置元件

可用于初始化默认值和变量,这些配置元件将在作用域的初始阶段处理

  1. CSV Data Set Config
  2. HTTP授权管理器:帮助测试人员指定针对web页面的一个或多个登录。当使用浏览器访问一个受限页面时,测试人员就可以看到这类校验,浏览器会展示一个登录对话框,当遇到这类页面时,jmeter就会传输登录信息。
  3. HTTP Cache Manager
  4. HTTP Cookie管理器:它像浏览器一样存储和发送Cookie
  5. HTTP请求默认值:可设置HTTP请求使用的默认值
  6. HTTP信息头管理器:可以添加或重载HTTP请求头(我理解是 http请求的首部的管理器)
  7. JDBC Connection Configuration
  8. 登录配置元件:可以使用登录配置元件来为采样器(将用户名和密码作为其初始设置的一部分)添加或重载用户名和密码
  9. 用户定义的变量

定时器

定时器的处理先于统一作用域范围内的采样

  1. 固定定时器:若测试人员希望每个线程在请求之间间隔固定时长,就使用此定时器。
  2. 高斯随机定时器
  3. Constant Throughput Timer:该定时器引入可变暂停时长,通过计算来保证总吞吐量尽可能接近指定的值。若测试服务器无法处理这么多请求,该定时器也无法保证吞吐量不下降
    • 该定时器被采用后,吞吐量值并不一定恒定,可以由一个变量或者函数调用来定义,这样其值就可以在测试运行期间动态改变。
    • 吞吐量在测试运行期间不应该太频繁地改变,需一定时间新值才能生效
  4. Synchronizing Timer:目的是阻塞线程,直到n个线程被阻塞,然后将一起被释放。如此Synchronizing Timer就可以在测试计划的多个点上创建大量瞬间压力。类似于LR的集合点功能。

    前置处理器

  5. 用户参数

后置处理器