前言
jmeter是一款可以绕过前端向后端发送请求的应用,他能够模仿人的操作去实现http请求的操作。它不仅可以作为测试工具使用而且还能够作为ddos攻击的工具使用,还能够自动化的进行抢购、签到等操作。所以学会他的使用不仅能够增加测试的技能而且还能给日常生活带来一些便利。以此来记录jmeter的重要知识点
Apache JMeter 是一款开源的 性能测试 和 功能测试 工具,最初设计用于测试 Web 应用程序,后来扩展到支持数据库、FTP、REST API、SOAP 等多种协议。它基于 Java 开发,支持多平台(Windows/Linux/macOS),广泛应用于负载测试、压力测试和接口自动化测试。
jmeter的安装及环境
- 在官网https://jmeter.apache.org/中左侧找到Download Releases,进入之后选择Binaries中适合的压缩包进行下载
- 安装java环境jdk,在https://www.java.com/zh-CN/中下载jdk包
- 解压出来,双击bin目录下的JMeter.bat文件,启动JMeter;或者点击ApacheJMeter.jar启动。
jmeter的基本概念
jmeter中有setUp线程组和tearDown线程组,他们在整个线程组中会是最开始和最后执行的线程组,可以用来表示登录和退出。在普通线程组中若没有勾选独立允许每个普通线程组会同时允许,具有抢占行。
- 测试计划:表示的是一系列描述步骤,可以由一个或者多个线程组构成,一个线程组又可以表示是一个业务流(功能)的实现;
- 线程组:线程组是一个测试计划的开始点,在一个测试计划中的所有取样器和逻辑控制器元件都必须在某个线程组下。所有的任务都是基于线程组。
- 组件与元件:线程、配置元件、监听器等叫组件,组件下面的每个子菜单叫元件,组件就是一组元件。
八大组件
- 取样器:可以实现模拟各种类型的请求发送;是实现JMeter相关测试的核心组件。
http请求:模拟http协议的请求,
调试取样器:查看jmeter变量属性及系统属性以及接收的值 - 配置元件:
HTTP信息头管理器:作用是用来配置HTTP请求header里的参数。如Content-Type(application/json)、Authorization(token)、User-Agent,
HTTP请求默认值:作用是配置其作用域范围内的所有HTTP请求的默认协议、主机ip、端口、路径、代理等等,如果某个请求中没有配置参数,则使用HTTP请求默认值中配置的参数,如果在请求中配置了具体的参数,则使用实际配置的数据。
HTTP Cookie管理器:作用是实现Cookie的自动存储与携带,如果多个接口请求之间要依赖Cookie,需要添加这个元件才能访问。
用户自定义变量:功能用户自定义变量 - 前置处理器:前置处理器会在它作用域范围内的每个取样器执行之前执行。
用户参数:可以在用户参数元件中定义参数及对应的值,一个参数可以对应多个值,比如下面一个参数对应了4个值(用户),这时如果在线程组中设置4个线程,那么每个线程将会分别取一个值。 - 后置处理器:后置处理器会在它作用域范围内的每个取样器执行之后执行,常用的后置处理器元件有正则表达式提取器、
JSON提取器、等,可以用来从响应中提取想要的内容。
正则表达式提取器:正则表达式
JSON提取器:JSON路径表达式 - 定时器:
固定定时器:作用是设置每个取样器延迟执行,延迟的时间就是这里设置的固定时间,但它对不停顿启动方式执行是无效的。如果它在一个线程组下面,那它的作用域就是线程组下的所有取样器,如果它在某个取样器下面,那它的作用域就是这个取样器。实际操作中,固定定时器可以用来模拟真实用户在操作过程中的等待时间。 - 断言:
响应断言:用来校验响应文本中是否包含、等于某某字符串,如果断言成功则表示用例执行通过;断言失败后会在查看结果树里面展示,成功的话不会展示。 - 监听器:作用是查看取样器的执行结果。
查看结果树
用表格查看结果 - 测试片段:测试片段下的元件默认不执行,在实际操作中,可以用来备份不常用的元件。


逻辑控制器
if控制器:如果条件满足,就执行if控制器下面的元件,要注意的一点是if控制器的条件需要以__jexl3或者__groovy函数来表示,否则无法识别。例如:${__groovy("${is_delete}"=="0",)}
注意:可以在Jmeter中选择函数助手来设置函数

循环控制器:实现它作用域范围内的元件循环执行循环次数要填正整数,如果填入负数或者不填,表示死循环。可以在线程组中设置循环次数,也可以在循环控制器中设置循环次数,区别是:
- 在线程组中设置的循环次数,其作用域是整个线程组下的元件,而循环控制器中设置的循环次数,其作用域是当前循环控制器下的元件;
- 如果线程组中设置了线程数为a,循环次数b,在循环控制器里设置了循环次数c,则循环控制器下的取样器将执行
a*b*c次,在循环控制器外的取样器将执行a*b次;
事务控制器:将一个功能的多个接口请求添加到事物控制器下,如果其中一个请求失败则整个事务控制器就会失败。

交替控制器:交替控制器下面有N个取样器,设置循环控制器循环N次,则每次循环交替运行控制器下的取样器。

注意:交替控制器必须在循环控制器里面
仅一次控制器:每个线程只会执行1次仅一次控制器,不管线程循环多少次。仅一次控制器只会屏蔽上一层(父级)的循环次数
简单控制器:简单控制器的作用就是对取样器分组。
http请求
在http请求中有三种类型的传参
- 参数:如果get请求会默认在地址栏中传参,如果是post请求默认会在请求体传参并且格式为表单格式。如果需要在地址栏传参还可以直接在地址后面?跟上传参的格式也可以进行传参。如果是csv参数化的形式只能通过地址栏来调用传参。
- 消息体:默认是text类型的参数,若需要转换为json格式,需要在请求头中加入content-type:application/json来进行传参,可以通过http信息头管理器来是实现。
- 文件上传:默认格式为multipart/form-data,文件名称字段表示文件的路径名称,参数名称表示接口要求的文件字段名,MIME类型表示文件类型(如
image/jpeg、text/csv)。不填时,JMeter 会默认根据文件后缀自动判断。
作用域
执行顺序为配置元件->前置处理器->定时器->取样器/逻辑控制器->后置处理器->断言->监听器;如果在同一级有多个相同优先级的元件,则按排列顺序执行;
取样器跟其他元件没有交互,不存在作用域的概念。
逻辑控制器只对元件只对其子节点中的取样器和逻辑控制器起作用,作用域就是它下面的所有取样器和逻辑控制器;
其它6种元件如果父级是一个取样器,那它的作用域就是这个取样器;如果父级不是取样器,那它的作用域是它父级下的所有取样器。
- 测试计划:放到测试计划下就对测试计划下所有组件起作用
- 线程组:放到线程组下就对该线程组下所有组件起作用
- 取样器:放到取样器下就只对该取样器起作用
参数化
jmeter使用配置元件CSV Data Set Config+循环控制器来进行数据驱动,它可以引入CSV和txt类型的文件。


一般情况下只需要设置文件路径和分隔符就可以进行数据驱动,但如果配置变量名称时需要再将忽略首行设置为true才能正常运行。在取样器中以${n}变量的形式进行设置,变量默认为,建议改为|,设置好后就一列为变量的数据进行数据驱动,可设置用例标题、期望数据、用例数据、鉴权依赖等。
属性相关函数
__P/__property函数:表示的是获取当前的JMeter相关属性信息;直接传递需要获取的属性名;可以查看属性显示中的所有属性的值(相当于环境变量)
__setProperty函数:__setProperty函数为JMeter设置属性
设置属性的目的是将先前的某个变量获取的值赋给一个属性变量,可以在后续的线程组中使用这个变量。
如果为单个线程组在使用csv文件时,可以使用${__eval(${变量})}识别文件中的变量。也可以通过JSR223 预处理程序通过python代码将原本文件的值进行替换也可以达到预期结果
如果为跨线程组时,需要设置上一个线程组的某个值通过__setProperty函数设置为为属性,在下个线程组中使用__P/__property函数进行调用,调用后可以通过${__eval(${__P(name,)})}套娃使用,也可以通过JSR223 预处理程序通过python代码将原本文件的值进行替换,根据喜好搭配。
注意:在使用JSR223相关的组件进行python编写时需要下载相应的jar包,官网为https://www.jython.org/download,下载完后导入到lib目录中
提取器
正则表达式提取器:通常被用来查询、替换那些符合某个模式(规则)的文本。
- 匹配字符:
.:表示匹配任意字符,1个.表示1个任意字符,除了\n\w:表示匹配1个语言字符、数字、下划线\W:非语言字符、数字、下划线\d: 表示匹配数字\D: 表示匹配非数字\s: 表示匹配空白字符,如:空格,制表符,换行符,回车符等\S: 表示匹配非空白字符[]: 表示字符集,可以匹配一个范围内的字符,比如[abc]表示匹配a、b和c的范围,[a-z]表示匹配小写字母a到z,[0-9]表示匹配数字0到9|: 表示指明两项或者多项之间的一个选择,比如a|b表示匹配a或者b,比如,z|food能匹配z或food,(z|f)ood则匹配zood或food
- 匹配次数:
+: 前面一个字符匹配1到多次*: 前面一个字符匹配0到多次{n}:前面一个字符匹配n次{n,m}: 前面一个字符匹配n到m次{n,}: 前面一个字符匹配n到多次?: 前面一个字符匹配0到1次
其他的符号
^- 在字符集中表示非
- 在正则表达式的开始表示开始符号
$: 结束符号- () : 使用小括号把正则表达式的符号括起来,表示返回括号中的符号匹配到的内容,小括号两边一般都要写边界
?: 在次数后表示关闭正则表达式的贪婪模式
json提取器:用于提取取样器返回的json结果
json路径表达式
| json表达式 | 说明 | 例子 |
|---|---|---|
$ | 根节点 | |
. 或者[] | 子节点 | $.key key没有嵌套 []中可以输入下标==>$..key[n] |
.. | 任意节点 | $..key 任意节点下key的值 |
* | 通配符 | |
['key1','key2'] | 获取key1和key2对应的值 | $.book..['price','author'] |
[number1,number2] | 下标number1和下标number2对应的值 | $..[1,2] |
[number1:number2] | 下标number1到下标number2-1对应的值 | $..[0:2] |
| @ | 在表达式中使用,表示当前节点对象 | |
[?(bool表达式)] | jsonpath过滤器的格式 | 并且$..[?(@.key1==value1 && key2==value2)]或者 $..[?(@.key1==value1 ||key2==value2] |
举例:
1、如图所示,我需要提取响应报文中accountid的值,以方便后续使用

2、当返回值为json类型的时候就可以使用json提取器进行提取,并设置为变量

3、最后可通过调试取样器查看是否提取成功。

注意:在jmeter中并且为&&或者为||,在python中还可以为and和or。
整理思路
若是使用Jemeter进行测试时,需要了解测试的接口地址、参数、以及返回参数提示等。在进行登录此操作时需要添加token或cookie的值,然后根据返回值类型进行提取。提取出来后设置为全局变量或局部变量对后续的操作或其他线程组使用,添加断言将原本是错误的案例通过后进行错误更正。像返回值、判断成功与否、替换等操作可以通过JSR223 Sampler写相应的语言脚本实现,例如JSR223 预处理程序能够通过python修改和替换csv里面的内容。

Comments NOTHING