JMeter四种参数化方式
JMeter参数化是指把固定的数据动态化,这样更贴合实际的模拟用户请求,比如模拟多个不同账号。JMeter一共有四种参数化方式,分别是:
JMeter参数化是指把固定的数据动态化,这样更贴合实际的模拟用户请求,比如模拟多个不同账号。JMeter一共有四种参数化方式,分别是:
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 JMeter关联是什么 JMeter关联,这几个字看着可能会有点陌生,实际上却是工作中经常会做的一件事情,尤其是接口自动化,它指的是把一个接口的响应作为另一个接口的参数,从而把接口关联起来。 JMeter关联是通过后置处理器来实现的,本文将介绍两个主流提取器:正则表达式提取器和JSON JMESPath提取器。 正则表达式提取器 Name 最好有业务含义的名称。 Comments 可以为空的注释。 Apply to 匹配范围。 Main sample and sub-samples 匹配当前父取样器及其子取样器。 Main sample only 仅匹配当前父取样器。 Sub-samples only 仅匹配子取样器。 JMeter Variable Name to use 匹配JMeter变量。 Field to check 匹配响应的字段,共七个选项。 Body:主体,最常用。 Body(unescaped) :替换了所有的html转义符的响应主体内容,注意html转义符处理时不考虑上下文,因此可能有不正确的转换,不太建议使用。 Body as a Document:从不同类型的文件中提取文本,注意这个选项比较影响性能。 Response Headers:响应Headers。 Request Headers:请求Headers。 URL:请求URL。 Response Code:响应代码,比如200、404返回码。 Response Message:响应信息,比如“成功”、“OK”字样。 Name of created variable 创建的变量名,比如变量名为token,通过${token}进行访问。 Regular Expression 正则表达式。 正则表达式可阅读这篇文章进一步了解:https://dongfanger.gitee.io/blog/未分类/001-5分钟轻松学正则表达式.html Template($i$ where i is capturing group number, starts at 1) 用$$引用起来,如果在正则表达式中有多个正则表达式(多个括号括起来的),则可以是$1$、$2$等等,$1$指第一个模板,$2$指第二个模板,依次类推,$0$指全文匹配,$1$$2$指同时取第一个和第二个模板。 ...
线程组编辑区如下:
测试计划(Test Plan),是JMeter目录树的初始根节点,它的编辑区如下:
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 从一个问题说起 对于以下测试脚本: 为了能调用进入房间接口,需要从考场接口获取考场token。为了调用考场接口,需要从登陆接口获取登陆token。元件说明如下: 学生登录,提取登录${token}传入下个接口参数。 添加HTTP Header Manager: 考场token,提取考场${exam_token}传入下个接口参数。 添加HTTP Header Manager: 进入房间 貌似挺合理,HTTP Header Manager会给下方的接口添加请求头,运行结果真的如我们所料么? 运行顺序 在回答这个问题之前,有必要搞懂JMeter元件的运行顺序,它是由2 个维度来决定的:从上往下和元件类型。 从上往下,即目录树从上往下。元件类型,分为3类: 线程组、逻辑控制器。 取样器。 配置元件、前置处理器、定时器、后置处理器、断言、监听器。 它们的运行顺序如下: 配置元件(如果存在) 前置处理器(如果存在) 定时器(如果存在) 取样器(如果存在) 后置处理器(如果存在且取样器的结果不为空) 断言(如果存在且取样器的结果不为空) 监听器(如果存在且取样器的结果不为空) 换句话说,假设我们新建了1个线程,想用这个线程去发请求。 第一步,初始化配置,比如参数化、设置Header、Cookie等,用到配置元件。 第二步,可能需要给线程加点参数,比如用户参数,用到前置处理器。 第三步,在发送请求前可能会等待一段时间,用到定时器。 第四步,发送请求,用到取样器。 第五步,可能需要提取响应数据,比如正则表达式提取器、JMESPath提取器,用到后置处理器。 第六步,验证结果符合预期,用到断言。 第七步,查看请求响应数据和测试结果,用到监听器。 实践指南 对于以下所列元件: JMeter会按以下步骤运行: 线程组(如果有多个线程组可以在测试计划设置是顺序执行还是同时执行) 简单控制器(父节点) HTTP Cookie管理器(配置元件) 用户参数(前置处理器) Synchronizing Timer(定时器) HTTP 请求1(取样器) 正则表达式提取器(后置处理器) 响应断言(断言) HTTP Cookie管理器(配置元件) 用户参数(前置处理器) Synchronizing Timer(定时器) HTTP 请求2(取样器) 正则表达式提取器(后置处理器) 响应断言(断言) HTTP 请求3(取样器) 察看结果树(严格来讲是与第 6 步并行,也就是取样器之后) 作用域 其中有个观察作用域实际效果的关键元件:HTTP请求2,它的前后并没有元件,但是也被作用上了。在JMeter中,同一层级的元件具有相同的作用域! ...
JMeter的界面虽然不华丽,但是使用起来还是很便利。本文将基于英文版界面对整个可视区域进行介绍,如果想看中文版,请在菜单栏点击Choose Language切换:
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 运行文件 JMeter下载地址为: https://jmeter.apache.org/download_jmeter.cgi 最新版本为5.4.1,依赖于Java8+,下载后无需安装,解压即用。解压后的目录和文件如下: bin 二进制文件目录,包括配置文件、启动文件、启动jar包、示例脚本。比如Windows和Linux系统的两个启动脚本: docs API离线帮助文档。 extras 辅助功能,可用于Ant、Jenkins集成。 lib lib根目录下存放JMeter基础jar包,lib/ext目录下存放第三方或自定义扩展jar包。 licenses 证书文本文件。 printable_docs 离线帮助文档。 LICENSE 证书说明。 NOTICE 版权声明。 README 简介。 测试计划 JMeter以图形界面方式启动后,首先映入眼帘的是左侧的TestPlan,测试计划: JMeter的UI界面只能同时编辑一个测试计划,如果想再编辑另外一个测试计划,必须再打开一个JMeter界面。这是因为测试计划对应的是.jmx文件!不同的.jmx文件只能在不同的界面中编辑。 JMeter界面是通过组件拖拽的方式来编写脚本的,脚本的根目录是测试计划。根节点只能有一个,作为根节点,测试计划很适合来做全局配置,比如在User Defined Variables处添加键值对格式的全局变量。 测试计划是默认节点,JMeter还有另外一个不可缺少的次节点:Thread Group,线程组。 多线程 性能测试工具的目的是用少量电脑产生成百上千个并发请求。多进程和多线程正好能用来实现这个需求,书上有句关于进程和线程的至理名言:“进程是操作系统分配资源的最小单位,线程是程序执行的最小单位”。该如何理解呢?前一句的意思是说,每个应用程序都有对应的进程,按照进程来分配资源,可以使得资源利用最大化,避免浪费。后一句的理解得从一个故事讲起,很久以前,进程拿着资源找CPU执行。CPU一看进程太大,说我处理不了。进程只能拆成多个线程给CPU,不但能执行了,还能在线程之间灵活切换。 多进程和多线程都可以用来模拟并发请求。JMeter是用Java语言写的程序,运行在JVM虚拟机之上,进程的开销比线程大很多,JVM为了保证足够性能,控制了进程的数量。如果用多线程,单台电脑能提供了负载有限,那么就只能用多线程。JMeter只支持多线程! 另外一个性能测试工具LoadRunner支持多进程和多线程。 用户即线程 JMeter除了Thread Group,其他地方都是用的另外一个词:User。实际上它们是一个意思,用户就是线程。JMeter的运行原理就是用多个线程来模拟多个用户!以下是简单示例: 从图中可以看出,有两个线程组,Thread Group 1和Thread Group 2,它们分别定义了自己组内的用户要做的事情。不同线程组做的事情是不一样的,但是同一线程组内部做的事情是一模一样的。我们在写JMeter脚本的时候,实际上是在定义每个用户要做哪些事。当运行脚本的时候,JMeter会启动多个线程,都来执行这个脚本,按照我们写的进行执行。 由于每个线程启动时间不一样,线程执行时资源环境也有区别,导致线程的执行进度并不完全一致,比如一些线程已经登录完了,另一些线程可能才刚开始登录。后面的文章会给出一些解决办法。 远程运行 一台机器提供了线程数量有限,如果想要施压更大的并发,那么就需要多台机器。JMeter天然支持多台机器并发: 控制机和负载机本质上没有区别,同一台机器既可以做控制机,也可以做负载机,取决于你的负载设计。控制机的作用是管理多台远程负载机,控制远程负载机脚本运行,收集远程负载机测试结果。负载机是实际产生并发的机器,它们向被测应用系统发起负载。 运行逻辑如下: 远程负载机启动Agent客户端,等待控制机连接。 控制机连接上远程负载机。 控制机发送指令到远程负载机启动线程。 远程负载机运行脚本,回传结果数据。 控制机收集结果并显示。 操作步骤如下: 远程负载机启动jmeter-server.bat。 在控制机bin\JMeter.properties文件中,修改remote_hosts,添加远程负载机的ip和port,多个远程负载机ip 用逗号分隔,如remote_hosts=192.168.0.1:1664,192.168.0.2:1664。1664是默认RMI端口号(Remote Method Invocation,远程方法调用)。 在控制机菜单栏Run执行Remote命令: 如果远程负载机需要参数或jar包,可以手动先把环境准备好,也可以使用自动化工具在脚本运行前从控制机发送到远程负载机。 小结 本文先从JMeter运行文件讲起,启动后默认有测试计划,建线程组,线程即用户,用多线程来模拟多用户,这就是JMeter运行起来施压的原理。为了解决单台机器负载能力有限的问题,JMeter还提供了远程运行方式,既可以在局域网用多台机器来控制,也可以部署到云服务器上,进行云压测。
JMeter是性能测试工具,在使用JMeter变多以后,越来越觉得之所以它能成为当今时代最主流测试工具,是因为它太成熟了,举个小例子,编写GET请求的时候,需要把查询参数,也就是?号后面的请求参数添加进去,JMeter竟然有个Add from Clipboard功能,在浏览器复制以后,点这个按钮就填充好了: