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


    1、性能测试概念

    性能测试目的:

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

    常见性能指标

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

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

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

    测试环境平均并发数

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

    2、Jmeter介绍

    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”无效

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

    后置处理器

  • 相关阅读:
    linux nohup
    并发编程-多进程模块介绍
    并发编程-多进程
    网络编程-粘包现象
    Typora快捷键Mac
    网络编程
    异常处理
    面向对象-元类介绍
    面向对象-内置方法
    面向对象-反射
  • 原文地址:https://www.cnblogs.com/suntingme/p/5392100.html
Copyright © 2020-2023  润新知