JMeter 元件使用详解
- HTTP Request
- JDBC Request
- 用户定义变量(User Defined Variables)
- 用户参数(User Parameters)
- CSV 文件(CSV Data Set Config)
- 函数
- 正则提取器
- XPath 提取器
- JSON 提取器
- 跨线程组关联
Jmeter 元件的基本介绍
常见元件类型
- 取样器
- 逻辑控制器
- 前置处理器
- 后置处理器
- 断言
- 定时器
- 测试片段
- 配置元件
- 监听器
元件作用域
在 JMeter 中,元件的作用域是靠测试计划的树形结构中元件的父子关系来确定的。
提示:核心是取样器,其他组件都是以取样器为核心运行的。组件添加的位置不同,生效的取样器也不同。
作用域的原则
- 取样器:元件不和其他元件相互作用, 因此不存在作用域的问题。
- 逻辑控制器:元件只对其子节点中的取样器和逻辑控制器作用。
- 其他六大元件:除取样器和逻辑控制器元件外,如果是某个取样器的子节点,则该元件对其父子节点起作用。
- 如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点、子节点的子节点等)。
元件执行顺序
- 配置元件(config elements)
- 前置处理程序(Per-processors)
- 定时器(timers)
- 取样器(Sampler)
- 后置处理程序(Post-processors)
- 断言(Assertions)
- 监听器(Listeners)
提示:
- 前置处理器、后置处理器、断言等元件功能对取样器起作用(如果在它们的作用域内没有任何取样器,则不会被执行)。
- 如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序依次执行。
测试计划(Test Plan)
JMeter 的测试计划是一系列配置器、线程组、控制器、Sampler、检查器、监听器组成的集合。
- Jmeter 的各种部件以目录树的形式在工程中被组织起来,根节点下属器件类型一般是配置元件、线程组、监听器。
- Jmeter 运行时会首先运行配置元件,然后启动线程组,线程组中全部 Sampler 的执行结果会在配置的监听器中出现。
- Jmeter 测试以测试计划为单位执行,测试计划一般至少应该包含一个线程组、一个 Sampler 和一个监听器。
注意:Jmeter 默认多个线程组之间是并行执行关系。如果希望一个线程组执行完毕后,再按序执行下一个线程组下的请求,则需要在测试计划下勾选“Run Thread Groups consecutively”。
线程组(Thread Group)
JMeter 中 Thread Group 和 Load Runner 中 user 的概念十分接近,可以通过添加采样器、控制器、定时器等单元模拟用户行为,可以通过修改实例数量模拟多用户操作。
在测试执行时,Thread Group 中的每一实例都是一个独立的线程,实例数量和每个实例的循环次数可以设定。
线程组的特点
- 模拟多人操作。
- 线程组可以添加多个, 多个线程组可以并行或串行。
- 取样器(请求)和逻辑控制器必须依赖线程组才能使用。
线程组分类
- 线程组:普通的、常用的线程组,可以看做一个虚拟用户组,线程组中的每一个线程都可以理解为一个虚拟用户。
- setUp 线程组:一种特殊类型的线程组, 可用于执行预测试操作。
- tearDown 线程组:一种特殊类型的线程组, 可用于执行测试后工作。
- 一般我们可以将初始化数据的脚本放入 setup 线程组中,将清除测试数据的脚本放入到 teardown 线程组中,来保证脚本始终在开始和最后执行,而无需额外考虑线程组的执行顺序。
配置项介绍
Name:线程组名称,用在 UI 上显示时区分不同的线程组。可以同名但是尽量不要使用相同的名字。
Comments:线程组说明,可以用来写一些注释。
Action to be take after sampler error:这一组配置项用于定义线程组内 sampler 发生 error 时,线程组的行为。常用选项为 continue 和 stop test now。进行测试时一般选择 continue,进行调试时一般选择 stop test now。
- Continue:继续执行当前线程。
- Start next thread loop:结束当前线程,启动新的线程重新执行该线程的测试。
- Stop Thread:停止当前线程,并且不再启动新的线程。
- Stop test:停止整个测试。
- Stop test now:强制停止整个测试(stop test 和 stop test now 的区别类似于 kill 和 kill -9)。
Thread Properites
- Number of Thread(users):线程数量。测试开始执行后 Jmeter 会根据这个配置配启动对应的线程数量。例如配置 10 个线程,则可以模拟 10 个用户。
- Ram-up Period(in seconds):线程启动时间间隔。Jmeter 会根据这个配置,间隔性的启动线程。例如配置 10 线程,延迟为 100 秒,那么 Jmeter 会每个 10 秒启动一个线程。
- Loop Count:每个线程的执行次数。线程组内的全部 Sampler 执行完毕后,再次执行该线程组,直至达到配置次数。
- Delay Thread creation until needed:这个选项在 Ram-up Period(in seconds)配置时生效。如果不选,Jmeter 会先创建完全部实例再逐个启动;如果选择,Jmeter 会在上一个线程启动后,再创建下一个线程。
示例:一个线程组中设置了 2 个线程,每个线程分别执行 3 个请求,那么:
- 线程 1 顺序执行请求 1-3;线程 2 顺序执行请求 1-3。
- 线程 1 和线程 2 则是并发执行。
配置元件(Config Element)
Jmeter 中的配置元件主要用于管理 Sampler 的参数或变量。
- 点击选中配置元件,然后点击 JMeter UI 上的蓝色问号,可以查看配置元件对应的文档。
- 一般情况下, HTTP 相关的配置元件添加于根目录。添加于根目录时, Test Plan 的全部 http sampler 会使用根目录的配置。如有特殊情况,可以在某个 thread group 或 sampler 上添加下配置元件,覆盖默认配置。
- HTTP 测试常用的配置元件是 HTTP Request Defaults、HTTP Header Manager 和 HTTP CookieManager。
HTTP Request Defaults
HTTP Request Defaults 配置元件用于配置 http sampler 的默认参数,一般配置在根节点上。配置在根节点后,整个 Test Plan 里面了所有 http sampler 都会默认使用 HTTP Request Defaults 的配置。
最常用的选项为服务器的 IP、Port、Implementation:
- IP、PORT:分别为服务器的IP和端口。其他选项的用途见文档。
- Implementation:指定使用哪个 http 版本实现(一般选择 HttpClient4),选择后 Jmeter 会使用 ApacheHttpClient4.X 版本处理 http 请求。
HTTP Cookie Manager
- HTTP Cookie Manager 配置元件用于配置 http sampler 使用的 cookie,使用 cookie 的请求必须添加这个配置元件,不使用 cookie 的可以不添加。
- 一般情况下,添加后使用默认配置即可。如默认配置和服务器端实现不同时,可以从开发人员处了解实现细节修改对应配置。
HTTP Header Manager
- HTTP Header Manager 配置元件用于配置 http sampler 请求的 header。对于 header 没有特殊要求的 http 接口,可以不添加。
- HTTP Header manager 中的配置和接口定义有关,可以通过浏览器抓取请求查看,或者翻阅开发文档获取信息。
取样器(Sampler)
HTTP Request(Sampler)
HTTP Request Sampler 用于发送 HTTP 请求并接收响应结果。
- HTTP Request Sampler 的大部分选项对应 HTTP 协议的参数。
- 如果同级或上级目录有 HTTP Request Defaults,不填写时会使用 HTTP Request Defaults 的配置,填写后会覆盖 HTTP Request Defaults 的配置。
- HTTP Sampler 会校验请求的 Response Code。Response Code != 200 的请求, HTTP Sampler 默认会认为请求失败。这里的返回码指的是 HTTP 协议中定义的 Response Code 而不是 Response Body 中的内容。
配置项介绍
- 协议:向目标服务器发送 HTTP 请求时的协议, 可以是 http 或者是 https ,默认值为 http 。
- 服务器名称或 IP :HTTP 请求发送的目标服务器名称或 IP 地址。
- 端口号:目标服务器的端口号, 默认值为 80 。
- 方法:发送 HTTP 请求的方法, 可用方法包括 GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE 等。
- 路径:目标 URL 路径(不包括服务器地址和端口)。
- Content encoding:内容的编码方式, 默认值为 iso8859。
- 请求重定向行为:一般使用默认即可。需要对 HTTP 的重定向有一定了解才能修改这项配置,如果重定向出现问题又不知道该怎么配置请找对应的开发人员去求助。
- 同请求一起发送参数:GET 请求时 URL 中附带参数可以通过此方式添加。
- 消息体数据:POST/PUT 请求的 JSON/XML 数据存放地。
注意:
- 如果 GET 请求 URL 中的参数含中文,则建议将参数放到下面“参数”中填写,并将中文参数的“编码?”勾上。
- 如果发送的请求体格式为多种请求体格式(Content-Type)时,需要勾选“multipart/form-data” 。
JDBC Request(Sampler)
JDBC Request 用于连接数据库并执行 SQL。
使用步骤 1:添加 MySQL 驱动 jar 包
在测试计划面板点击“浏览…”按钮,将所需的 JDBC 驱动添加进来。
步骤 2:配置 JDBC Connection Configuration
- Variable Name: MySQL 数据库连接池名称(后续 JDBC 请求时要引用)。
- Database URL: jdbc:mysql://localhost:3306/czbk_member(allowMultiQueries=true:添加该参数后,在后面的 JDBC Request 请求中可以批量执行多条 SQL 语句;如果没加该参数,那么在执行完第一条 SQL 后就会报错)。
- jdbc:mysql:MySQL 固定格式
- //127.0.0.1:数据库 IP 地址
- 3306:MySQL 端口
- czbk_member:要连接的数据库名称
- JDBC DRIVER class: com.mysql.jdbc.Driver(MySQL 驱动包位置固定格式)。
- Username:数据库用户名。
- Password:数据库密码(如果密码为空则不写)。
步骤 3:配置 JDBC Request
主要参数:
- Variable Name:数据库连接池的名字,需要与 JDBC Connection Configuration 的 Variable Name Bound Pool 名字保持一致。
- Query:非批量执行时,填写的 sql 语句未尾不要加分号。
- Parameter values:参数值。
- Parameter types:参数类型。
- Variable names:保存 sql 语句返回结果的变量名。
- Result variable name:创建一个对象变量, 保存所有返回的结果。
- Query timeout:查询超时时间。
- Handle result set:定义如何处理由 callable statements 语句返回的结果。
运行结果示例:
参数化
Jmeter 参数化常用方式:
- 用户定义变量(User Defined Variables)
- 用户参数(User Parameters)
- CSV 文件(CSV Data Set Config)
- 函数
1)用户定义变量(User Defined Variables)
注意:用户定义变量的作用域针对的是测试计划,即无论用户定义的变量组件放在哪里, 他都会针对整个测试计划生效。
添加方式: 测试计划 --> 线程组--> 配置元件 --> 用户定义变量
2)用户参数
添加方式: 测试计划 --> 线程组--> 前置处理器 --> 用户参数
3)CSV 文件
CSV 的作用域是针对线程的, 只有两种情况:
- 对所有线程组中的线程生效:父节点是测试计划,并且线程共享模式是“所有线程”时,对所有线程组中的线程生效。
- 对当前线程组中的线程生效:父节点是某个线程组时,只会对当前线程组生效。
添加方式:测试计划 --> 线程组 --> 配置元件 --> CSV 数据文件设置
- 文件名:CSV 文件路径。
- 文件编码:文件编译字符编码,一般设置 UTF-8。
- 变量名称:多个变量时,使用英文逗号分隔。
- 忽略首行:True 为忽略,False 为不忽略,默认值 False 。
- 分隔符:如文件中使用的是逗号分隔,则填写逗号;如使用的是制表符,则填写 \t,
- 是否允许带引号:CSV 文件中的内容是否允许带引号
- 遇到文件结束符再次循环:当读取文件到结尾时,是否再从头读取文件。False 表示当读取文件到结尾时,停止读取文件。
- 遇到文件结束符停止线程:True 表示当读取文件到结尾时,停止进程。
- 线程共享模式:共享模式一般默认即可。
- 所有线程:该文件在所有线程之间共享,所有线程循环取值,线程 1 取第一行,线程 2 取下一行。
- 当前线程组:各个线程组分别循环取值。
- 当前线程:每个文件分别为每个线程打开。
4)函数
JMeter 中内置了大量函数,可以使用这些函数帮助我们完成数据驱动,实现相对复杂的测试逻辑。
函数助手
JMeter 支持的全部函数可以从 GUI 上的函数助手中查到。
使用步骤:
- 在 JMeter UI 上点击函数助手图标打开函数助手;
- 点击函数助手最上面的下拉菜单可以选择要使用的函数;
- 选择函数后,点击 help,可以打开函数对应的帮助文档;
- 根据函数的文档说明和自己的需要,填写 Function Parameter 中的参数;
- 点击 Gennerate 按键,生成函数字符串。
${__Random}
__Random 函数的功能是产生随机整数。可以在使用某种资源时在资源名称字符串上使用这个函数,这样可以创建名称+随机数的不同名资源。
以 PetStore 户登录为例,可以在用户名称后添加 ${__Random(1,10,user)},这样线程每次循环会使用不同的名称。
参数说明:
- The minimum value allowed for a range of values:随机数取值范围的最小值。
- The maximum value allowed for a range of values:随机数取值范围的最大值。
- Name of variable in which to store the result (optional):存储本次调用生成随机数的变量名称。
${__RandomString(,,)}
如 ${__RandomString(10,abcdefghijiklmnopq,)} 表示取 10 个表示从“abcdefghijiklmnopq”中随机取10个字符串。
${____javaScript}
__javaScript 函数的功能是运行一段 JavaScript 代码,并返回执行结果。
下面这个应用,每次返回的结果并不固定,但是有大约 40% 的概率返回真,这段代码结合 IF 控制器,可以实现保持一定概率,并随机进行某个操作流程。
${__javaScript(${__Random(1, 10, )} > 6, )}
参数说明:
- JavaScript expression to evaluate:需要执行的 JavaScript 表达式。
- Name of variable in which to store the result (optional):存储本次调用生成随机数的变量名称。
${__counter(,)}
__counter 函数的功能是计数。
参数说明:
- TRUE:线程组中每个线程使用自己的 counter。
- Name of variable in which to store the result (optional):存储 __counter 返回值的变量名。
__counter 可以用于生成用户,图例是使用 counter 创建 50 个用户,用户名和密码依次为 test1、test1 至 test50、test50。
断言(Assertion)
一般添加于采样器上,用于验证 Sampler 的结果或收集 Sampler 性能数据。
- 虽然 HTTP Sampler 会自动验证 Response Code,但是很多时候我们需要对其返回内容进行验证,这时我们一般需要使用 Assertion。
- HTTP 测试常用断言为 Response Assertion、JSON Assertion、Duration Assertion。
- JR223 Assertion 有时也会用到,这个断言可以通过代码实现复杂的结果检查。
Response Assertion(响应断言)
Response Assertion 可以检查 http 请求返中 body 的值。
配置项详解
Apply to(适用范围):
- Mainsampleandsub-samples:作用于父节点取样器及对应子节点取样器
- Mainsampleonly :仅作用于父节点取样器
- Sub-samplesonly :仅作用于子节点取样器
- JMeterVariable :作用于 jmeter 变量(输入框内可输入 jmeter 的变量名称)
测试字段(要检查的项):
- 响应文本:来自服务器的响应文本,即主体,不包括任何 HTTP 头
- 响应代码:响应的状态码,例如:200
- 响应信息:响应的信息,例如:OK
- ResponseHeaders :响应头部
- RequestHeaders :请求头部
- RequestData :请求数据
- URL 样本:响应的 URL
- Document(text):响应的整个文档
- 忽略状态:忽略返回的响应状态码
模式匹配规则:
- 包括:文本包含指定的正则表达式。
- 匹配:整个文本匹配指定的正则表达式。
- Equals:整个返回结果的文本等于指定的字符串(区分大小写)。
- Substring:返回结果的文本包含指定字符串(区分大小写)。
- 否:取反。
- 或者:如果存在多个测试模式,勾选代表逻辑或(只要有一个模式匹配,则断言就是 OK ),不勾选代表逻辑与(所有都必须匹配,断言才是 OK)。
测试模式:即填写你指定的结果(可填写多个),按钮【添加】、【删除】 是进行指定内容的管理。
注意:当要断言非 200 的响应状态码时,注意要勾选“忽略状态(ignore status)”,否则 Jmeter 会默认将非 200 的响应视为失败。
JSON Assertion(JSON 断言)
该组件用来对 JSON 文档进行验证, 验证步骤如下:
- 首先解析JSON数据, 如果数据不是 JSON, 则验证失败。
- 使用 Jayway JsonPath 1.2.0 中的语法搜索指定的路径。 如果找不到路径, 就会失败。
- 如果在文档中找到 JSON 路径, 并且要求对期望值进行验证, 那么它将执行验证操作。
添加方式: 测试计划 --> 线程组--> HTTP请求 --> (右键添加) 断言 --> JSON 断言
参数详解:
- Assert JSON Path exists:用于断言的 JSON 元素的路径。
- Additionally assert value:如果您想要用某个值生成断言,请选择复选框。
- Match as regular expression:如果需要使用正则表达式,请选择复选框。
- Expected Value:期望值,用于断言的值或用于匹配的正则表达式的值。
- Expect null:如果希望为空,请选择复选框。
- Invert assertion (will fail if above conditions met):反转断言(如果满足以上条件则失败)。
JsonPath 语法参考文档:https://github.com/json-path/JsonPath
Duration Assertion(持续时间断言)
Duration Assertion 可以检查 HTTP 请求返回所需的时间,大于配置值的请求会被标记为失败。
配置项介绍
- 这个断言的主要配置项为 Duration in milliseconds,用于配置请求失败时间。
- Apply to 选项可以保留默认值。如果有特殊需要,可以根据文档说明配置。
监听器(Listener)
Listener 译为监听器,一般用于对测试结果进行统计。Jmeter 提供的监听器绝大部分监听器是用于性能统计的:
- 能够获取请求/响应详细信息的只有 View Results Tree。
- 统计类型的监听器最常使用的是 Aggregate Graph(比 Aggregate Report 和 Summary Report 多了图表展示)。
监听器会监听同级或下级目录中的 Sampler,例如:
- 监听器在根目录时,监听全部 Sampler。
- 监听器在线程组根目录时,监听线程组全部 Sampler。
- 监听器在某个 Sampler 上,仅监听这个 Sampler。
View Results Tree、Aggregate Graph 这两个监听器几乎在每个 Jmeter 测试中都会用到。
View Results Tree
用于监听 Sampler 的详细信息。这个 Listener 常用于 debug,实际进行性能或负载测试时一般会关闭这个监听器或选择仅监听失败的 Sampler。
这里绿色的就说明请求是通过的,返回值是 200,如果出现红色的 × 就说明请求失败,这时候可以通过右边的取样器结果和响应数据来查看结果。
配置项说明
FileName:选项配置后,可以把请求存储到一个文件中。
Log / Display only:选项可以过滤成功或失败的请求。
左下方会列出执行的 samplers,选中 samplers,右下方会列出 Sampler 这次执行的详细信息。以 Http Sampler 为例:
- Request:页签内会显示请求的具体信息,包括请求类型、URL、data 和全部 headers。
- Sampler Result:页签内会显示请求开始是时间,加载时间等以及 Http 请求的一些信息。如 header、response code 等。
- Thread Name:线程组名称
- Sample Start: 启动开始时间
- Load time:加载时长
- Latency:等待时长
- Size in bytes:发送的数据总大小
- Headers size in bytes:发送数据的其余部分大小
- Sample Count:发送统计
- Error Count:交互错误统计
- Response code:返回码
- Response message:返回信息
- Response headers:返回的头部信息
Aggregate Report
Aggregate Report 用于监听 Sampler 响应,并针对 Sampler 的性能结果进行汇总统计,统计内容包括:
- 每个 Sampler 执行的次数,以及全部 Sampler 执行的次数。
- 每个 Sampler 以及全部 Sampler 的最大/最小/平均/90% 的响应时间、失败率、吞吐量。
重点关心的性能指标:
- 响应时间:观察当前的最大最小值的波动范围。
- 如果波动范围不大,以平均响应时间作为最终的性能响应时间结果。
- 如果波动范围很大,以 90%(经验)的响应时间作为最终性能响应时间结果。
- 错误率:事务的失败率。
- 吞吐量:
- 吞吐量以“requests/second、requests/minute、 requests/hour”来衡量。当时间单位已经被选取为 second,所以显示速率至少是 1.0,即每秒 1 个请求。
- 当吞吐量被保存到 CSV 文件时,采用的是 requests/minute,所以 30.0 requests/second 在 CSV 中被保存为 0.5。
例:200 个用户在 10 秒中同时访问百度的页面,平均响应时间是 85 毫秒,最大的响应时间 841 毫秒,最小的响应时间是 37 毫秒,错误率为 0%,说明百度网页的性能还是不错的,每个页面都能很快的得到响应,不用 1 秒钟。
控制器(Controller)
控制器用于在线程组内通过 Sampler 实现各种测试逻辑,可以定义 Sampler 执行的条件,可以让 Sampler 循环执行等。
- 使用 Jmeter 提供的线程组、控制器、Sampler,可以在线程内实现包含测试逻辑的用例。
- 常用控制器包括 Simple Controller、 If Controller、Loop Controller 等。
If Controller
If Controller 的作用类似于各种计算机语言中的 if 语句,条件为真时执行下属的 Sampler。
示例:使用“用户定义的变量”定义一个变量 name,name 的值可以是‘baidu’或‘itcast’,根据 name 的变量值实现对应网站的访问。
第一种配置方法:
第二种配置方法:
勾选上“Interpret Condition as Variable Expression”,判断条件需用使用 jexl3 函数。(使用这个函数来进行判定时,Jmeter 自身的执行效果要高一些)。
注意:当勾选“interpret condition as variable expression”时,这时 conditon 中不能直接填写条件表达式,而需要借助函数将条件表达式计算为 true/false,可以借助的函数有 _jexl2、jexl3、_groovy,例如直接填写 ${modelId}==5 时是不能识别的。
Loop Controller
- Loop Controller 循环执行下属的 Sampler,循环次数可以配置为整数常量,也可以配置为变量。
- 图例中的 Loop Controller 实现了用户登录后,浏览了 4 次鱼相关的内容。
- 若当前线程组的线程数为 2、loop count为 3,而 loop controller 设置为 4,则每个线程的运行次数为 3*4 = 12。
思考:线程组属性可以控制循环次数, 那么循环控制器有什么用?
答:线程组属性控制组内所有取样器的执行次数,而循环控制器可以控制组内部分取样器的循环次数,后者控制精度更高。
ForEach 控制器
ForEach 控制器一般和用户自定义变量或者正则表达式提取器一起使用,其在用户自定义变量或者从正则表达式提取器的返回结果中读取一系列相关的变量。 该控制器下的取样器都会被执行一次或多次, 每次读取不同的变量值。
示例 1:与用户定义的变量配合使用
示例 2:与正则表达式配合使用
接着在 ForEach 控制器下添加一个 HTTP 请求,引用 ForEach 控制器中定义的变量 ${word},作为参数。
Transaction Controller(事务控制器)
事务控制器会额外产生一个采样器,用来统计该控制器下所有子节点的耗时。
事务控制器用于将 Test Plan 中的特定部分组织成一个事务。JMeter 中 Transaction 的作用在于,可以针对 Transaction 统计其响应时间、吞吐量等。比如说,一个用户操作可能需要多个 Sampler 来模拟,此时使用Transaction Controller 则可以更准确地得到该用户操作的性能指标,如响应时间等。这个时间包含了该控制器范围内的所有组件的处理时间,而不仅仅是采样器的。
如果事务控制器下的取样器有多个,只有当所有的取样器都运行成功,整个事务控制器定义的事物才算成功。
参数说明:
- Name:名称。
- Comments:注释。
- generate parent sample:选择是否生成一个父取样器。(选中这个参数结果展示如下图红框,否则显示为下图蓝框)
- include duration of timer and pre-post processors in generated samle:是否包含定时器,选择将在取样器前与后加上延时。(建议不勾选,否则统计就比较麻烦了,还需要扣除延时)
Simple Controller
- Simple Controller 常用于打包一组 Sampler,这样可以让线程组看起来更简洁、直观。
- Simple Controller 打包的一组 Sampler 可以在 Module Controller 中使用。
Module Controller
- 先将测试逻辑模块化,再指定模块进行执行,方便调试。
定时器(Timer)
同步定时器(Synchronizing Timer)[集合点]
提示:在 Jmeter 中叫做同步定时器, 在其他软件中又叫集合点。
思考:
- 如何模拟多个用户同时抢一个红包?
- 如何测试电商网站中的抢购活动、秒杀活动?
介绍
SyncTimer 的目的是阻塞线程,直到阻塞了 n 个线程, 然后立即释放它们。
同步定时器相当于一个储蓄池,累积一定的请求,当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起并发,所以可以用来做大数据量的绝对并发请求。
添加方式:测试计划 --> 线程组 --> HTTP请求 -->(右键添加)定时器 --> Synchronizing Timer
操作示例
- 添加线程组,设置线程数=100
- 添加 HTTP 请求
- 添加同步定时器
- 添加查看结果树
- 添加监听器-聚合报告
注意事项:当用户数不能整除集合点组件的一组用户数属性时,如果超时时间是 0,会导致程序挂起,那么该怎么避免挂起?
实现:
- 方案 1:点击 stop 强行终止。(不建议)
- 方案 2:修改一组用户数,能够做到整除。(治标不治本)
- 方案 3:修改超时时间,不设置为 0,即便一组用户数填充不满,只要超时,也会执行。(建议)
constant timer(常量定时器)
固定延迟几秒。
常数吞吐定时器(Constant Throughput Timer)
常数吞吐量定时器可以让 JMeter 以指定数字的吞吐量(以每分钟的样本数为单位,而不是每秒)执行。吞吐量计算的范围可以为指定为当前线程、当前线程组、所有线程组。
注意:常数吞吐量定时器只是帮忙达到性能测试的负载(压力)要求,本身不代表性能有 bug 还是无 bug,对于 bug 的分析需要通过响应时间来判断。
案例
一个用户以 20 QPS (20 次/s) 的频率访问百度首页,持续一段时间,统计运行情况。
操作步骤:
- 添加线程组, 循环次数设置成永远
- 添加 HTTP 请求
- 添加常数吞吐定时器
- 添加查看结果树
- 添加监听器-聚合报告
查看聚合报告的 Throughput 字段, 实际值围绕设置的 QPS 值上下波动。
throughput shaping timer
设定在某一个时间段内,最多发起多少请求,以控制服务端的 TPS。
关联
当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理。JMeter 可以通过“后置处理器”中的一些组件来处理关联。
常用的关联方法:
- 正则提取器
- XPath 提取器
- JSON 提取器
- 跨线程组关联
正则提取器(Regular Expression Extractor)
作用:例如把登录响应报文中的 token 取出来,存到一个 Jmeter 变量中,用在其他接口的请求参数。
使用步骤 1:在结果树中测试正则表达式
步骤 2:在采样器下新建正则提取器,匹配响应数据中的正则表达式(注意:引号需要转义)
HTTP Request 右键 --> Add --> Post Processors --> Regular Expression Extractor
参数介绍:
- Name(引用名称):下一个请求要引用的参数名称,如填写 title,则后续元件可用 ${title} 引用该提取出来的值。
- Regular Expression(正则表达式)
- ():括起来的部分就是要提取的。
- .:匹配任何字符串。
- +:一次或多次。
- ?:零或一次;非贪婪模式,在找到第一个匹配项后停止。
- 模板:用$$引用起来, 如果在正则表达式中有多个正则表达式, 则可以是 $2$$3$ 等等, 表示解析到的第几个值给 title。如 $1$ 表示解析到的第 1 个值。
- 匹配数字:0 代表随机取值;-1 代表全部取值;1 代表取第一个值。
- 缺省值:如果参数没有取得到值, 那默认给一个值让它取。
步骤 3:添加 Debug Post Processor,查看调试过程中的全部变量
HTTP Request 右键-->Add-->Post Processors-->Debug Post Processor
XPath 提取器
添加方式:测试计划 --> 线程组 --> HTTP请求 -->(右键添加)后置处理器 --> XPath 提取器
参数介绍:
- Use Tidy(tolerantparser):如果勾选此项,则使用 Tidy 将 HTML 响应解析为 XHTML。当需要处理的页面是 HTML 格式时,必须选中该选项,当需要处理的页面是 XML 或 XHTML 格式(例如 RSS 返回)时,取消选中该选项。
- 引用名称:存放提取出的值的参数。
- XPath Query:用于提取值的 XPath 表达式。
- 匹配数字:如果 XPath 路径查询导致许多结果,则可以选择提取哪个作为变量。
- 0:表示随机。
- -1:表示提取所有结果(默认值),它们将被命名为<变量名>_N(其中 N 从 1 到结果的个数)。
- X:表示提取第 X 个结果。如果这个 X 大于匹配项的数量,则不返回任何内容,将使用默认值。
- 缺省值:参数的默认值。
JSON 提取器
添加方式:测试计划 --> 线程组 --> HTTP请求 -->(右键添加)后置处理器 --> JSON 提取器
- Names of created variables:存放提取出的值的参数。
- JSON Path Expressions:JSON 路径表达式。
跨线程组关联
当有依赖关系的两个请求(一个请求的入参是另一个请求返回的数据),放入到不同的线程组中时,就不能使用提取器保存的变量来传递参数值,而是要使用 Jmeter 属性来传递。
Jmeter 属性的配置方法可以用函数实现:
- __setProperty 函数: 将值保存成 Jmeter 属性
- __property 函数: 在其他线程组中使用 property 函数读取属性
备注:setProperty 函数需要通过 BeanShell 取样器来执行(BeanShell 取样器作用: 执行函数和脚本)
操作步骤示例:
- 添加线程组 1
- 添加HTTP请求-天气
- 添加 JSON 提取器
- 添加 BeanShell 取样器(将JSON提取器提取的值保存为 Jmeter 属性)
- 添加线程组 2
- 添加 HTTP 请求-百度(读取 Jmeter 属性)
- 添加查看结果树
在 Config Element 下 添加 Counter,其配置页面及参数含义:
- start value:起始值。
- increment:递增值。
- maximum value:最大值,若达到了则会从 start value 重新开始取数。
- Number format:数字格式(默认整数)。
- exported variable name:生成的数据所用变量名。
- track count independently for each user:每个线程的 Counter 是否相互独立,互不影响。
- 勾上:开启2个线程示例:线程1取1,线程2取1,线程1取2,线程2取2...
- 不勾:开启2个线程示例:线程1取1,线程2取2,线程1取3,线程2取4...
- reset counter on each thread group iteration:勾上则变量的值不会变化。(一般不用)
可编程 Sampler
Jmeter 支持可编程 Sampler,系统内部预置了一些常用的变量。通过使用可编程 Sampler 结合之前介绍的变量、逻辑控制器、http Sampler 等,Jmeter 基本上可以完成任何 B/S 性能、压力测试任务。
Jmeter 中的支持编程的 Sampler 有 Bean Shell Sampler、BSF Sampler 和 JSR223 Sampler。
- Bean Shell Sampler:Jmeter 最早支持的可编程采样器,支持标准 Java 语句和表达式,另外包括一些脚本命令和语法。
- BSF:继 Bean Shell 后支持的可编程采样器,支持 JavaScript、 Groovy 等多种语言。
- JSR223:继 BSF 后支持的可编程采样器,支持 JavaScript、 Groovy 等多种语言。
一般情况下我们采用 JSR223 Sampler,语言我们一般选择 JavaScrip 和 Groovy。
- JavaScript:当前 B/S 开发必然会使用到语言,学习资料非常多,而且遇到问题可以找前端开发帮忙解决,比较方便。
- Groovy:完全兼容 java,有时可以用 JSR223 代替编写 Java 插件使用。
预置变量
Jmeter 的三种可编程 Sampler 都支持几个预置变量,常用的变量有 vars、 log 和 SamplerResult。
vars
- vars 用于存、取线程组内部共享变量。
- vars 支持持 put 和 get 方法,在所支持的任何语言使用方式都相同。
- vars.put("key", "value") 定义一个变量,定义后可以通过 ${key} 和 vars.get("key") 获取 "value"(注意,vars.put 的数据仅支持字符串类型)。
log
用于在脚本中记录日志。可以使用的方法有:
- log.info("message")
- log.error("message")
SamplerResult
用于设置 Sampler 的结果。
setSuccessful(boolean success) 设置为 true 时,Sampler 的结果为成功;false 时为失败。