文章目录
- 概述
- 从0创建一个测试场景
- 线程组
- 配置元件
- CSV Data Set Config
- HTTP信息头管理器
- HTTP Cookie管理器
- HTTP请求默认值
- 逻辑控制器
- 简单控制器
- IF控制器
- 循环控制器
- while控制器
- 取样器
- HTTP取样
- 前置/后置处理器
- BeanShell处理器
- JSR223处理器
- 监听器
- 查看结果树
- 聚合报告
- 汇总报告
概述
有的时候, 我们通常是想知道自己开发的系统能够支持多少访问量, 请求的响应时间以及系统资源占用情况等; 这时候通常需要对系统进行压力测试, 而JMeter就是一个比较全能且免费开源的压力测试工具; 通过合理的设置测试场景, 可以很好的获取到当前系统的压力测试指标;
常见的压力测试指标有:
- 响应时间(Response Time):指从发送请求到接收到响应的总时间。响应时间是评估系统性能的重要指标之一,通常以平均响应时间、最大响应时间和百分位数(例如 90th 百分位)来衡量。
- 吞吐量(Throughput):指单位时间内处理的请求数量。吞吐量是评估系统处理能力的指标,通常以每秒完成的请求数(Requests per Second,RPS)或每分钟完成的请求数(Requests per Minute,RPM)来表示。
- 并发用户数(Concurrent Users):指同时发送请求到系统的用户数量。并发用户数是评估系统负载能力的重要指标之一,它可以帮助确定系统在同时处理多少个请求时仍能保持良好的性能。
- 错误率(Error Rate):指在测试期间发生的错误请求的比率。错误率是评估系统稳定性和可靠性的指标之一,通常以百分比表示。
- 资源利用率(Resource Utilization):指系统在压力测试期间所使用的硬件资源(如 CPU、内存、磁盘、网络带宽)的利用率。资源利用率是评估系统负载情况和性能瓶颈的重要指标之一。
- 系统响应成功率(Success Rate):指成功处理请求的比率。成功率是评估系统性能和可靠性的关键指标之一,通常以百分比表示。
- 性能指标阈值(Performance Thresholds):指预先定义的性能指标的阈值。通过将实际性能与预期性能进行比较,可以确定系统是否满足了性能要求。
从0创建一个测试场景
一个完整的测试场景的构建, 基本包括右图的这些元素:
- 最基本的测试单元是线程组, 线程组作为其他元件的承载对象;
- 可以配置公共的http管理头, 域名, cookie等; 配置后后续请求不填写这些项则表示使用公共配置;
- 逻辑控制器: 逻辑控制器可以配置操作之间的逻辑关系;
- 取样器: 真实业务请求, 包括http请求等;
- 前置/后置处理器: 取样器执行前后的额外操作, 可用于数据组装, 断言等, 可调用外置脚本;
- 断言: 断言结果;
- 监听器: 监听器用于汇总测试结果, 显示测试指标等;
- 用户变量: 自定义变量
界面示意
线程组
线程组配置界面如右图, 配置说明如下:
- 在取样器错误后要执行的动作:
- 继续: 表示继续执行后去操作;
- 启动下一进程循环: 退出当前循环, 开始执行下一次;
- 停止线程: 停止当前线程, 不影响并行的其他线程;
- 停止测试: 整成流程退出当前的测试, 包括其他正常的并行线程;
- 立即停止测试: 直接退出, 强制中断所有线程;
- 线程数: 指并行的线程数
线程组
- Ramp-Up时间: 爬坡时间(单位:秒), 比如如果线程数设置为100, 爬坡时间设置为10秒, 那么这100个线程会在10秒内启动起来
- 循环次数: 表示当前线程组要循环执行多少次;
- Same user on each iteration: 是否在每次迭代中保持相同的用户。当这个选项被勾选时,JMeter 会在每次迭代中重用相同的用户,这意味着每个线程(用户)的行为会在每次迭代中保持一致。
- 延迟创建线程直到需要: 是否延迟创建线程直到需要的时候。如果选中了这个选项,那么 JMeter 将不会在测试开始时立即创建所有的线程,而是在测试运行过程中根据需要动态地创建线程。
- 调度器: 用于设置调度规则, 通常使用于无限循环, 通过调度器来控制用例时长;
- 持续时间(秒): 线程组执行总时长
- 启动延迟(秒): 延迟时间; 如果您在线程组级别设置了启动延迟,那么整个线程组中的所有线程都会在指定的延迟时间后开始执行。这意味着所有线程将在相同的时间点后启动,延迟时间是相对于测试计划开始执行的时间。
配置元件
jmeter的配置元件可以为线程组配置一些额外的附加属性, 当然也可以放在其他控制器, 采样器里面; 它会影响到在流程上位于其后的组件部分;
CSV Data Set Config
配置csv外部数据的解析格式, 变量名等信息; 和外部数据做映射
HTTP信息头管理器
管理http的header信息, 可以附加自定义的消息头
HTTP Cookie管理器
管理http的cookie信息, 一般保持默认配置即可, 可以保证当前线程中的cookie共享;
每次反复清除Cookie: 勾选后, 每次循环都会清理cookie恢复初始状态;
同时可以自定义一些Cookie信息到请求之中;
HTTP请求默认值
可以定义请求的基础信息, 让后续请求共用, 包括: 协议, 服务器或IP, 端口号, 请求路径
, 一般情况下会共用协议, 域名和端口号
逻辑控制器
控制器的目的是在复杂场景下, 控制各流程的执行顺序; 如果在流程控制器之外放置取样器, 各取样器会并发执行, 无法控制请求顺序;
简单控制器
正如其名, 无任何其他功能, 仅控制执行顺序;
IF控制器
条件控制器, 类似代码中的if分支
循环控制器
循环控制器, 类似代码中的for
while控制器
循环控制器, 类似代码中的while
while控制器有一个Condition参数, 用于控制循环什么时候结束, 目前实践中是通过读取变量判断值来实现的, 比如:
${__javaScript("${resp_status}" === "pending")}
该表达式表示变量 resp_status
等于 pending
则条件成立;
取样器
取样器是真实的业务调用, 目前主要接触的HTTP取样;
HTTP取样
HTTP请求里面基本没有什么特殊的配置项, 和正常的http请求术语基本都保持一致; 只要能用postman这样的工具, 基本使用都没有什么问题;
前置/后置处理器
相当于就是在执行前后增加了拦截器, 可以存在多个, 拦截顺序同排版顺序;
BeanShell处理器
BeanShell 处理器是 JMeter 中的一种元件,用于执行 BeanShell 脚本。BeanShell 是一种基于 Java 的脚本语言,它支持 Java 的语法和大部分特性,并且具有更灵活的语法和动态性。以下是关于 BeanShell 处理器的一些重要信息:
- 执行脚本: BeanShell 处理器允许您在测试计划中执行 BeanShell 脚本。您可以编写 BeanShell 脚本来实现自定义的逻辑、处理数据、模拟用户行为等。
- 灵活性: BeanShell 脚本语言允许您在脚本中使用 Java 的语法和大部分特性,同时还支持一些额外的特性,例如动态类型、脚本化操作等。这使得 BeanShell 处理器成为 JMeter 中非常灵活和强大的元件之一。
- 嵌入性: BeanShell 处理器可以放置在测试计划的任何位置,并在测试执行期间根据配置执行相应的 BeanShell 脚本。您可以将其放置在线程组、事务控制器、采样器等元件中,根据需要执行相应的逻辑。
- 性能影响: 与 JSR223 处理器相比,BeanShell 处理器执行 BeanShell 脚本的性能可能稍逊一筹。因此,在性能测试中使用 BeanShell 处理器时,需要注意脚本的执行效率,并进行必要的优化以减少性能影响。
总之,BeanShell 处理器为 JMeter 用户提供了执行自定义 BeanShell 脚本的功能,具有灵活性和强大的定制化能力。在使用时需要注意性能影响,并根据具体需求编写高效的脚本代码。
JSR223处理器
JSR223 处理器是 JMeter 中的一种元件,用于执行脚本代码。它允许您在测试计划中使用多种脚本语言(如 Groovy、JavaScript、Python、Ruby 等)来编写自定义的逻辑、处理数据或执行其他操作。下面是关于 JSR223 处理器的一些重要信息:
- 支持的脚本语言: JSR223 处理器支持多种脚本语言,包括 Groovy、JavaScript、Python、Ruby 等。您可以在处理器的配置中选择所需的脚本语言,并在脚本中编写对应语言的代码。
- 执行时机: JSR223 处理器可以放置在测试计划的任何位置,并在测试执行期间根据配置执行相应的脚本代码。您可以将其放置在线程组、事务控制器、采样器等元件中,根据需要执行相应的逻辑。
- 灵活性: 使用 JSR223 处理器,您可以编写高度定制化的逻辑,包括处理响应数据、生成动态参数、执行自定义计算等。这使得 JSR223 处理器成为 JMeter 中非常强大和灵活的元件之一。
- 性能影响: 由于 JSR223 处理器会动态地执行脚本代码,因此在性能测试中过度使用 JSR223 处理器可能会对测试性能产生负面影响。因此,建议在使用 JSR223 处理器时谨慎考虑其性能影响,并优化脚本以提高执行效率。
总之,JSR223 处理器为 JMeter 用户提供了执行自定义脚本代码的灵活性和功能性,但在使用时需要注意性能影响,并根据具体需求选择合适的脚本语言和编写高效的脚本代码。