JMeter性能测试框架从0到1使用入门

jmeter介绍

JMeter是Apache组织开发的开源项目,设计之初是用于做性能测试的,同时它在实现对各种接口的调用方面
做的比较成熟,因此,常被用做接口功能测试和性能测试
有如下特点:

  1. 开源免费,基于Java编写,可集成到其他系统可拓展各个功能插件
  2. 支持接口测试,压力测试等多种功能,支持录制回放,入门简单
  3. 丰富的插件支持,相对于Locust,JMeter提供了较多的插件,可以减少重复造轮子
    的工作。
  4. 多平台支持,可在Linux,Windows,Mac上运行

jemter可以通过http://jmeter.apache.org/download_jmeter.cgi 下载,根据自己平台,下载对应文件。

jmeter的目录结构

jmeter的目录结构主要如下:

  1. bin:包含了运行jmeter的可执行文件,如jmeter.sh和jmeter.bat
  2. lib:包含了jmeter和其他相关库的jar文件
  3. docs:包含了jmeter文档和示例文件
  4. extras:包含了jmeter的扩展和插件,如jmeter-plugins等
  5. licenses:包含了jmeter和其他相关库的开源协议
  6. printable_docs:包含了jmeter文档的可打印版本
  7. system_properties:包含了jmeter相关的系统属性文件
  8. test_files:包含了jmeter测试文件的样例和模板文件

在上述目录结构中,bin目录和lib目录是最为重要的两个目录,其中bin目录存储了jmeter的脚本文件和可执行文件,lib目录存储了jmeter和其他相关库的jar文件,是jmeter的核心库之一。其他目录则是一些辅助性的目录,用于存储一些文档、扩展和示例文件。
JMeter性能测试框架从0到1使用入门_第1张图片

jmeter常用组件和功能

常用的功能和组件如下:

  1. 测试计划
    测试计划是JMeter的最高层级,包含所有测试元素的根元素,它描述了测试的基本信息。在测试计划中可以设置测试名称、线程数、循环次数、测试开始和结束时间等。
  2. 线程组
    线程组是JMeter中的一个重要元素,用于模拟一定数量的虚拟用户并执行测试。在线程组中可以设置线程数、启动延迟时间、循环次数等参数。
  3. 取样器
    JMeter的取样器是用于模拟用户行为的核心元素,用于发送HTTP请求、打开Socket连接、读取文件等。常用的取样器包括HTTP请求、FTP请求、JDBC请求等。
  4. 监听器
    监听器用于记录测试过程中的性能指标和结果数据。常用的监听器包括查看结果树、聚合报告、响应时间图表等。
  5. 配置元件
    配置元件用于设置测试过程中的公共参数,如服务器地址、页面编码、HTTP头部信息等。
  6. 断言
    断言用于检查测试结果是否符合预期,常用的断言包括响应代码断言、响应内容断言等。
  7. 定时器
    定时器用于控制线程组发送请求的时间间隔,常用的定时器包括常量定时器、高斯随机定时器等。
  8. 前后置处理器
    前后置处理器用于在运行测试前或测试后执行一些操作,如提取变量、设置Cookie、清除缓存等。
  9. 逻辑控制器
    逻辑控制器用于控制测试过程中的流程,如循环控制器、随机控制器、条件控制器等。通过逻辑控制器可以对测试过程进行精细控制,增加测试的灵活性。

jmeter的组件

如下为各个组件使用的顺序关系:
使用配置元件配置公共参数,使用前置处理器作为一些前置处理,如设置cookie等等。使用定时器定时执行,模拟真实场景。取样器模拟用户行为的核心元素。后置处理器可以提取变量,清除缓存等等。断言,用于判断结果是否符合预期。监听器,用了记录测试的性能指标和结果数据。
JMeter性能测试框架从0到1使用入门_第2张图片

jmeter组件逻辑

JMeter性能测试框架从0到1使用入门_第3张图片

元件的作用域

查看结果数作用于测试计划,在取样器外面,则对整个测试计划是有效的,如果在线程组里面则单独对于该线程有效。
JMeter性能测试框架从0到1使用入门_第4张图片

Jmeter最简单一次性能测试的构成
  1. 脚本中最多只能有一个测试计划。
  2. 测试计划中至少要有一个线程组。
  3. 线程组中至少要有一个取样器。
  4. 线程组中至少要有一个监听器。

录制工具Badboy使用:

Badboy是一款免费的Web自动化测试 工具,采用C++开发,拥有强大的屏幕录制和回放功能,可提供图形结果分析功能,同时Badboy提供了将Web测试脚本直接导出生成Jmeter脚本的功能,为Jmeter支持的jmx格式脚本,意味着Badboy一般常用于与JMeter结合使用。
BadBoy下载官网:http://www.badboy.com.au/
下面是badboy录制脚本的一般步骤:

  1. 安装和启动Badboy。在Badboy的主界面上,选择“开始录制”按钮。
  2. 在弹出的对话框中输入要录制的URL地址和名称,并选择相应的协议(如HTTP或HTTPS)。
  3. 按下“启动录制”按钮开始录制。
  4. 操作浏览器,执行你要测试的一系列操作,Badboy将记录所有的HTTP请求和响应。
  5. 操作完毕后,停止录制并保存录制文件。在Badboy主界面的“文件”菜单中选择“保存”或“另存为”选项来保存录制文件。
  6. 在Badboy中打开录制文件并查看、编辑和测试脚本。如需重新执行脚本,只要点击“运行”按钮即可。

Jmeter参数化

常见的 JMeter 参数化的实现方式:

  • CSV Data Set Config:将参数化的数据放入文件中,参数化读取依赖于文件操作。这样的参数化方式很常用,尤其适用于参数化数据量较多的场景,而且维护比较简单灵活。

JMeter性能测试框架从0到1使用入门_第5张图片

  • User Defined Variables:一般来说可以配置脚本中的公共参数,如域名,端口号,不需要随着压测进行动态改变,一般用于环境切换。

JMeter性能测试框架从0到1使用入门_第6张图片

  • Function Helper 中的函数:使用函数的方式生成参数,如果你需要随机数、uuid 等都可以使用函数生成。

JMeter性能测试框架从0到1使用入门_第7张图片

jmeter中的关联

关联是将上个请求的数据提取需要的内容放到下个请求中,通过关联我们可以获取到满足业务特性的不同数据,因此可以认为关联也是一种特殊的参数化形式。
JMeter实现关联常用有 3 种方式:

  • Json Extractor提取器,针对返回的 json 数据类型;

JMeter性能测试框架从0到1使用入门_第8张图片

  • 正则表达式提取器,通过正则表达式去提取数据,实现关联。

JMeter性能测试框架从0到1使用入门_第9张图片

◆ 边界提取器,通过左右边界的方式关联需要的数据;

Jmeter中常用的断言

  • 响应断言
    JMeter性能测试框架从0到1使用入门_第10张图片
  • -JSON断言
    JMeter性能测试框架从0到1使用入门_第11张图片

Jmeter分布式加压

Jemter分布式压测是选择其中一台作为调度机(master),其他机器作为执行机(slave);当然一台机器也可以既做调度机,也做执行机。
调度机执行脚本的时候,master将会jmx脚本分发到slave上,slave拿到脚本后以非GUI的形式开始执行。
slave执行完毕后将结果回传给master,并由master进行结果的汇总。
JMeter性能测试框架从0到1使用入门_第12张图片
jmeter分布式加压需要master和slave机器,以下为详细步骤

  1. slave机器配置
    1.1 关闭各slave机器上防火墙,修改server.rmi.ssl.disable=true
    在这里插入图片描述
    1.2 启动jmeter-server.bat文件

  2. mater机器配置,打开bin目录下的jmeter.properties文件,找到里面的remote_hosts部分,修改内容为:remote_hosts=xx,xx代表的是压力机的ip。如果是多个压力机,之间使用【,】分隔。
    JMeter性能测试框架从0到1使用入门_第13张图片

  3. master开启压测
    JMeter性能测试框架从0到1使用入门_第14张图片

如上也可以通过脚本运行的方式

jmeter -n -t G:\Test\1.1login_linux.jmx -l G:\Test\result\1.jtl -e -o G:\Test\html\1 -R 192.168.30.132:1099,192.168.30.130:1099
jmeter -n -t jmx脚本路径 -l jtl文件路径 -e -o 报告路径 -R salve的IP地址:端口,salve的IP地址:端口

使用jmeter进行压测的时候,使用图形化界面本来就是耗费资源的,所以图形化界面适合调试,真正的压测要使用命令行的方式,以下为参数详细的解释

命令行运行脚本格式:jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
◆ -n 表示在非 GUI 模式下运行 JMeter;
◆ -t 表示要运行的 JMeter 测试脚本文件,一般是 jmx 结尾的文件;
◆ -l 表示记录结果的文件,默认以 jtl 结尾;
◆ -e 表示测试完成后生成测试报表;
◆ -o 表示指定的生成结果文件夹位置。

beanshell

BeanShell 是由 Java 编写的,相当于一个小巧的 Java 源码解释器,简单来说就是你可以在里面写代码,然后通过
Beanshell 翻译成插件可以识别的指令去执行相关操作。官网: http://www.BeanShell.org/
jmeter如下元件都有beanshell
◆ 定时器: BeanShell Timer
◆ 前置处理器:BeanShell PreProcessor
◆ 采样器: BeanShell Sampler
◆ 后置处理器:BeanShell PostProcessor
◆ 断言: BeanShell断言
◆ 监听器: BeanShell Listener

编写beanshell脚本,需要熟悉beanshell常用内置变量,以下为beanshell常用内置变量

◆ log.info(“开始请求…”)
◆ log.error(“接口报错”)
◆ ctx.getCurrentSampler(); 获取当前 sampler 请求
◆ ctx.getPreviousSampler(); 获取前一个 sampler 请求
◆ ctx.getThreadNum(); 获取当前线程的序号,从 0 开始计数
◆ ctx.getThread(); 获取当前线程
◆ ctx.getThreadGroup(); 获取当前线程组
◆ ctx.getProperties(); 获取所有属性
◆ ctx.getVariables(); 获取当前线程的所有变量
◆ vars.get(String key):从jmeter中获得变量值;
◆ vars.put(String key,String value):数据存到jmeter变量中;
◆ prev.getResponseDataAsString():获取响应信息
◆ prev.getResponseCode() :获取响应code

实用技能

JMeter如何调用Python脚本

JMeter不支持直接调用Python脚本,但可以通过以下两种方式实现Python脚本的调用。

  1. 使用Jython脚本
    Jython是将Python代码转换为Java字节码的工具,可以在Java虚拟机(JVM)上运行Python代码。因此,可以使用Jython脚本来调用Python脚本。下面是一个简单的Jython脚本示例:
from subprocess import call
call(["python", "path/to/your/python_script.py"])

这个脚本将调用Python的subprocess模块中的call函数来运行Python脚本。在实际使用中,你需要将路径替换为你的Python脚本路径。
2. 使用外部命令
另一种调用Python脚本的方法是使用外部命令。这种方法可以通过JMeter的OS Process Sampler来实现。
首先,你需要在OS Process Sampler中添加一个执行命令的命令,例如:

python path/to/your/pythonscript.py

你需要将路径替换为你的Python脚本路径。然后,你可以将这个请求添加到你的测试计划中,调用OS Process Sampler来执行Python脚本。

Ramp-Up和集合点

JMeter线程组中,Ramp-Up和集合点是两个不同的配置选项。
Ramp-Up指的是在一定时间内逐步增加线程数,直到达到所需的最大线程数。比如,如果需要模拟100个用户同时访问网站,则可以将线程数设置为100,并将Ramp-Up时间设置为10秒,这意味着每秒增加10个用户,最终达到100个用户。
集合点则用于等待所有线程同时达到某个特定的点,然后再继续执行测试计划。这在某些场景下非常有用,例如需要模拟许多用户同时登录系统,但需要确保所有用户都已经登录成功之后才进行下一步操作。
因此,Ramp-Up和集合点是两种不同的配置选项,但都很重要,可以帮助测试人员更好地模拟真实的负载条件并确保测试的准确性。

JMeter性能测试框架从0到1使用入门_第15张图片

9大定时器

  1. 固定定时器:间隔时间固定不变,适用于并发用户数固定,场景较简单的测试。
  2. 统一随机定时器:随机时间在固定的时间区间内波动,适用于用户行为存在较大变化的场景,如购买行为。
  3. 准确的吞吐量定时器:根据预设的吞吐量计算出每个请求的间隔时间,适用于强调吞吐量的测试场景。
  4. 常数吞吐量定时器:根据预设的吞吐量和每个请求的响应时间计算出间隔时间,适用于吞吐量、响应时间两者都很关键的场景。
  5. 高斯随机定时器:随机时间符合高斯分布,适用于模拟用户行为的随机性和复杂性比较高的场景。
  6. jsr233定时器:允许使用Java脚本自定义定时器逻辑,适用于比较复杂的业务场景。
  7. 泊松随机定时器:随机时间符合泊松分布,适用于模拟稀缺事件的场景,如请求失败、网络超时等。
  8. 同步定时器:所有线程同时启动,适用于模拟高并发的场景。
  9. Beanshell定时器:允许使用Beanshell脚本自定义定时器逻辑,适用于比较复杂的业务场景。

JMeter业务混合场景按流量比例配置

如下图通过随机变量生成随机数,if控制器根据随机数进行判断执行那个sample,模拟真实场景
JMeter性能测试框架从0到1使用入门_第16张图片
JMeter性能测试框架从0到1使用入门_第17张图片

TPS事务控制器

每秒事务数(TPS)每秒响应请求数(OPS){一个页面的一次访问形成一个tps;但每一次页面访问可能产生多次对服务器的请求,多次请求ops}
想实现一个功能,但需要多个接口,这种接口需要上一个接口的数据做参数,我们看数据都是单个的请求,对于这种看一个功能包含多个请求的,我们就需要添加事务,这样会把此事务下的所有接口,都当作一个请求来计算。接口统一看作一个事务,进行性能测试,得到的性能测试结果才会更加接近真实的场景。
JMeter性能测试框架从0到1使用入门_第18张图片

梯度式加压

Jmeter是一款常用的压力测试工具,可以模拟多种不同的压力测试场景,但是对于梯度式加压测试,需要手动设置多个线程组以达到加压效果,比较繁琐。因此,可以使用插件来自动完成这个过程。
下面是添加梯度式加压插件的步骤:

  1. 下载插件
    插件名称为"Stepping Thread Group",可以在 https://jmeter-plugins.org/ 官网下载。
  2. 安装插件
    解压下载的插件文件,并将其复制到Jmeter的lib/ext目录下,启动Jmeter即可自动载入插件。
  3. 配置线程组
    在测试计划中新建线程组,右键单击线程组,选择"Add" -> “Threads (Users)” -> “Stepping Thread Group”,这样就成功添加了梯度式加压的线程组。
  4. 配置参数
    点击"Stepping Thread Group"线程组,可以看到在主界面的"Parameters"区域中有以下参数:
  • Number of Threads: 线程数目
  • Ramp-Up Time: 每秒钟增加的线程数
  • Hold Target Rate Time: 达到峰值后持续的时间
  • Start Threads Count: 初始时的线程数目
  • Stop Threads Count: 最大线程数目
    根据需要进行参数配置,然后启动测试即可。

JMeter性能测试框架从0到1使用入门_第19张图片

第三方插件监控TPS,响应时间,服务资源

jmeter自带的监听器功能有限,可以使用第三方插件 perfmon-agent: perfmon-agent ,具体使用如下
JMeter PerfMon插件是一个非常有用的工具,可以用于在JMeter中收集系统性能指标。在使用时,需要使用perfmon-agent来收集数据。以下是使用jmeter perfmon-agent的步骤:

  1. 安装PerfMon插件:通过JMeter插件管理器,安装PerfMon插件。
  2. 下载perfmon-agent:在jmeter的lib目录下找到需要使用的perfmon-agent,可以从以下网站下载,https://jmeter-plugins.org/wiki/PerfMon/, 根据需要下载合适的操作系统版本的perfmon-agent。
  3. 配置perfmon-agent:打开下载的perfmon-agent,根据需要修改perfmon-agent.cfg。 其中选择需要收集的数据指标,配置监听的端口号。
  4. 运行perfmon-agent:在cmd 或者终端中定位到perfmon-agent的bin目录下,执行命令:startAgent.bat(Windows) 或startAgent.sh(unix)
  5. 配置JMeter PerfMon组件:在JMeter中,添加一个“PerfMon Metrics Collector”组件。然后配置该组件,主机名设置为perfmon-agent所在的IP地址,监听的端口号设置为perfmon-agent.cfg配置文件中的端口号。其他选项根据需要配置,保存并关闭组件。
  6. 运行测试:运行JMeter测试即可收集系统性能数据。
  7. 查看测试结果:JMeter生成的测试报告中包含PerfMon插件生成的性能数据,可以用于识别系统的性能瓶颈。

你可能感兴趣的:(jmeter,单元测试,java)