Apache JMeter 性能测试完整教程
Head First 风格 | 从零基础到压测高手
想象你开了一家火爆的餐厅------如果同时涌入 1000 个顾客,你的厨房还能hold住吗?JMeter 就是那个帮你"模拟千军万马"的超级工具!
目录
- [第1章 JMeter 简介](#第1章 JMeter 简介)
- [第2章 安装与环境配置](#第2章 安装与环境配置)
- [第3章 核心概念与术语](#第3章 核心概念与术语)
- [第4章 JMeter 元件详解](#第4章 JMeter 元件详解)
- [第5章 脚本编写实战](#第5章 脚本编写实战)
- [第6章 完整电商系统压测Demo](#第6章 完整电商系统压测Demo)
- [第7章 JMeter 分布式压测](#第7章 JMeter 分布式压测)
- [第8章 常用插件介绍](#第8章 常用插件介绍)
- [第9章 命令行执行与CI/CD集成](#第9章 命令行执行与CI/CD集成)
- [第10章 最佳实践与常见问题](#第10章 最佳实践与常见问题)
第1章 JMeter 简介
1.1 JMeter 是什么?
一句话定义:Apache JMeter 是一个开源的、100% 纯 Java 编写的性能测试工具,最初设计用于 Web 应用测试,但现在已经扩展到支持几乎任何类型的测试。
🍽️ 餐厅比喻
把你的系统想象成一家餐厅:
| 餐厅概念 | JMeter 概念 | 说明 |
|---|---|---|
| 餐厅老板 | 测试工程师 | 你,负责设计测试方案 |
| 顾客 | 虚拟用户(Thread) | 模拟真实用户访问系统 |
| 点菜单 | 测试脚本(Test Plan) | 定义顾客要做什么 |
| 服务员 | 采样器(Sampler) | 负责发送请求 |
| 收银台 | 监听器(Listener) | 记录每次交易的结果 |
| 厨房调度 | 逻辑控制器(Logic Controller) | 控制请求的执行顺序 |
| 等候区 | 定时器(Timer) | 控制顾客进店的节奏 |
| 顾客满意度检查 | 断言(Assertion) | 检查返回结果是否符合预期 |
想象一下:
你开了一家网红餐厅,想知道"如果同时来 500 个顾客,
厨房会不会崩溃?服务员会不会疯掉?上菜要等多久?"
JMeter 就是你的"虚拟顾客生成器"------
它可以模拟 500 个顾客同时点菜、同时催菜、同时结账,
然后告诉你餐厅在哪里出了问题。
JMeter 的前世今生
#mermaid-svg-0WVPesOt5QXasvdo{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0WVPesOt5QXasvdo .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0WVPesOt5QXasvdo .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0WVPesOt5QXasvdo .error-icon{fill:#552222;}#mermaid-svg-0WVPesOt5QXasvdo .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0WVPesOt5QXasvdo .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0WVPesOt5QXasvdo .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0WVPesOt5QXasvdo .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0WVPesOt5QXasvdo .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0WVPesOt5QXasvdo .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0WVPesOt5QXasvdo .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0WVPesOt5QXasvdo .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0WVPesOt5QXasvdo .marker.cross{stroke:#333333;}#mermaid-svg-0WVPesOt5QXasvdo svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0WVPesOt5QXasvdo p{margin:0;}#mermaid-svg-0WVPesOt5QXasvdo .edge{stroke-width:3;}#mermaid-svg-0WVPesOt5QXasvdo .section--1 rect,#mermaid-svg-0WVPesOt5QXasvdo .section--1 path,#mermaid-svg-0WVPesOt5QXasvdo .section--1 circle,#mermaid-svg-0WVPesOt5QXasvdo .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .section--1 text{fill:#ffffff;}#mermaid-svg-0WVPesOt5QXasvdo .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-0WVPesOt5QXasvdo .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .edge-depth--1{stroke-width:17;}#mermaid-svg-0WVPesOt5QXasvdo .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-0WVPesOt5QXasvdo .lineWrapper line{stroke:#ffffff;}#mermaid-svg-0WVPesOt5QXasvdo .disabled,#mermaid-svg-0WVPesOt5QXasvdo .disabled circle,#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:lightgray;}#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:#efefef;}#mermaid-svg-0WVPesOt5QXasvdo .section-0 rect,#mermaid-svg-0WVPesOt5QXasvdo .section-0 path,#mermaid-svg-0WVPesOt5QXasvdo .section-0 circle,#mermaid-svg-0WVPesOt5QXasvdo .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-0WVPesOt5QXasvdo .section-0 text{fill:black;}#mermaid-svg-0WVPesOt5QXasvdo .node-icon-0{font-size:40px;color:black;}#mermaid-svg-0WVPesOt5QXasvdo .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-0WVPesOt5QXasvdo .edge-depth-0{stroke-width:14;}#mermaid-svg-0WVPesOt5QXasvdo .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-0WVPesOt5QXasvdo .lineWrapper line{stroke:black;}#mermaid-svg-0WVPesOt5QXasvdo .disabled,#mermaid-svg-0WVPesOt5QXasvdo .disabled circle,#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:lightgray;}#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:#efefef;}#mermaid-svg-0WVPesOt5QXasvdo .section-1 rect,#mermaid-svg-0WVPesOt5QXasvdo .section-1 path,#mermaid-svg-0WVPesOt5QXasvdo .section-1 circle,#mermaid-svg-0WVPesOt5QXasvdo .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .section-1 text{fill:black;}#mermaid-svg-0WVPesOt5QXasvdo .node-icon-1{font-size:40px;color:black;}#mermaid-svg-0WVPesOt5QXasvdo .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .edge-depth-1{stroke-width:11;}#mermaid-svg-0WVPesOt5QXasvdo .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-0WVPesOt5QXasvdo .lineWrapper line{stroke:black;}#mermaid-svg-0WVPesOt5QXasvdo .disabled,#mermaid-svg-0WVPesOt5QXasvdo .disabled circle,#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:lightgray;}#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:#efefef;}#mermaid-svg-0WVPesOt5QXasvdo .section-2 rect,#mermaid-svg-0WVPesOt5QXasvdo .section-2 path,#mermaid-svg-0WVPesOt5QXasvdo .section-2 circle,#mermaid-svg-0WVPesOt5QXasvdo .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .section-2 text{fill:#ffffff;}#mermaid-svg-0WVPesOt5QXasvdo .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-0WVPesOt5QXasvdo .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .edge-depth-2{stroke-width:8;}#mermaid-svg-0WVPesOt5QXasvdo .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-0WVPesOt5QXasvdo .lineWrapper line{stroke:#ffffff;}#mermaid-svg-0WVPesOt5QXasvdo .disabled,#mermaid-svg-0WVPesOt5QXasvdo .disabled circle,#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:lightgray;}#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:#efefef;}#mermaid-svg-0WVPesOt5QXasvdo .section-3 rect,#mermaid-svg-0WVPesOt5QXasvdo .section-3 path,#mermaid-svg-0WVPesOt5QXasvdo .section-3 circle,#mermaid-svg-0WVPesOt5QXasvdo .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .section-3 text{fill:black;}#mermaid-svg-0WVPesOt5QXasvdo .node-icon-3{font-size:40px;color:black;}#mermaid-svg-0WVPesOt5QXasvdo .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .edge-depth-3{stroke-width:5;}#mermaid-svg-0WVPesOt5QXasvdo .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-0WVPesOt5QXasvdo .lineWrapper line{stroke:black;}#mermaid-svg-0WVPesOt5QXasvdo .disabled,#mermaid-svg-0WVPesOt5QXasvdo .disabled circle,#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:lightgray;}#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:#efefef;}#mermaid-svg-0WVPesOt5QXasvdo .section-4 rect,#mermaid-svg-0WVPesOt5QXasvdo .section-4 path,#mermaid-svg-0WVPesOt5QXasvdo .section-4 circle,#mermaid-svg-0WVPesOt5QXasvdo .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .section-4 text{fill:black;}#mermaid-svg-0WVPesOt5QXasvdo .node-icon-4{font-size:40px;color:black;}#mermaid-svg-0WVPesOt5QXasvdo .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .edge-depth-4{stroke-width:2;}#mermaid-svg-0WVPesOt5QXasvdo .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-0WVPesOt5QXasvdo .lineWrapper line{stroke:black;}#mermaid-svg-0WVPesOt5QXasvdo .disabled,#mermaid-svg-0WVPesOt5QXasvdo .disabled circle,#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:lightgray;}#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:#efefef;}#mermaid-svg-0WVPesOt5QXasvdo .section-5 rect,#mermaid-svg-0WVPesOt5QXasvdo .section-5 path,#mermaid-svg-0WVPesOt5QXasvdo .section-5 circle,#mermaid-svg-0WVPesOt5QXasvdo .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .section-5 text{fill:black;}#mermaid-svg-0WVPesOt5QXasvdo .node-icon-5{font-size:40px;color:black;}#mermaid-svg-0WVPesOt5QXasvdo .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .edge-depth-5{stroke-width:-1;}#mermaid-svg-0WVPesOt5QXasvdo .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-0WVPesOt5QXasvdo .lineWrapper line{stroke:black;}#mermaid-svg-0WVPesOt5QXasvdo .disabled,#mermaid-svg-0WVPesOt5QXasvdo .disabled circle,#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:lightgray;}#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:#efefef;}#mermaid-svg-0WVPesOt5QXasvdo .section-6 rect,#mermaid-svg-0WVPesOt5QXasvdo .section-6 path,#mermaid-svg-0WVPesOt5QXasvdo .section-6 circle,#mermaid-svg-0WVPesOt5QXasvdo .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .section-6 text{fill:black;}#mermaid-svg-0WVPesOt5QXasvdo .node-icon-6{font-size:40px;color:black;}#mermaid-svg-0WVPesOt5QXasvdo .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .edge-depth-6{stroke-width:-4;}#mermaid-svg-0WVPesOt5QXasvdo .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-0WVPesOt5QXasvdo .lineWrapper line{stroke:black;}#mermaid-svg-0WVPesOt5QXasvdo .disabled,#mermaid-svg-0WVPesOt5QXasvdo .disabled circle,#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:lightgray;}#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:#efefef;}#mermaid-svg-0WVPesOt5QXasvdo .section-7 rect,#mermaid-svg-0WVPesOt5QXasvdo .section-7 path,#mermaid-svg-0WVPesOt5QXasvdo .section-7 circle,#mermaid-svg-0WVPesOt5QXasvdo .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .section-7 text{fill:black;}#mermaid-svg-0WVPesOt5QXasvdo .node-icon-7{font-size:40px;color:black;}#mermaid-svg-0WVPesOt5QXasvdo .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .edge-depth-7{stroke-width:-7;}#mermaid-svg-0WVPesOt5QXasvdo .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-0WVPesOt5QXasvdo .lineWrapper line{stroke:black;}#mermaid-svg-0WVPesOt5QXasvdo .disabled,#mermaid-svg-0WVPesOt5QXasvdo .disabled circle,#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:lightgray;}#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:#efefef;}#mermaid-svg-0WVPesOt5QXasvdo .section-8 rect,#mermaid-svg-0WVPesOt5QXasvdo .section-8 path,#mermaid-svg-0WVPesOt5QXasvdo .section-8 circle,#mermaid-svg-0WVPesOt5QXasvdo .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .section-8 text{fill:black;}#mermaid-svg-0WVPesOt5QXasvdo .node-icon-8{font-size:40px;color:black;}#mermaid-svg-0WVPesOt5QXasvdo .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .edge-depth-8{stroke-width:-10;}#mermaid-svg-0WVPesOt5QXasvdo .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-0WVPesOt5QXasvdo .lineWrapper line{stroke:black;}#mermaid-svg-0WVPesOt5QXasvdo .disabled,#mermaid-svg-0WVPesOt5QXasvdo .disabled circle,#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:lightgray;}#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:#efefef;}#mermaid-svg-0WVPesOt5QXasvdo .section-9 rect,#mermaid-svg-0WVPesOt5QXasvdo .section-9 path,#mermaid-svg-0WVPesOt5QXasvdo .section-9 circle,#mermaid-svg-0WVPesOt5QXasvdo .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .section-9 text{fill:black;}#mermaid-svg-0WVPesOt5QXasvdo .node-icon-9{font-size:40px;color:black;}#mermaid-svg-0WVPesOt5QXasvdo .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .edge-depth-9{stroke-width:-13;}#mermaid-svg-0WVPesOt5QXasvdo .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-0WVPesOt5QXasvdo .lineWrapper line{stroke:black;}#mermaid-svg-0WVPesOt5QXasvdo .disabled,#mermaid-svg-0WVPesOt5QXasvdo .disabled circle,#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:lightgray;}#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:#efefef;}#mermaid-svg-0WVPesOt5QXasvdo .section-10 rect,#mermaid-svg-0WVPesOt5QXasvdo .section-10 path,#mermaid-svg-0WVPesOt5QXasvdo .section-10 circle,#mermaid-svg-0WVPesOt5QXasvdo .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .section-10 text{fill:black;}#mermaid-svg-0WVPesOt5QXasvdo .node-icon-10{font-size:40px;color:black;}#mermaid-svg-0WVPesOt5QXasvdo .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .edge-depth-10{stroke-width:-16;}#mermaid-svg-0WVPesOt5QXasvdo .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-0WVPesOt5QXasvdo .lineWrapper line{stroke:black;}#mermaid-svg-0WVPesOt5QXasvdo .disabled,#mermaid-svg-0WVPesOt5QXasvdo .disabled circle,#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:lightgray;}#mermaid-svg-0WVPesOt5QXasvdo .disabled text{fill:#efefef;}#mermaid-svg-0WVPesOt5QXasvdo .section-root rect,#mermaid-svg-0WVPesOt5QXasvdo .section-root path,#mermaid-svg-0WVPesOt5QXasvdo .section-root circle{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-0WVPesOt5QXasvdo .section-root text{fill:#ffffff;}#mermaid-svg-0WVPesOt5QXasvdo .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-0WVPesOt5QXasvdo .edge{fill:none;}#mermaid-svg-0WVPesOt5QXasvdo .eventWrapper{filter:brightness(120%);}#mermaid-svg-0WVPesOt5QXasvdo :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1998 Stefano Mazzocchi 创建 JMeter 最初用于测试 Apache JServ 性能 2001 项目移交 Apache 基金会 2011 JMeter 2.4 引入 GUI 改进 2014 JMeter 2.10 支持 WebSocket 2017 JMeter 3.3 支持 Java 9 2020 JMeter 5.3 支持 Java 14+ 2023 JMeter 5.6 支持 Java 17+ 2024 JMeter 5.6.3 最新稳定版 JMeter 发展历程
1.2 为什么选择 JMeter?
核心优势
#mermaid-svg-LKOMKuAnk6eivMIF{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-LKOMKuAnk6eivMIF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LKOMKuAnk6eivMIF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LKOMKuAnk6eivMIF .error-icon{fill:#552222;}#mermaid-svg-LKOMKuAnk6eivMIF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LKOMKuAnk6eivMIF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LKOMKuAnk6eivMIF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LKOMKuAnk6eivMIF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LKOMKuAnk6eivMIF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LKOMKuAnk6eivMIF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LKOMKuAnk6eivMIF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LKOMKuAnk6eivMIF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LKOMKuAnk6eivMIF .marker.cross{stroke:#333333;}#mermaid-svg-LKOMKuAnk6eivMIF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LKOMKuAnk6eivMIF p{margin:0;}#mermaid-svg-LKOMKuAnk6eivMIF .edge{stroke-width:3;}#mermaid-svg-LKOMKuAnk6eivMIF .section--1 rect,#mermaid-svg-LKOMKuAnk6eivMIF .section--1 path,#mermaid-svg-LKOMKuAnk6eivMIF .section--1 circle,#mermaid-svg-LKOMKuAnk6eivMIF .section--1 polygon,#mermaid-svg-LKOMKuAnk6eivMIF .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .section--1 text{fill:#ffffff;}#mermaid-svg-LKOMKuAnk6eivMIF .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-LKOMKuAnk6eivMIF .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .edge-depth--1{stroke-width:17;}#mermaid-svg-LKOMKuAnk6eivMIF .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled,#mermaid-svg-LKOMKuAnk6eivMIF .disabled circle,#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:lightgray;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:#efefef;}#mermaid-svg-LKOMKuAnk6eivMIF .section-0 rect,#mermaid-svg-LKOMKuAnk6eivMIF .section-0 path,#mermaid-svg-LKOMKuAnk6eivMIF .section-0 circle,#mermaid-svg-LKOMKuAnk6eivMIF .section-0 polygon,#mermaid-svg-LKOMKuAnk6eivMIF .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-LKOMKuAnk6eivMIF .section-0 text{fill:black;}#mermaid-svg-LKOMKuAnk6eivMIF .node-icon-0{font-size:40px;color:black;}#mermaid-svg-LKOMKuAnk6eivMIF .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-LKOMKuAnk6eivMIF .edge-depth-0{stroke-width:14;}#mermaid-svg-LKOMKuAnk6eivMIF .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled,#mermaid-svg-LKOMKuAnk6eivMIF .disabled circle,#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:lightgray;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:#efefef;}#mermaid-svg-LKOMKuAnk6eivMIF .section-1 rect,#mermaid-svg-LKOMKuAnk6eivMIF .section-1 path,#mermaid-svg-LKOMKuAnk6eivMIF .section-1 circle,#mermaid-svg-LKOMKuAnk6eivMIF .section-1 polygon,#mermaid-svg-LKOMKuAnk6eivMIF .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .section-1 text{fill:black;}#mermaid-svg-LKOMKuAnk6eivMIF .node-icon-1{font-size:40px;color:black;}#mermaid-svg-LKOMKuAnk6eivMIF .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .edge-depth-1{stroke-width:11;}#mermaid-svg-LKOMKuAnk6eivMIF .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled,#mermaid-svg-LKOMKuAnk6eivMIF .disabled circle,#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:lightgray;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:#efefef;}#mermaid-svg-LKOMKuAnk6eivMIF .section-2 rect,#mermaid-svg-LKOMKuAnk6eivMIF .section-2 path,#mermaid-svg-LKOMKuAnk6eivMIF .section-2 circle,#mermaid-svg-LKOMKuAnk6eivMIF .section-2 polygon,#mermaid-svg-LKOMKuAnk6eivMIF .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .section-2 text{fill:#ffffff;}#mermaid-svg-LKOMKuAnk6eivMIF .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-LKOMKuAnk6eivMIF .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .edge-depth-2{stroke-width:8;}#mermaid-svg-LKOMKuAnk6eivMIF .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled,#mermaid-svg-LKOMKuAnk6eivMIF .disabled circle,#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:lightgray;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:#efefef;}#mermaid-svg-LKOMKuAnk6eivMIF .section-3 rect,#mermaid-svg-LKOMKuAnk6eivMIF .section-3 path,#mermaid-svg-LKOMKuAnk6eivMIF .section-3 circle,#mermaid-svg-LKOMKuAnk6eivMIF .section-3 polygon,#mermaid-svg-LKOMKuAnk6eivMIF .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .section-3 text{fill:black;}#mermaid-svg-LKOMKuAnk6eivMIF .node-icon-3{font-size:40px;color:black;}#mermaid-svg-LKOMKuAnk6eivMIF .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .edge-depth-3{stroke-width:5;}#mermaid-svg-LKOMKuAnk6eivMIF .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled,#mermaid-svg-LKOMKuAnk6eivMIF .disabled circle,#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:lightgray;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:#efefef;}#mermaid-svg-LKOMKuAnk6eivMIF .section-4 rect,#mermaid-svg-LKOMKuAnk6eivMIF .section-4 path,#mermaid-svg-LKOMKuAnk6eivMIF .section-4 circle,#mermaid-svg-LKOMKuAnk6eivMIF .section-4 polygon,#mermaid-svg-LKOMKuAnk6eivMIF .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .section-4 text{fill:black;}#mermaid-svg-LKOMKuAnk6eivMIF .node-icon-4{font-size:40px;color:black;}#mermaid-svg-LKOMKuAnk6eivMIF .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .edge-depth-4{stroke-width:2;}#mermaid-svg-LKOMKuAnk6eivMIF .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled,#mermaid-svg-LKOMKuAnk6eivMIF .disabled circle,#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:lightgray;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:#efefef;}#mermaid-svg-LKOMKuAnk6eivMIF .section-5 rect,#mermaid-svg-LKOMKuAnk6eivMIF .section-5 path,#mermaid-svg-LKOMKuAnk6eivMIF .section-5 circle,#mermaid-svg-LKOMKuAnk6eivMIF .section-5 polygon,#mermaid-svg-LKOMKuAnk6eivMIF .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .section-5 text{fill:black;}#mermaid-svg-LKOMKuAnk6eivMIF .node-icon-5{font-size:40px;color:black;}#mermaid-svg-LKOMKuAnk6eivMIF .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .edge-depth-5{stroke-width:-1;}#mermaid-svg-LKOMKuAnk6eivMIF .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled,#mermaid-svg-LKOMKuAnk6eivMIF .disabled circle,#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:lightgray;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:#efefef;}#mermaid-svg-LKOMKuAnk6eivMIF .section-6 rect,#mermaid-svg-LKOMKuAnk6eivMIF .section-6 path,#mermaid-svg-LKOMKuAnk6eivMIF .section-6 circle,#mermaid-svg-LKOMKuAnk6eivMIF .section-6 polygon,#mermaid-svg-LKOMKuAnk6eivMIF .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .section-6 text{fill:black;}#mermaid-svg-LKOMKuAnk6eivMIF .node-icon-6{font-size:40px;color:black;}#mermaid-svg-LKOMKuAnk6eivMIF .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .edge-depth-6{stroke-width:-4;}#mermaid-svg-LKOMKuAnk6eivMIF .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled,#mermaid-svg-LKOMKuAnk6eivMIF .disabled circle,#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:lightgray;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:#efefef;}#mermaid-svg-LKOMKuAnk6eivMIF .section-7 rect,#mermaid-svg-LKOMKuAnk6eivMIF .section-7 path,#mermaid-svg-LKOMKuAnk6eivMIF .section-7 circle,#mermaid-svg-LKOMKuAnk6eivMIF .section-7 polygon,#mermaid-svg-LKOMKuAnk6eivMIF .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .section-7 text{fill:black;}#mermaid-svg-LKOMKuAnk6eivMIF .node-icon-7{font-size:40px;color:black;}#mermaid-svg-LKOMKuAnk6eivMIF .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .edge-depth-7{stroke-width:-7;}#mermaid-svg-LKOMKuAnk6eivMIF .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled,#mermaid-svg-LKOMKuAnk6eivMIF .disabled circle,#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:lightgray;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:#efefef;}#mermaid-svg-LKOMKuAnk6eivMIF .section-8 rect,#mermaid-svg-LKOMKuAnk6eivMIF .section-8 path,#mermaid-svg-LKOMKuAnk6eivMIF .section-8 circle,#mermaid-svg-LKOMKuAnk6eivMIF .section-8 polygon,#mermaid-svg-LKOMKuAnk6eivMIF .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .section-8 text{fill:black;}#mermaid-svg-LKOMKuAnk6eivMIF .node-icon-8{font-size:40px;color:black;}#mermaid-svg-LKOMKuAnk6eivMIF .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .edge-depth-8{stroke-width:-10;}#mermaid-svg-LKOMKuAnk6eivMIF .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled,#mermaid-svg-LKOMKuAnk6eivMIF .disabled circle,#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:lightgray;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:#efefef;}#mermaid-svg-LKOMKuAnk6eivMIF .section-9 rect,#mermaid-svg-LKOMKuAnk6eivMIF .section-9 path,#mermaid-svg-LKOMKuAnk6eivMIF .section-9 circle,#mermaid-svg-LKOMKuAnk6eivMIF .section-9 polygon,#mermaid-svg-LKOMKuAnk6eivMIF .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .section-9 text{fill:black;}#mermaid-svg-LKOMKuAnk6eivMIF .node-icon-9{font-size:40px;color:black;}#mermaid-svg-LKOMKuAnk6eivMIF .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .edge-depth-9{stroke-width:-13;}#mermaid-svg-LKOMKuAnk6eivMIF .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled,#mermaid-svg-LKOMKuAnk6eivMIF .disabled circle,#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:lightgray;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:#efefef;}#mermaid-svg-LKOMKuAnk6eivMIF .section-10 rect,#mermaid-svg-LKOMKuAnk6eivMIF .section-10 path,#mermaid-svg-LKOMKuAnk6eivMIF .section-10 circle,#mermaid-svg-LKOMKuAnk6eivMIF .section-10 polygon,#mermaid-svg-LKOMKuAnk6eivMIF .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .section-10 text{fill:black;}#mermaid-svg-LKOMKuAnk6eivMIF .node-icon-10{font-size:40px;color:black;}#mermaid-svg-LKOMKuAnk6eivMIF .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .edge-depth-10{stroke-width:-16;}#mermaid-svg-LKOMKuAnk6eivMIF .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled,#mermaid-svg-LKOMKuAnk6eivMIF .disabled circle,#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:lightgray;}#mermaid-svg-LKOMKuAnk6eivMIF .disabled text{fill:#efefef;}#mermaid-svg-LKOMKuAnk6eivMIF .section-root rect,#mermaid-svg-LKOMKuAnk6eivMIF .section-root path,#mermaid-svg-LKOMKuAnk6eivMIF .section-root circle,#mermaid-svg-LKOMKuAnk6eivMIF .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-LKOMKuAnk6eivMIF .section-root text{fill:#ffffff;}#mermaid-svg-LKOMKuAnk6eivMIF .section-root span{color:#ffffff;}#mermaid-svg-LKOMKuAnk6eivMIF .section-2 span{color:#ffffff;}#mermaid-svg-LKOMKuAnk6eivMIF .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-LKOMKuAnk6eivMIF .edge{fill:none;}#mermaid-svg-LKOMKuAnk6eivMIF .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-LKOMKuAnk6eivMIF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} JMeter 核心优势
开源免费
Apache 2.0 协议
社区活跃
插件生态丰富
功能强大
多协议支持
分布式测试
脚本可编程
易于使用
GUI 界面友好
录制回放
学习曲线平缓
平台无关
纯 Java 编写
Windows/Mac/Linux
跨平台一致体验
可扩展
自定义 Sampler
自定义插件
JSR223 脚本
详细对比:JMeter vs 其他性能测试工具
| 特性 | JMeter | LoadRunner | Gatling | Locust | k6 |
|---|---|---|---|---|---|
| 价格 | 免费 | 商业(昂贵) | 开源/商业 | 开源 | 开源/商业 |
| 协议支持 | HTTP/FTP/JDBC/JMS等 | 几乎所有协议 | HTTP/WebSocket | HTTP | HTTP/WebSocket |
| 脚本语言 | GUI + Java/Groovy | C/JS | Scala | Python | JavaScript |
| 分布式 | 支持 | 支持 | 支持 | 支持 | 支持 |
| 学习曲线 | 中等 | 陡峭 | 中等 | 简单 | 简单 |
| 资源消耗 | 较高 | 中等 | 较低 | 较低 | 低 |
| 报告 | HTML Dashboard | 丰富 | 内置 | 插件 | 内置 |
| CI/CD | 命令行支持 | 支持 | 原生支持 | 原生支持 | 原生支持 |
| 社区 | 非常活跃 | 商业支持 | 活跃 | 活跃 | 活跃 |
| 工具 | 协议支持 | 易用性 | 扩展性 | 报告能力 | 执行性能 | 社区活跃度 |
|---|---|---|---|---|---|---|
| JMeter | 90 | 80 | 95 | 85 | 60 | 95 |
| LoadRunner | 98 | 50 | 80 | 95 | 85 | 60 |
| Gatling | 60 | 75 | 70 | 80 | 85 | 70 |
| Locust | 50 | 90 | 75 | 60 | 80 | 65 |
| k6 | 55 | 85 | 70 | 75 | 95 | 60 |
JMeter 适用场景
#mermaid-svg-ZtftABoAuhTMcFjD{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ZtftABoAuhTMcFjD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ZtftABoAuhTMcFjD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ZtftABoAuhTMcFjD .error-icon{fill:#552222;}#mermaid-svg-ZtftABoAuhTMcFjD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZtftABoAuhTMcFjD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ZtftABoAuhTMcFjD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZtftABoAuhTMcFjD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZtftABoAuhTMcFjD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ZtftABoAuhTMcFjD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZtftABoAuhTMcFjD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZtftABoAuhTMcFjD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZtftABoAuhTMcFjD .marker.cross{stroke:#333333;}#mermaid-svg-ZtftABoAuhTMcFjD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZtftABoAuhTMcFjD p{margin:0;}#mermaid-svg-ZtftABoAuhTMcFjD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZtftABoAuhTMcFjD .cluster-label text{fill:#333;}#mermaid-svg-ZtftABoAuhTMcFjD .cluster-label span{color:#333;}#mermaid-svg-ZtftABoAuhTMcFjD .cluster-label span p{background-color:transparent;}#mermaid-svg-ZtftABoAuhTMcFjD .label text,#mermaid-svg-ZtftABoAuhTMcFjD span{fill:#333;color:#333;}#mermaid-svg-ZtftABoAuhTMcFjD .node rect,#mermaid-svg-ZtftABoAuhTMcFjD .node circle,#mermaid-svg-ZtftABoAuhTMcFjD .node ellipse,#mermaid-svg-ZtftABoAuhTMcFjD .node polygon,#mermaid-svg-ZtftABoAuhTMcFjD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZtftABoAuhTMcFjD .rough-node .label text,#mermaid-svg-ZtftABoAuhTMcFjD .node .label text,#mermaid-svg-ZtftABoAuhTMcFjD .image-shape .label,#mermaid-svg-ZtftABoAuhTMcFjD .icon-shape .label{text-anchor:middle;}#mermaid-svg-ZtftABoAuhTMcFjD .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ZtftABoAuhTMcFjD .rough-node .label,#mermaid-svg-ZtftABoAuhTMcFjD .node .label,#mermaid-svg-ZtftABoAuhTMcFjD .image-shape .label,#mermaid-svg-ZtftABoAuhTMcFjD .icon-shape .label{text-align:center;}#mermaid-svg-ZtftABoAuhTMcFjD .node.clickable{cursor:pointer;}#mermaid-svg-ZtftABoAuhTMcFjD .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ZtftABoAuhTMcFjD .arrowheadPath{fill:#333333;}#mermaid-svg-ZtftABoAuhTMcFjD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZtftABoAuhTMcFjD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZtftABoAuhTMcFjD .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZtftABoAuhTMcFjD .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ZtftABoAuhTMcFjD .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZtftABoAuhTMcFjD .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ZtftABoAuhTMcFjD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZtftABoAuhTMcFjD .cluster text{fill:#333;}#mermaid-svg-ZtftABoAuhTMcFjD .cluster span{color:#333;}#mermaid-svg-ZtftABoAuhTMcFjD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ZtftABoAuhTMcFjD .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ZtftABoAuhTMcFjD rect.text{fill:none;stroke-width:0;}#mermaid-svg-ZtftABoAuhTMcFjD .icon-shape,#mermaid-svg-ZtftABoAuhTMcFjD .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZtftABoAuhTMcFjD .icon-shape p,#mermaid-svg-ZtftABoAuhTMcFjD .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ZtftABoAuhTMcFjD .icon-shape .label rect,#mermaid-svg-ZtftABoAuhTMcFjD .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZtftABoAuhTMcFjD .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ZtftABoAuhTMcFjD .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ZtftABoAuhTMcFjD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
Web应用
数据库
消息队列
微服务API
需要录制脚本
需要分布式压测
预算有限
需要自定义协议
你需要做性能测试吗?
测试什么?
JMeter ✅ 首选
JMeter ✅ JDBC Sampler
JMeter ✅ JMS Sampler
JMeter ✅ HTTP Sampler
JMeter ✅ HTTP Proxy
JMeter ✅ Master-Slave
JMeter ✅ 完全免费
JMeter ✅ Java Sampler
1.3 JMeter 架构概览
#mermaid-svg-fH3oQxxawNJaxcsT{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fH3oQxxawNJaxcsT .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fH3oQxxawNJaxcsT .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fH3oQxxawNJaxcsT .error-icon{fill:#552222;}#mermaid-svg-fH3oQxxawNJaxcsT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fH3oQxxawNJaxcsT .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fH3oQxxawNJaxcsT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fH3oQxxawNJaxcsT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fH3oQxxawNJaxcsT .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fH3oQxxawNJaxcsT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fH3oQxxawNJaxcsT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fH3oQxxawNJaxcsT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fH3oQxxawNJaxcsT .marker.cross{stroke:#333333;}#mermaid-svg-fH3oQxxawNJaxcsT svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fH3oQxxawNJaxcsT p{margin:0;}#mermaid-svg-fH3oQxxawNJaxcsT .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fH3oQxxawNJaxcsT .cluster-label text{fill:#333;}#mermaid-svg-fH3oQxxawNJaxcsT .cluster-label span{color:#333;}#mermaid-svg-fH3oQxxawNJaxcsT .cluster-label span p{background-color:transparent;}#mermaid-svg-fH3oQxxawNJaxcsT .label text,#mermaid-svg-fH3oQxxawNJaxcsT span{fill:#333;color:#333;}#mermaid-svg-fH3oQxxawNJaxcsT .node rect,#mermaid-svg-fH3oQxxawNJaxcsT .node circle,#mermaid-svg-fH3oQxxawNJaxcsT .node ellipse,#mermaid-svg-fH3oQxxawNJaxcsT .node polygon,#mermaid-svg-fH3oQxxawNJaxcsT .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fH3oQxxawNJaxcsT .rough-node .label text,#mermaid-svg-fH3oQxxawNJaxcsT .node .label text,#mermaid-svg-fH3oQxxawNJaxcsT .image-shape .label,#mermaid-svg-fH3oQxxawNJaxcsT .icon-shape .label{text-anchor:middle;}#mermaid-svg-fH3oQxxawNJaxcsT .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fH3oQxxawNJaxcsT .rough-node .label,#mermaid-svg-fH3oQxxawNJaxcsT .node .label,#mermaid-svg-fH3oQxxawNJaxcsT .image-shape .label,#mermaid-svg-fH3oQxxawNJaxcsT .icon-shape .label{text-align:center;}#mermaid-svg-fH3oQxxawNJaxcsT .node.clickable{cursor:pointer;}#mermaid-svg-fH3oQxxawNJaxcsT .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fH3oQxxawNJaxcsT .arrowheadPath{fill:#333333;}#mermaid-svg-fH3oQxxawNJaxcsT .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fH3oQxxawNJaxcsT .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fH3oQxxawNJaxcsT .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fH3oQxxawNJaxcsT .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fH3oQxxawNJaxcsT .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fH3oQxxawNJaxcsT .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fH3oQxxawNJaxcsT .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fH3oQxxawNJaxcsT .cluster text{fill:#333;}#mermaid-svg-fH3oQxxawNJaxcsT .cluster span{color:#333;}#mermaid-svg-fH3oQxxawNJaxcsT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fH3oQxxawNJaxcsT .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fH3oQxxawNJaxcsT rect.text{fill:none;stroke-width:0;}#mermaid-svg-fH3oQxxawNJaxcsT .icon-shape,#mermaid-svg-fH3oQxxawNJaxcsT .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fH3oQxxawNJaxcsT .icon-shape p,#mermaid-svg-fH3oQxxawNJaxcsT .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fH3oQxxawNJaxcsT .icon-shape .label rect,#mermaid-svg-fH3oQxxawNJaxcsT .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fH3oQxxawNJaxcsT .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fH3oQxxawNJaxcsT .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fH3oQxxawNJaxcsT :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} JMeter 架构
运行环境
测试元件
Java 虚拟机
GUI / CLI 模式
引擎核心
Engine
Test Plan 测试计划
Thread Group 线程组
Sampler 采样器
Logic Controller 逻辑控制器
Listener 监听器
Assertion 断言
Timer 定时器
Config Element 配置元件
Pre/Post Processor
前置/后置处理器
操作系统
第2章 安装与环境配置
2.1 安装前的准备
🍽️ 餐厅比喻
安装 JMeter 就像准备开餐厅的厨房------你需要先检查厨房够不够大(内存)、有没有通煤气(JDK)、然后才能搬进厨具(JMeter)。
系统要求
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| JDK | Java 8+ | Java 11 或 Java 17 |
| 内存 | 4GB RAM | 8GB+ RAM |
| 磁盘 | 500MB | 2GB+ |
| 操作系统 | Windows/Mac/Linux | 任意(纯Java,跨平台) |
重要提示:从 JMeter 5.6 开始,推荐使用 Java 11 或更高版本。JMeter 5.7+ 需要 Java 11+。
2.2 JDK 安装与配置
Windows 环境
bash
# 1. 下载 JDK(推荐 Adoptium / Temurin)
# 访问 https://adoptium.net/ 下载 JDK 17
# 2. 安装后验证
java -version
# 输出: openjdk version "17.0.8" 2023-07-18
# 3. 配置环境变量
# 系统变量 → 新建 JAVA_HOME
JAVA_HOME = C:\Program Files\Eclipse Adoptium\jdk-17.0.8-hotspot
# 系统变量 → 编辑 Path → 添加
%JAVA_HOME%\bin
# 4. 验证配置
echo %JAVA_HOME%
# 输出: C:\Program Files\Eclipse Adoptium\jdk-17.0.8-hotspot
macOS 环境
bash
# 方法一:使用 Homebrew(推荐)
brew install --cask temurin@17
# 验证
java -version
# 输出: openjdk version "17.0.8" 2023-07-18
# 方法二:手动下载
# 从 https://adoptium.net/ 下载 macOS 版本
# 解压后配置 ~/.zshrc 或 ~/.bash_profile
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
export PATH=$JAVA_HOME/bin:$PATH
# 使配置生效
source ~/.zshrc
Linux 环境
bash
# Ubuntu/Debian
sudo apt update
sudo apt install -y openjdk-17-jdk
# CentOS/RHEL
sudo yum install -y java-17-openjdk-devel
# 或者使用 SDKMAN(推荐)
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install java 17.0.8-tem
# 验证
java -version
javac -version
2.3 JMeter 安装
#mermaid-svg-G6ck2r4SlnbGuoZz{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-G6ck2r4SlnbGuoZz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-G6ck2r4SlnbGuoZz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-G6ck2r4SlnbGuoZz .error-icon{fill:#552222;}#mermaid-svg-G6ck2r4SlnbGuoZz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-G6ck2r4SlnbGuoZz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-G6ck2r4SlnbGuoZz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-G6ck2r4SlnbGuoZz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-G6ck2r4SlnbGuoZz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-G6ck2r4SlnbGuoZz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-G6ck2r4SlnbGuoZz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-G6ck2r4SlnbGuoZz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-G6ck2r4SlnbGuoZz .marker.cross{stroke:#333333;}#mermaid-svg-G6ck2r4SlnbGuoZz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-G6ck2r4SlnbGuoZz p{margin:0;}#mermaid-svg-G6ck2r4SlnbGuoZz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-G6ck2r4SlnbGuoZz .cluster-label text{fill:#333;}#mermaid-svg-G6ck2r4SlnbGuoZz .cluster-label span{color:#333;}#mermaid-svg-G6ck2r4SlnbGuoZz .cluster-label span p{background-color:transparent;}#mermaid-svg-G6ck2r4SlnbGuoZz .label text,#mermaid-svg-G6ck2r4SlnbGuoZz span{fill:#333;color:#333;}#mermaid-svg-G6ck2r4SlnbGuoZz .node rect,#mermaid-svg-G6ck2r4SlnbGuoZz .node circle,#mermaid-svg-G6ck2r4SlnbGuoZz .node ellipse,#mermaid-svg-G6ck2r4SlnbGuoZz .node polygon,#mermaid-svg-G6ck2r4SlnbGuoZz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-G6ck2r4SlnbGuoZz .rough-node .label text,#mermaid-svg-G6ck2r4SlnbGuoZz .node .label text,#mermaid-svg-G6ck2r4SlnbGuoZz .image-shape .label,#mermaid-svg-G6ck2r4SlnbGuoZz .icon-shape .label{text-anchor:middle;}#mermaid-svg-G6ck2r4SlnbGuoZz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-G6ck2r4SlnbGuoZz .rough-node .label,#mermaid-svg-G6ck2r4SlnbGuoZz .node .label,#mermaid-svg-G6ck2r4SlnbGuoZz .image-shape .label,#mermaid-svg-G6ck2r4SlnbGuoZz .icon-shape .label{text-align:center;}#mermaid-svg-G6ck2r4SlnbGuoZz .node.clickable{cursor:pointer;}#mermaid-svg-G6ck2r4SlnbGuoZz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-G6ck2r4SlnbGuoZz .arrowheadPath{fill:#333333;}#mermaid-svg-G6ck2r4SlnbGuoZz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-G6ck2r4SlnbGuoZz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-G6ck2r4SlnbGuoZz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-G6ck2r4SlnbGuoZz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-G6ck2r4SlnbGuoZz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-G6ck2r4SlnbGuoZz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-G6ck2r4SlnbGuoZz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-G6ck2r4SlnbGuoZz .cluster text{fill:#333;}#mermaid-svg-G6ck2r4SlnbGuoZz .cluster span{color:#333;}#mermaid-svg-G6ck2r4SlnbGuoZz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-G6ck2r4SlnbGuoZz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-G6ck2r4SlnbGuoZz rect.text{fill:none;stroke-width:0;}#mermaid-svg-G6ck2r4SlnbGuoZz .icon-shape,#mermaid-svg-G6ck2r4SlnbGuoZz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-G6ck2r4SlnbGuoZz .icon-shape p,#mermaid-svg-G6ck2r4SlnbGuoZz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-G6ck2r4SlnbGuoZz .icon-shape .label rect,#mermaid-svg-G6ck2r4SlnbGuoZz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-G6ck2r4SlnbGuoZz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-G6ck2r4SlnbGuoZz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-G6ck2r4SlnbGuoZz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 下载 JMeter
解压安装
配置环境变量
启动 JMeter
安装插件管理器
安装常用插件
🎉 安装完成!
下载与安装
bash
# 1. 下载最新稳定版
# 官网: https://jmeter.apache.org/download_jmeter.cgi
# 选择 Binary 压缩包(apache-jmeter-5.6.3.zip 或 .tgz)
# 2. 解压(Windows 示例)
# 解压到: C:\tools\apache-jmeter-5.6.3
# 3. Linux/Mac 解压
tar -xzf apache-jmeter-5.6.3.tgz -C /opt/
# 或
unzip apache-jmeter-5.6.3.zip -d /opt/
配置环境变量
bash
# Windows
# 系统变量 → 新建 JMETER_HOME
JMETER_HOME = C:\tools\apache-jmeter-5.6.3
# Path → 添加
%JMETER_HOME%\bin
# Linux/Mac
export JMETER_HOME=/opt/apache-jmeter-5.6.3
export PATH=$JMETER_HOME/bin:$PATH
# 添加到 ~/.bashrc 或 ~/.zshrc 使其永久生效
echo 'export JMETER_HOME=/opt/apache-jmeter-5.6.3' >> ~/.bashrc
echo 'export PATH=$JMETER_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
启动 JMeter
bash
# Windows - GUI 模式
jmeter.bat
# Linux/Mac - GUI 模式
jmeter
# 非GUI模式(压测时推荐)
jmeter -n -t test_plan.jmx -l results.jtl
# 验证安装
jmeter --version
# 输出: Copyright ... Apache JMeter 5.6.3
2.4 JVM 内存配置
餐厅比喻:JVM 内存就像餐厅的厨房面积------厨房越大,能同时处理的订单越多。但如果厨房太大而订单不够多,就是浪费空间。
bash
# 编辑 JMETER_HOME/bin/jmeter (Linux/Mac) 或 jmeter.bat (Windows)
# 修改 HEAP 参数
# 默认配置(通常不够用)
HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"
# 推荐配置(中等规模压测)
HEAP="-Xms2g -Xmx4g -XX:MaxMetaspaceSize=512m -XX:+UseG1GC"
# 大规模压测配置(8GB+ 内存)
HEAP="-Xms4g -Xmx8g -XX:MaxMetaspaceSize=1024m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
# 参数说明:
# -Xms : 初始堆内存
# -Xmx : 最大堆内存
# -XX:MaxMetaspaceSize : 元空间上限(JMeter 脚本多时需要调大)
# -XX:+UseG1GC : 使用 G1 垃圾收集器(减少 GC 停顿)
2.5 JMeter 插件管理器安装
#mermaid-svg-oD2JeQBtLIKG2y9h{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-oD2JeQBtLIKG2y9h .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-oD2JeQBtLIKG2y9h .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-oD2JeQBtLIKG2y9h .error-icon{fill:#552222;}#mermaid-svg-oD2JeQBtLIKG2y9h .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oD2JeQBtLIKG2y9h .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-oD2JeQBtLIKG2y9h .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oD2JeQBtLIKG2y9h .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oD2JeQBtLIKG2y9h .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-oD2JeQBtLIKG2y9h .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oD2JeQBtLIKG2y9h .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oD2JeQBtLIKG2y9h .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oD2JeQBtLIKG2y9h .marker.cross{stroke:#333333;}#mermaid-svg-oD2JeQBtLIKG2y9h svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oD2JeQBtLIKG2y9h p{margin:0;}#mermaid-svg-oD2JeQBtLIKG2y9h .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-oD2JeQBtLIKG2y9h .cluster-label text{fill:#333;}#mermaid-svg-oD2JeQBtLIKG2y9h .cluster-label span{color:#333;}#mermaid-svg-oD2JeQBtLIKG2y9h .cluster-label span p{background-color:transparent;}#mermaid-svg-oD2JeQBtLIKG2y9h .label text,#mermaid-svg-oD2JeQBtLIKG2y9h span{fill:#333;color:#333;}#mermaid-svg-oD2JeQBtLIKG2y9h .node rect,#mermaid-svg-oD2JeQBtLIKG2y9h .node circle,#mermaid-svg-oD2JeQBtLIKG2y9h .node ellipse,#mermaid-svg-oD2JeQBtLIKG2y9h .node polygon,#mermaid-svg-oD2JeQBtLIKG2y9h .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oD2JeQBtLIKG2y9h .rough-node .label text,#mermaid-svg-oD2JeQBtLIKG2y9h .node .label text,#mermaid-svg-oD2JeQBtLIKG2y9h .image-shape .label,#mermaid-svg-oD2JeQBtLIKG2y9h .icon-shape .label{text-anchor:middle;}#mermaid-svg-oD2JeQBtLIKG2y9h .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-oD2JeQBtLIKG2y9h .rough-node .label,#mermaid-svg-oD2JeQBtLIKG2y9h .node .label,#mermaid-svg-oD2JeQBtLIKG2y9h .image-shape .label,#mermaid-svg-oD2JeQBtLIKG2y9h .icon-shape .label{text-align:center;}#mermaid-svg-oD2JeQBtLIKG2y9h .node.clickable{cursor:pointer;}#mermaid-svg-oD2JeQBtLIKG2y9h .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-oD2JeQBtLIKG2y9h .arrowheadPath{fill:#333333;}#mermaid-svg-oD2JeQBtLIKG2y9h .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-oD2JeQBtLIKG2y9h .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-oD2JeQBtLIKG2y9h .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oD2JeQBtLIKG2y9h .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-oD2JeQBtLIKG2y9h .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oD2JeQBtLIKG2y9h .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-oD2JeQBtLIKG2y9h .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-oD2JeQBtLIKG2y9h .cluster text{fill:#333;}#mermaid-svg-oD2JeQBtLIKG2y9h .cluster span{color:#333;}#mermaid-svg-oD2JeQBtLIKG2y9h div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-oD2JeQBtLIKG2y9h .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-oD2JeQBtLIKG2y9h rect.text{fill:none;stroke-width:0;}#mermaid-svg-oD2JeQBtLIKG2y9h .icon-shape,#mermaid-svg-oD2JeQBtLIKG2y9h .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oD2JeQBtLIKG2y9h .icon-shape p,#mermaid-svg-oD2JeQBtLIKG2y9h .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-oD2JeQBtLIKG2y9h .icon-shape .label rect,#mermaid-svg-oD2JeQBtLIKG2y9h .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oD2JeQBtLIKG2y9h .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-oD2JeQBtLIKG2y9h .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-oD2JeQBtLIKG2y9h :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
访问插件管理器 GitHub
下载 jmeter-plugins-manager.jar
放入 JMETER_HOME/lib/ext/
重启 JMeter
看到插件管理器菜单?
🎉 安装成功!
检查 jar 是否放对位置
bash
# 1. 下载插件管理器
# GitHub: https://github.com/automatedqa/jmeter-plugins-manager
# 下载: https://jmeter-plugins.org/get/
# 2. 放置到 lib/ext 目录
# Windows
copy jmeter-plugins-manager-1.9.jar C:\tools\apache-jmeter-5.6.3\lib\ext\
# Linux/Mac
cp jmeter-plugins-manager-1.9.jar /opt/apache-jmeter-5.6.3/lib/ext/
# 3. 重启 JMeter 后
# 菜单栏会出现 "Options" → "Plugins Manager"
通过插件管理器安装常用插件
启动 JMeter 后,点击 Options → Plugins Manager → Available Plugins,推荐安装:
| 插件名称 | 用途 | 推荐指数 |
|---|---|---|
| Custom Thread Groups | 自定义线程组(阶梯加压等) | ⭐⭐⭐⭐⭐ |
| PerfMon (Metrics Collector) | 服务器性能监控 | ⭐⭐⭐⭐⭐ |
| WebDriver Plugin | 浏览器级别测试 | ⭐⭐⭐⭐ |
| Dummy Sampler | 调试脚本 | ⭐⭐⭐⭐ |
| JSON Path Extractor | JSON 响应提取 | ⭐⭐⭐⭐⭐ |
| SQL Query Counter | 数据库查询统计 | ⭐⭐⭐⭐ |
| JMeter Plugins Manager | 插件管理器本身 | ⭐⭐⭐⭐⭐ |
| View Results Tree | 增强版结果查看 | ⭐⭐⭐⭐ |
2.6 安装验证清单
#mermaid-svg-0F2PCTeTwf7I3Gja{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0F2PCTeTwf7I3Gja .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0F2PCTeTwf7I3Gja .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0F2PCTeTwf7I3Gja .error-icon{fill:#552222;}#mermaid-svg-0F2PCTeTwf7I3Gja .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0F2PCTeTwf7I3Gja .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0F2PCTeTwf7I3Gja .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0F2PCTeTwf7I3Gja .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0F2PCTeTwf7I3Gja .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0F2PCTeTwf7I3Gja .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0F2PCTeTwf7I3Gja .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0F2PCTeTwf7I3Gja .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0F2PCTeTwf7I3Gja .marker.cross{stroke:#333333;}#mermaid-svg-0F2PCTeTwf7I3Gja svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0F2PCTeTwf7I3Gja p{margin:0;}#mermaid-svg-0F2PCTeTwf7I3Gja .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0F2PCTeTwf7I3Gja .cluster-label text{fill:#333;}#mermaid-svg-0F2PCTeTwf7I3Gja .cluster-label span{color:#333;}#mermaid-svg-0F2PCTeTwf7I3Gja .cluster-label span p{background-color:transparent;}#mermaid-svg-0F2PCTeTwf7I3Gja .label text,#mermaid-svg-0F2PCTeTwf7I3Gja span{fill:#333;color:#333;}#mermaid-svg-0F2PCTeTwf7I3Gja .node rect,#mermaid-svg-0F2PCTeTwf7I3Gja .node circle,#mermaid-svg-0F2PCTeTwf7I3Gja .node ellipse,#mermaid-svg-0F2PCTeTwf7I3Gja .node polygon,#mermaid-svg-0F2PCTeTwf7I3Gja .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0F2PCTeTwf7I3Gja .rough-node .label text,#mermaid-svg-0F2PCTeTwf7I3Gja .node .label text,#mermaid-svg-0F2PCTeTwf7I3Gja .image-shape .label,#mermaid-svg-0F2PCTeTwf7I3Gja .icon-shape .label{text-anchor:middle;}#mermaid-svg-0F2PCTeTwf7I3Gja .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-0F2PCTeTwf7I3Gja .rough-node .label,#mermaid-svg-0F2PCTeTwf7I3Gja .node .label,#mermaid-svg-0F2PCTeTwf7I3Gja .image-shape .label,#mermaid-svg-0F2PCTeTwf7I3Gja .icon-shape .label{text-align:center;}#mermaid-svg-0F2PCTeTwf7I3Gja .node.clickable{cursor:pointer;}#mermaid-svg-0F2PCTeTwf7I3Gja .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-0F2PCTeTwf7I3Gja .arrowheadPath{fill:#333333;}#mermaid-svg-0F2PCTeTwf7I3Gja .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0F2PCTeTwf7I3Gja .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0F2PCTeTwf7I3Gja .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0F2PCTeTwf7I3Gja .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0F2PCTeTwf7I3Gja .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0F2PCTeTwf7I3Gja .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-0F2PCTeTwf7I3Gja .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0F2PCTeTwf7I3Gja .cluster text{fill:#333;}#mermaid-svg-0F2PCTeTwf7I3Gja .cluster span{color:#333;}#mermaid-svg-0F2PCTeTwf7I3Gja div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0F2PCTeTwf7I3Gja .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0F2PCTeTwf7I3Gja rect.text{fill:none;stroke-width:0;}#mermaid-svg-0F2PCTeTwf7I3Gja .icon-shape,#mermaid-svg-0F2PCTeTwf7I3Gja .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0F2PCTeTwf7I3Gja .icon-shape p,#mermaid-svg-0F2PCTeTwf7I3Gja .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-0F2PCTeTwf7I3Gja .icon-shape .label rect,#mermaid-svg-0F2PCTeTwf7I3Gja .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0F2PCTeTwf7I3Gja .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0F2PCTeTwf7I3Gja .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0F2PCTeTwf7I3Gja :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
是
否
是
否
是
否
安装验证清单
java -version 正常?
jmeter --version 正常?
重新安装/配置 JDK
插件管理器可用?
检查 JMETER_HOME 配置
能创建测试计划?
检查 lib/ext 目录
✅ 全部就绪!
检查 JMeter 日志
第3章 核心概念与术语
3.1 元件层级关系
餐厅比喻:JMeter 的元件层级就像餐厅的组织架构------从总经理(Test Plan)到部门经理(Thread Group),再到服务员(Sampler),每个人都有明确的职责。
#mermaid-svg-1LBcdOyzrhFw7Bn6{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1LBcdOyzrhFw7Bn6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .error-icon{fill:#552222;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .marker.cross{stroke:#333333;}#mermaid-svg-1LBcdOyzrhFw7Bn6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1LBcdOyzrhFw7Bn6 p{margin:0;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .cluster-label text{fill:#333;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .cluster-label span{color:#333;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .cluster-label span p{background-color:transparent;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .label text,#mermaid-svg-1LBcdOyzrhFw7Bn6 span{fill:#333;color:#333;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .node rect,#mermaid-svg-1LBcdOyzrhFw7Bn6 .node circle,#mermaid-svg-1LBcdOyzrhFw7Bn6 .node ellipse,#mermaid-svg-1LBcdOyzrhFw7Bn6 .node polygon,#mermaid-svg-1LBcdOyzrhFw7Bn6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .rough-node .label text,#mermaid-svg-1LBcdOyzrhFw7Bn6 .node .label text,#mermaid-svg-1LBcdOyzrhFw7Bn6 .image-shape .label,#mermaid-svg-1LBcdOyzrhFw7Bn6 .icon-shape .label{text-anchor:middle;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .rough-node .label,#mermaid-svg-1LBcdOyzrhFw7Bn6 .node .label,#mermaid-svg-1LBcdOyzrhFw7Bn6 .image-shape .label,#mermaid-svg-1LBcdOyzrhFw7Bn6 .icon-shape .label{text-align:center;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .node.clickable{cursor:pointer;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .arrowheadPath{fill:#333333;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1LBcdOyzrhFw7Bn6 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1LBcdOyzrhFw7Bn6 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1LBcdOyzrhFw7Bn6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .cluster text{fill:#333;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .cluster span{color:#333;}#mermaid-svg-1LBcdOyzrhFw7Bn6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1LBcdOyzrhFw7Bn6 rect.text{fill:none;stroke-width:0;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .icon-shape,#mermaid-svg-1LBcdOyzrhFw7Bn6 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .icon-shape p,#mermaid-svg-1LBcdOyzrhFw7Bn6 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .icon-shape .label rect,#mermaid-svg-1LBcdOyzrhFw7Bn6 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1LBcdOyzrhFw7Bn6 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1LBcdOyzrhFw7Bn6 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1LBcdOyzrhFw7Bn6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 📋 Test Plan(测试计划)
= 餐厅总经理
统领全局,制定战略
👥 Thread Group 1(线程组)
= 第一批顾客
👥 Thread Group 2(线程组)
= 第二批顾客
👥 Thread Group 3(线程组)
= 第三批顾客
⚙️ Config Element(配置元件)
= 餐厅配置(菜单、座位表)
🔧 Pre/Post Processor
= 厨师备菜/收尾
⏱️ Timer(定时器)
= 顾客进店节奏
🧠 Logic Controller
= 服务流程控制
📤 Sampler(采样器)
= 服务员点菜
✅ Assertion(断言)
= 菜品质量检查
📊 Listener(监听器)
= 收银台记录
📤 HTTP Sampler
📤 JDBC Sampler
📤 JMS Sampler
3.2 元件执行顺序(关键!)
这是 JMeter 最重要的知识点之一! 元件的执行顺序不是 按照界面上的从上到下排列的,而是按照类型优先级执行的。
#mermaid-svg-L5udml66xLGI1NfS{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-L5udml66xLGI1NfS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-L5udml66xLGI1NfS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-L5udml66xLGI1NfS .error-icon{fill:#552222;}#mermaid-svg-L5udml66xLGI1NfS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-L5udml66xLGI1NfS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-L5udml66xLGI1NfS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-L5udml66xLGI1NfS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-L5udml66xLGI1NfS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-L5udml66xLGI1NfS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-L5udml66xLGI1NfS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-L5udml66xLGI1NfS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-L5udml66xLGI1NfS .marker.cross{stroke:#333333;}#mermaid-svg-L5udml66xLGI1NfS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-L5udml66xLGI1NfS p{margin:0;}#mermaid-svg-L5udml66xLGI1NfS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-L5udml66xLGI1NfS .cluster-label text{fill:#333;}#mermaid-svg-L5udml66xLGI1NfS .cluster-label span{color:#333;}#mermaid-svg-L5udml66xLGI1NfS .cluster-label span p{background-color:transparent;}#mermaid-svg-L5udml66xLGI1NfS .label text,#mermaid-svg-L5udml66xLGI1NfS span{fill:#333;color:#333;}#mermaid-svg-L5udml66xLGI1NfS .node rect,#mermaid-svg-L5udml66xLGI1NfS .node circle,#mermaid-svg-L5udml66xLGI1NfS .node ellipse,#mermaid-svg-L5udml66xLGI1NfS .node polygon,#mermaid-svg-L5udml66xLGI1NfS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-L5udml66xLGI1NfS .rough-node .label text,#mermaid-svg-L5udml66xLGI1NfS .node .label text,#mermaid-svg-L5udml66xLGI1NfS .image-shape .label,#mermaid-svg-L5udml66xLGI1NfS .icon-shape .label{text-anchor:middle;}#mermaid-svg-L5udml66xLGI1NfS .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-L5udml66xLGI1NfS .rough-node .label,#mermaid-svg-L5udml66xLGI1NfS .node .label,#mermaid-svg-L5udml66xLGI1NfS .image-shape .label,#mermaid-svg-L5udml66xLGI1NfS .icon-shape .label{text-align:center;}#mermaid-svg-L5udml66xLGI1NfS .node.clickable{cursor:pointer;}#mermaid-svg-L5udml66xLGI1NfS .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-L5udml66xLGI1NfS .arrowheadPath{fill:#333333;}#mermaid-svg-L5udml66xLGI1NfS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-L5udml66xLGI1NfS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-L5udml66xLGI1NfS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-L5udml66xLGI1NfS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-L5udml66xLGI1NfS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-L5udml66xLGI1NfS .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-L5udml66xLGI1NfS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-L5udml66xLGI1NfS .cluster text{fill:#333;}#mermaid-svg-L5udml66xLGI1NfS .cluster span{color:#333;}#mermaid-svg-L5udml66xLGI1NfS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-L5udml66xLGI1NfS .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-L5udml66xLGI1NfS rect.text{fill:none;stroke-width:0;}#mermaid-svg-L5udml66xLGI1NfS .icon-shape,#mermaid-svg-L5udml66xLGI1NfS .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-L5udml66xLGI1NfS .icon-shape p,#mermaid-svg-L5udml66xLGI1NfS .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-L5udml66xLGI1NfS .icon-shape .label rect,#mermaid-svg-L5udml66xLGI1NfS .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-L5udml66xLGI1NfS .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-L5udml66xLGI1NfS .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-L5udml66xLGI1NfS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1. Config Element
(配置元件)
2. Pre-Processor
(前置处理器)
3. Timer
(定时器)
4. Sampler
(采样器)
5. Post-Processor
(后置处理器)
6. Assertion
(断言)
7. Listener
(监听器)
记忆口诀
配置 → 前置 → 定时 → 采样 → 后置 → 断言 → 监听
"配前定采后断监"
想象一个故事:
"配"(配置好厨房)→ "前"(提前备菜)→ "定"(定时上菜)→ "采"(服务员点菜/采样)
→ "后"(收拾餐桌)→ "断"(检查菜品质量)→ "监"(记录账单)
3.3 作用域规则
#mermaid-svg-qhOTH4vOQSXAVZaj{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qhOTH4vOQSXAVZaj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qhOTH4vOQSXAVZaj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qhOTH4vOQSXAVZaj .error-icon{fill:#552222;}#mermaid-svg-qhOTH4vOQSXAVZaj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qhOTH4vOQSXAVZaj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qhOTH4vOQSXAVZaj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qhOTH4vOQSXAVZaj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qhOTH4vOQSXAVZaj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qhOTH4vOQSXAVZaj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qhOTH4vOQSXAVZaj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qhOTH4vOQSXAVZaj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qhOTH4vOQSXAVZaj .marker.cross{stroke:#333333;}#mermaid-svg-qhOTH4vOQSXAVZaj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qhOTH4vOQSXAVZaj p{margin:0;}#mermaid-svg-qhOTH4vOQSXAVZaj .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-qhOTH4vOQSXAVZaj .cluster-label text{fill:#333;}#mermaid-svg-qhOTH4vOQSXAVZaj .cluster-label span{color:#333;}#mermaid-svg-qhOTH4vOQSXAVZaj .cluster-label span p{background-color:transparent;}#mermaid-svg-qhOTH4vOQSXAVZaj .label text,#mermaid-svg-qhOTH4vOQSXAVZaj span{fill:#333;color:#333;}#mermaid-svg-qhOTH4vOQSXAVZaj .node rect,#mermaid-svg-qhOTH4vOQSXAVZaj .node circle,#mermaid-svg-qhOTH4vOQSXAVZaj .node ellipse,#mermaid-svg-qhOTH4vOQSXAVZaj .node polygon,#mermaid-svg-qhOTH4vOQSXAVZaj .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qhOTH4vOQSXAVZaj .rough-node .label text,#mermaid-svg-qhOTH4vOQSXAVZaj .node .label text,#mermaid-svg-qhOTH4vOQSXAVZaj .image-shape .label,#mermaid-svg-qhOTH4vOQSXAVZaj .icon-shape .label{text-anchor:middle;}#mermaid-svg-qhOTH4vOQSXAVZaj .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qhOTH4vOQSXAVZaj .rough-node .label,#mermaid-svg-qhOTH4vOQSXAVZaj .node .label,#mermaid-svg-qhOTH4vOQSXAVZaj .image-shape .label,#mermaid-svg-qhOTH4vOQSXAVZaj .icon-shape .label{text-align:center;}#mermaid-svg-qhOTH4vOQSXAVZaj .node.clickable{cursor:pointer;}#mermaid-svg-qhOTH4vOQSXAVZaj .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qhOTH4vOQSXAVZaj .arrowheadPath{fill:#333333;}#mermaid-svg-qhOTH4vOQSXAVZaj .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qhOTH4vOQSXAVZaj .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qhOTH4vOQSXAVZaj .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qhOTH4vOQSXAVZaj .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qhOTH4vOQSXAVZaj .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qhOTH4vOQSXAVZaj .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qhOTH4vOQSXAVZaj .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qhOTH4vOQSXAVZaj .cluster text{fill:#333;}#mermaid-svg-qhOTH4vOQSXAVZaj .cluster span{color:#333;}#mermaid-svg-qhOTH4vOQSXAVZaj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qhOTH4vOQSXAVZaj .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qhOTH4vOQSXAVZaj rect.text{fill:none;stroke-width:0;}#mermaid-svg-qhOTH4vOQSXAVZaj .icon-shape,#mermaid-svg-qhOTH4vOQSXAVZaj .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qhOTH4vOQSXAVZaj .icon-shape p,#mermaid-svg-qhOTH4vOQSXAVZaj .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qhOTH4vOQSXAVZaj .icon-shape .label rect,#mermaid-svg-qhOTH4vOQSXAVZaj .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qhOTH4vOQSXAVZaj .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qhOTH4vOQSXAVZaj .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qhOTH4vOQSXAVZaj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 作用域规则
规则1: Sampler 只影响自己
规则2: Controller 影响其下所有子元件
规则3: Timer 影响同级和下级所有Sampler
规则4: Listener 影响同级和下级所有Sampler
Test Plan
Thread Group 1
Simple Controller
HTTP Request 1
HTTP Request 2
Timer(全局)
Timer(局部)
Thread Group 2
作用域规则详解:
- Sampler:只影响自身(最精确的作用域)
- Logic Controller:影响其下所有子元件
- Config Element:影响所在线程组的所有元件(除非放在 Controller 下)
- Timer:影响同级及下级所有 Sampler(在 Timer 之前和同级范围内的)
- Assertion:影响同级及下级所有 Sampler
- Listener:影响同级及下级所有 Sampler 的数据
- Pre/Post Processor:影响同级及下级所有 Sampler
3.4 核心术语对照表
| 英文术语 | 中文翻译 | 餐厅比喻 | 说明 |
|---|---|---|---|
| Test Plan | 测试计划 | 餐厅经营方案 | 整个测试的根节点 |
| Thread Group | 线程组 | 一批顾客 | 定义虚拟用户数量和行为 |
| Thread | 线程 | 单个顾客 | 一个虚拟用户 |
| Sampler | 采样器 | 服务员点菜 | 发送请求的基本单元 |
| Logic Controller | 逻辑控制器 | 服务流程 | 控制元件的执行逻辑 |
| Listener | 监听器 | 收银台/监控室 | 收集和展示测试结果 |
| Assertion | 断言 | 菜品质量检查 | 验证响应是否符合预期 |
| Timer | 定时器 | 等候叫号器 | 控制请求发送的间隔 |
| Config Element | 配置元件 | 餐厅配置 | 提供默认配置数据 |
| Pre-Processor | 前置处理器 | 厨师备菜 | 在 Sampler 之前执行 |
| Post-Processor | 后置处理器 | 餐桌清理 | 在 Sampler 之后执行 |
| Throughput | 吞吐量 | 每小时服务顾客数 | 单位时间处理的请求数 |
| Response Time | 响应时间 | 上菜时间 | 从请求到响应的时间 |
| Latency | 延迟 | 等待时间 | 从发送请求到收到第一个字节 |
| 90% Line | 90百分位 | 90%顾客等待时间 | 90%的请求响应时间低于此值 |
第4章 JMeter 元件详解
4.1 Test Plan(测试计划)
餐厅比喻 :Test Plan 是餐厅的经营方案------定义了餐厅的整体策略,包括是否共享调料(变量共享)、是否独立经营(独立运行每个线程组)。
#mermaid-svg-67t9zuHH3jDHOciY{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-67t9zuHH3jDHOciY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-67t9zuHH3jDHOciY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-67t9zuHH3jDHOciY .error-icon{fill:#552222;}#mermaid-svg-67t9zuHH3jDHOciY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-67t9zuHH3jDHOciY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-67t9zuHH3jDHOciY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-67t9zuHH3jDHOciY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-67t9zuHH3jDHOciY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-67t9zuHH3jDHOciY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-67t9zuHH3jDHOciY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-67t9zuHH3jDHOciY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-67t9zuHH3jDHOciY .marker.cross{stroke:#333333;}#mermaid-svg-67t9zuHH3jDHOciY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-67t9zuHH3jDHOciY p{margin:0;}#mermaid-svg-67t9zuHH3jDHOciY .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-67t9zuHH3jDHOciY .cluster-label text{fill:#333;}#mermaid-svg-67t9zuHH3jDHOciY .cluster-label span{color:#333;}#mermaid-svg-67t9zuHH3jDHOciY .cluster-label span p{background-color:transparent;}#mermaid-svg-67t9zuHH3jDHOciY .label text,#mermaid-svg-67t9zuHH3jDHOciY span{fill:#333;color:#333;}#mermaid-svg-67t9zuHH3jDHOciY .node rect,#mermaid-svg-67t9zuHH3jDHOciY .node circle,#mermaid-svg-67t9zuHH3jDHOciY .node ellipse,#mermaid-svg-67t9zuHH3jDHOciY .node polygon,#mermaid-svg-67t9zuHH3jDHOciY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-67t9zuHH3jDHOciY .rough-node .label text,#mermaid-svg-67t9zuHH3jDHOciY .node .label text,#mermaid-svg-67t9zuHH3jDHOciY .image-shape .label,#mermaid-svg-67t9zuHH3jDHOciY .icon-shape .label{text-anchor:middle;}#mermaid-svg-67t9zuHH3jDHOciY .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-67t9zuHH3jDHOciY .rough-node .label,#mermaid-svg-67t9zuHH3jDHOciY .node .label,#mermaid-svg-67t9zuHH3jDHOciY .image-shape .label,#mermaid-svg-67t9zuHH3jDHOciY .icon-shape .label{text-align:center;}#mermaid-svg-67t9zuHH3jDHOciY .node.clickable{cursor:pointer;}#mermaid-svg-67t9zuHH3jDHOciY .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-67t9zuHH3jDHOciY .arrowheadPath{fill:#333333;}#mermaid-svg-67t9zuHH3jDHOciY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-67t9zuHH3jDHOciY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-67t9zuHH3jDHOciY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-67t9zuHH3jDHOciY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-67t9zuHH3jDHOciY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-67t9zuHH3jDHOciY .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-67t9zuHH3jDHOciY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-67t9zuHH3jDHOciY .cluster text{fill:#333;}#mermaid-svg-67t9zuHH3jDHOciY .cluster span{color:#333;}#mermaid-svg-67t9zuHH3jDHOciY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-67t9zuHH3jDHOciY .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-67t9zuHH3jDHOciY rect.text{fill:none;stroke-width:0;}#mermaid-svg-67t9zuHH3jDHOciY .icon-shape,#mermaid-svg-67t9zuHH3jDHOciY .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-67t9zuHH3jDHOciY .icon-shape p,#mermaid-svg-67t9zuHH3jDHOciY .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-67t9zuHH3jDHOciY .icon-shape .label rect,#mermaid-svg-67t9zuHH3jDHOciY .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-67t9zuHH3jDHOciY .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-67t9zuHH3jDHOciY .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-67t9zuHH3jDHOciY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Test Plan
Serialized Execution
(串行执行线程组)
Run Thread Groups consecutively
(顺序执行)
Functional Testing Mode
(函数测试模式)
Independent variables per Thread Group
(线程组独立变量)
关键配置项:
xml
<!-- JMeter XML 配置示例 -->
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="我的测试计划">
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
<boolProp name="TestPlan.functional_mode">false</boolProp>
<stringProp name="TestPlan.comments">这是一个电商系统压测计划</stringProp>
</TestPlan>
| 配置项 | 说明 | 推荐设置 |
|---|---|---|
| Serialize Thread Groups | 线程组是否串行执行 | 并行压测时选 false |
| Functional Mode | 函数测试模式(保存所有响应) | 调试时开启,压测时关闭 |
| Independent Variables | 每个线程组使用独立变量 | 按需开启 |
4.2 Thread Group(线程组)
餐厅比喻 :Thread Group 是一批同时到达餐厅的顾客。你可以控制这批顾客有多少人、多久来一波、总共来多久。
#mermaid-svg-B5ntCwbRB8J46dwL{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-B5ntCwbRB8J46dwL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-B5ntCwbRB8J46dwL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-B5ntCwbRB8J46dwL .error-icon{fill:#552222;}#mermaid-svg-B5ntCwbRB8J46dwL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-B5ntCwbRB8J46dwL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-B5ntCwbRB8J46dwL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-B5ntCwbRB8J46dwL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-B5ntCwbRB8J46dwL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-B5ntCwbRB8J46dwL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-B5ntCwbRB8J46dwL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-B5ntCwbRB8J46dwL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-B5ntCwbRB8J46dwL .marker.cross{stroke:#333333;}#mermaid-svg-B5ntCwbRB8J46dwL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-B5ntCwbRB8J46dwL p{margin:0;}#mermaid-svg-B5ntCwbRB8J46dwL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-B5ntCwbRB8J46dwL .cluster-label text{fill:#333;}#mermaid-svg-B5ntCwbRB8J46dwL .cluster-label span{color:#333;}#mermaid-svg-B5ntCwbRB8J46dwL .cluster-label span p{background-color:transparent;}#mermaid-svg-B5ntCwbRB8J46dwL .label text,#mermaid-svg-B5ntCwbRB8J46dwL span{fill:#333;color:#333;}#mermaid-svg-B5ntCwbRB8J46dwL .node rect,#mermaid-svg-B5ntCwbRB8J46dwL .node circle,#mermaid-svg-B5ntCwbRB8J46dwL .node ellipse,#mermaid-svg-B5ntCwbRB8J46dwL .node polygon,#mermaid-svg-B5ntCwbRB8J46dwL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-B5ntCwbRB8J46dwL .rough-node .label text,#mermaid-svg-B5ntCwbRB8J46dwL .node .label text,#mermaid-svg-B5ntCwbRB8J46dwL .image-shape .label,#mermaid-svg-B5ntCwbRB8J46dwL .icon-shape .label{text-anchor:middle;}#mermaid-svg-B5ntCwbRB8J46dwL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-B5ntCwbRB8J46dwL .rough-node .label,#mermaid-svg-B5ntCwbRB8J46dwL .node .label,#mermaid-svg-B5ntCwbRB8J46dwL .image-shape .label,#mermaid-svg-B5ntCwbRB8J46dwL .icon-shape .label{text-align:center;}#mermaid-svg-B5ntCwbRB8J46dwL .node.clickable{cursor:pointer;}#mermaid-svg-B5ntCwbRB8J46dwL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-B5ntCwbRB8J46dwL .arrowheadPath{fill:#333333;}#mermaid-svg-B5ntCwbRB8J46dwL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-B5ntCwbRB8J46dwL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-B5ntCwbRB8J46dwL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-B5ntCwbRB8J46dwL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-B5ntCwbRB8J46dwL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-B5ntCwbRB8J46dwL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-B5ntCwbRB8J46dwL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-B5ntCwbRB8J46dwL .cluster text{fill:#333;}#mermaid-svg-B5ntCwbRB8J46dwL .cluster span{color:#333;}#mermaid-svg-B5ntCwbRB8J46dwL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-B5ntCwbRB8J46dwL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-B5ntCwbRB8J46dwL rect.text{fill:none;stroke-width:0;}#mermaid-svg-B5ntCwbRB8J46dwL .icon-shape,#mermaid-svg-B5ntCwbRB8J46dwL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-B5ntCwbRB8J46dwL .icon-shape p,#mermaid-svg-B5ntCwbRB8J46dwL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-B5ntCwbRB8J46dwL .icon-shape .label rect,#mermaid-svg-B5ntCwbRB8J46dwL .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-B5ntCwbRB8J46dwL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-B5ntCwbRB8J46dwL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-B5ntCwbRB8J46dwL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Thread Group 配置
Number of Threads
(线程数/用户数)
= 顾客人数
Ramp-up Period
(启动时间)
= 顾客陆续到店的时间
Loop Count
(循环次数)
= 每个顾客重复点菜的次数
Same user on each iteration
(同一用户每次迭代)
= 同一个顾客反复来
Duration
(持续时间)
= 餐厅营业时长
Startup delay
(启动延迟)
= 餐厅开门前的准备时间
Scheduler
(调度器)
= 定时营业
配置示例:
xml
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="电商用户组">
<stringProp name="ThreadGroup.num_threads">100</stringProp>
<stringProp name="ThreadGroup.ramp_time">10</stringProp>
<boolProp name="ThreadGroup.scheduler">true</boolProp>
<stringProp name="ThreadGroup.duration">300</stringProp>
<stringProp name="ThreadGroup.delay">5</stringProp>
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
</ThreadGroup>
参数计算示例:
场景:模拟 100 个用户,在 10 秒内逐步加入,持续运行 5 分钟
Number of Threads = 100
Ramp-up Period = 10 秒
→ 每 0.1 秒启动一个新用户(100 / 10 = 10 个/秒)
Duration = 300 秒
Loop Count = 不限(由 Duration 控制)
⚠️ 注意:
- Ramp-up 设为 0 会让所有用户瞬间启动,可能导致"惊群效应"
- Ramp-up 设为与线程数相同(如100秒),则每秒启动1个用户
4.3 Sampler(采样器)
餐厅比喻 :Sampler 是服务员------负责向厨房(服务器)发送具体的点菜单(请求),并带回菜品(响应)。
#mermaid-svg-k2x6mkdrMwX280DA{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-k2x6mkdrMwX280DA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-k2x6mkdrMwX280DA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-k2x6mkdrMwX280DA .error-icon{fill:#552222;}#mermaid-svg-k2x6mkdrMwX280DA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-k2x6mkdrMwX280DA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-k2x6mkdrMwX280DA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-k2x6mkdrMwX280DA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-k2x6mkdrMwX280DA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-k2x6mkdrMwX280DA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-k2x6mkdrMwX280DA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-k2x6mkdrMwX280DA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-k2x6mkdrMwX280DA .marker.cross{stroke:#333333;}#mermaid-svg-k2x6mkdrMwX280DA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-k2x6mkdrMwX280DA p{margin:0;}#mermaid-svg-k2x6mkdrMwX280DA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-k2x6mkdrMwX280DA .cluster-label text{fill:#333;}#mermaid-svg-k2x6mkdrMwX280DA .cluster-label span{color:#333;}#mermaid-svg-k2x6mkdrMwX280DA .cluster-label span p{background-color:transparent;}#mermaid-svg-k2x6mkdrMwX280DA .label text,#mermaid-svg-k2x6mkdrMwX280DA span{fill:#333;color:#333;}#mermaid-svg-k2x6mkdrMwX280DA .node rect,#mermaid-svg-k2x6mkdrMwX280DA .node circle,#mermaid-svg-k2x6mkdrMwX280DA .node ellipse,#mermaid-svg-k2x6mkdrMwX280DA .node polygon,#mermaid-svg-k2x6mkdrMwX280DA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-k2x6mkdrMwX280DA .rough-node .label text,#mermaid-svg-k2x6mkdrMwX280DA .node .label text,#mermaid-svg-k2x6mkdrMwX280DA .image-shape .label,#mermaid-svg-k2x6mkdrMwX280DA .icon-shape .label{text-anchor:middle;}#mermaid-svg-k2x6mkdrMwX280DA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-k2x6mkdrMwX280DA .rough-node .label,#mermaid-svg-k2x6mkdrMwX280DA .node .label,#mermaid-svg-k2x6mkdrMwX280DA .image-shape .label,#mermaid-svg-k2x6mkdrMwX280DA .icon-shape .label{text-align:center;}#mermaid-svg-k2x6mkdrMwX280DA .node.clickable{cursor:pointer;}#mermaid-svg-k2x6mkdrMwX280DA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-k2x6mkdrMwX280DA .arrowheadPath{fill:#333333;}#mermaid-svg-k2x6mkdrMwX280DA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-k2x6mkdrMwX280DA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-k2x6mkdrMwX280DA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-k2x6mkdrMwX280DA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-k2x6mkdrMwX280DA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-k2x6mkdrMwX280DA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-k2x6mkdrMwX280DA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-k2x6mkdrMwX280DA .cluster text{fill:#333;}#mermaid-svg-k2x6mkdrMwX280DA .cluster span{color:#333;}#mermaid-svg-k2x6mkdrMwX280DA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-k2x6mkdrMwX280DA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-k2x6mkdrMwX280DA rect.text{fill:none;stroke-width:0;}#mermaid-svg-k2x6mkdrMwX280DA .icon-shape,#mermaid-svg-k2x6mkdrMwX280DA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-k2x6mkdrMwX280DA .icon-shape p,#mermaid-svg-k2x6mkdrMwX280DA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-k2x6mkdrMwX280DA .icon-shape .label rect,#mermaid-svg-k2x6mkdrMwX280DA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-k2x6mkdrMwX280DA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-k2x6mkdrMwX280DA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-k2x6mkdrMwX280DA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 常用 Sampler 类型
HTTP Request
= 点网页上的菜
最常用的Sampler
HTTPS Request
= 点加密菜单的菜
JDBC Request
= 直接去仓库查库存
JMS Request
= 通过传菜通道点菜
TCP Sampler
= 用内部电话点菜
Java Request
= 让厨师做定制菜
SOAP/XML-RPC
= 用正式公文点菜
FTP Sampler
= 批量取菜
WebSocket
= 实时互动点菜
HTTP Request Sampler 详解
xml
<!-- HTTP 请求配置示例 -->
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="登录请求">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments">
<collectionProp name="Arguments.arguments">
<elementProp name="username" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">testuser</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="password" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">testpass123</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain">api.example.com</stringProp>
<stringProp name="HTTPSampler.port">443</stringProp>
<stringProp name="HTTPSampler.protocol">https</stringProp>
<stringProp name="HTTPSampler.path">/api/v1/login</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
</HTTPSamplerProxy>
| 配置项 | 说明 | 示例 |
|---|---|---|
| Server Name/IP | 服务器地址 | api.example.com |
| Port Number | 端口号 | 443 |
| Protocol | 协议 | https |
| Method | HTTP方法 | GET, POST, PUT, DELETE |
| Path | 请求路径 | /api/v1/login |
| Content Encoding | 编码 | UTF-8 |
| Redirect Automatically | 自动重定向 | 勾选 |
| Follow Redirects | 跟随重定向 | 手动控制重定向次数 |
4.4 Logic Controller(逻辑控制器)
餐厅比喻 :Logic Controller 是服务流程手册------定义服务员应该按什么顺序点菜、什么条件下跳过某些菜、什么时候循环点同一道菜。
#mermaid-svg-jVsYMPtNOiew56Rk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jVsYMPtNOiew56Rk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jVsYMPtNOiew56Rk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jVsYMPtNOiew56Rk .error-icon{fill:#552222;}#mermaid-svg-jVsYMPtNOiew56Rk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jVsYMPtNOiew56Rk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jVsYMPtNOiew56Rk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jVsYMPtNOiew56Rk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jVsYMPtNOiew56Rk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jVsYMPtNOiew56Rk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jVsYMPtNOiew56Rk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jVsYMPtNOiew56Rk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jVsYMPtNOiew56Rk .marker.cross{stroke:#333333;}#mermaid-svg-jVsYMPtNOiew56Rk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jVsYMPtNOiew56Rk p{margin:0;}#mermaid-svg-jVsYMPtNOiew56Rk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-jVsYMPtNOiew56Rk .cluster-label text{fill:#333;}#mermaid-svg-jVsYMPtNOiew56Rk .cluster-label span{color:#333;}#mermaid-svg-jVsYMPtNOiew56Rk .cluster-label span p{background-color:transparent;}#mermaid-svg-jVsYMPtNOiew56Rk .label text,#mermaid-svg-jVsYMPtNOiew56Rk span{fill:#333;color:#333;}#mermaid-svg-jVsYMPtNOiew56Rk .node rect,#mermaid-svg-jVsYMPtNOiew56Rk .node circle,#mermaid-svg-jVsYMPtNOiew56Rk .node ellipse,#mermaid-svg-jVsYMPtNOiew56Rk .node polygon,#mermaid-svg-jVsYMPtNOiew56Rk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jVsYMPtNOiew56Rk .rough-node .label text,#mermaid-svg-jVsYMPtNOiew56Rk .node .label text,#mermaid-svg-jVsYMPtNOiew56Rk .image-shape .label,#mermaid-svg-jVsYMPtNOiew56Rk .icon-shape .label{text-anchor:middle;}#mermaid-svg-jVsYMPtNOiew56Rk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-jVsYMPtNOiew56Rk .rough-node .label,#mermaid-svg-jVsYMPtNOiew56Rk .node .label,#mermaid-svg-jVsYMPtNOiew56Rk .image-shape .label,#mermaid-svg-jVsYMPtNOiew56Rk .icon-shape .label{text-align:center;}#mermaid-svg-jVsYMPtNOiew56Rk .node.clickable{cursor:pointer;}#mermaid-svg-jVsYMPtNOiew56Rk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-jVsYMPtNOiew56Rk .arrowheadPath{fill:#333333;}#mermaid-svg-jVsYMPtNOiew56Rk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jVsYMPtNOiew56Rk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jVsYMPtNOiew56Rk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jVsYMPtNOiew56Rk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jVsYMPtNOiew56Rk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jVsYMPtNOiew56Rk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-jVsYMPtNOiew56Rk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jVsYMPtNOiew56Rk .cluster text{fill:#333;}#mermaid-svg-jVsYMPtNOiew56Rk .cluster span{color:#333;}#mermaid-svg-jVsYMPtNOiew56Rk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jVsYMPtNOiew56Rk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jVsYMPtNOiew56Rk rect.text{fill:none;stroke-width:0;}#mermaid-svg-jVsYMPtNOiew56Rk .icon-shape,#mermaid-svg-jVsYMPtNOiew56Rk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jVsYMPtNOiew56Rk .icon-shape p,#mermaid-svg-jVsYMPtNOiew56Rk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-jVsYMPtNOiew56Rk .icon-shape .label rect,#mermaid-svg-jVsYMPtNOiew56Rk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jVsYMPtNOiew56Rk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jVsYMPtNOiew56Rk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jVsYMPtNOiew56Rk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 逻辑控制器分类
随机控制器
Random Controller
= 随机点菜
随机选择一个子请求
Random Order Controller
= 随机顺序
每次随机排列执行顺序
循环控制器
Loop Controller
= 循环点菜
重复执行N次
ForEach Controller
= 遍历菜单
遍历变量逐一执行
条件控制器
If Controller
= 如果...就...
条件满足才执行
While Controller
= 只要...就继续...
满足条件就一直循环
Switch Controller
= 分流器
根据值选择执行分支
Transaction Controller
= 套餐控制器
把多个请求打包成一个事务
简单控制器
Simple Controller
= 简单分组
把几个请求放一起
常用控制器使用场景
1. Simple Controller(简单控制器)
场景:把登录流程的多个请求组织在一起
├── Simple Controller(登录流程)
│ ├── 打开登录页
│ ├── 输入用户名密码
│ └── 提交登录
2. If Controller(条件控制器)
groovy
// 条件表达式(使用 JavaScript 或 Groovy)
${__groovy(vars.get("userType") == "VIP")}
// 或者使用 JMeter 内置函数
${__jexl3("${status}" == "active")}
3. Transaction Controller(事务控制器)
场景:把"下单流程"作为一个整体来统计响应时间
├── Transaction Controller(下单事务)
│ ├── 选择商品
│ ├── 加入购物车
│ ├── 提交订单
│ └── 确认支付
→ 整个"下单事务"的响应时间 = 所有子请求时间之和
4. Loop Controller(循环控制器)
xml
<LoopController guiclass="LoopControlGui" testclass="LoopController" testname="循环浏览商品">
<intProp name="LoopController.loops">10</intProp>
<boolProp name="LoopController.continue_forever">false</boolProp>
</LoopController>
5. While Controller(循环控制器)
groovy
// 条件:只要还有下一页就继续翻页
${__groovy(vars.get("hasNextPage") == "true")}
4.5 Listener(监听器)
餐厅比喻 :Listener 是监控室------实时观察餐厅的运行状态,记录每个顾客的等待时间、服务成功率等数据。
#mermaid-svg-rMFim50I3zKViQqp{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rMFim50I3zKViQqp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rMFim50I3zKViQqp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rMFim50I3zKViQqp .error-icon{fill:#552222;}#mermaid-svg-rMFim50I3zKViQqp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rMFim50I3zKViQqp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rMFim50I3zKViQqp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rMFim50I3zKViQqp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rMFim50I3zKViQqp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rMFim50I3zKViQqp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rMFim50I3zKViQqp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rMFim50I3zKViQqp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rMFim50I3zKViQqp .marker.cross{stroke:#333333;}#mermaid-svg-rMFim50I3zKViQqp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rMFim50I3zKViQqp p{margin:0;}#mermaid-svg-rMFim50I3zKViQqp .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-rMFim50I3zKViQqp .cluster-label text{fill:#333;}#mermaid-svg-rMFim50I3zKViQqp .cluster-label span{color:#333;}#mermaid-svg-rMFim50I3zKViQqp .cluster-label span p{background-color:transparent;}#mermaid-svg-rMFim50I3zKViQqp .label text,#mermaid-svg-rMFim50I3zKViQqp span{fill:#333;color:#333;}#mermaid-svg-rMFim50I3zKViQqp .node rect,#mermaid-svg-rMFim50I3zKViQqp .node circle,#mermaid-svg-rMFim50I3zKViQqp .node ellipse,#mermaid-svg-rMFim50I3zKViQqp .node polygon,#mermaid-svg-rMFim50I3zKViQqp .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rMFim50I3zKViQqp .rough-node .label text,#mermaid-svg-rMFim50I3zKViQqp .node .label text,#mermaid-svg-rMFim50I3zKViQqp .image-shape .label,#mermaid-svg-rMFim50I3zKViQqp .icon-shape .label{text-anchor:middle;}#mermaid-svg-rMFim50I3zKViQqp .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-rMFim50I3zKViQqp .rough-node .label,#mermaid-svg-rMFim50I3zKViQqp .node .label,#mermaid-svg-rMFim50I3zKViQqp .image-shape .label,#mermaid-svg-rMFim50I3zKViQqp .icon-shape .label{text-align:center;}#mermaid-svg-rMFim50I3zKViQqp .node.clickable{cursor:pointer;}#mermaid-svg-rMFim50I3zKViQqp .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-rMFim50I3zKViQqp .arrowheadPath{fill:#333333;}#mermaid-svg-rMFim50I3zKViQqp .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rMFim50I3zKViQqp .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rMFim50I3zKViQqp .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rMFim50I3zKViQqp .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-rMFim50I3zKViQqp .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rMFim50I3zKViQqp .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-rMFim50I3zKViQqp .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rMFim50I3zKViQqp .cluster text{fill:#333;}#mermaid-svg-rMFim50I3zKViQqp .cluster span{color:#333;}#mermaid-svg-rMFim50I3zKViQqp div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rMFim50I3zKViQqp .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-rMFim50I3zKViQqp rect.text{fill:none;stroke-width:0;}#mermaid-svg-rMFim50I3zKViQqp .icon-shape,#mermaid-svg-rMFim50I3zKViQqp .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rMFim50I3zKViQqp .icon-shape p,#mermaid-svg-rMFim50I3zKViQqp .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-rMFim50I3zKViQqp .icon-shape .label rect,#mermaid-svg-rMFim50I3zKViQqp .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rMFim50I3zKViQqp .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-rMFim50I3zKViQqp .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-rMFim50I3zKViQqp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 常用监听器
View Results Tree
= 详细账单
查看每个请求的详细信息
Summary Report
= 营业日报
汇总统计所有请求
Aggregate Report
= 月度报表
包含百分位数的详细统计
Graph Results
= 走势图
响应时间变化趋势
Response Times
Over Time
= 实时监控大屏
HTML Report
= 年度报告
生成漂亮的HTML报告
Aggregate Report(聚合报告)关键字段
| 字段 | 含义 | 餐厅比喻 | 健康标准 |
|---|---|---|---|
| Samples | 样本数 | 总服务次数 | - |
| Average | 平均响应时间 | 平均上菜时间 | < 3秒 |
| Median | 中位数 | 中等水平上菜时间 | < 2秒 |
| 90% Line | 90百分位 | 90%顾客的上菜时间 | < 5秒 |
| 95% Line | 95百分位 | 95%顾客的上菜时间 | < 8秒 |
| 99% Line | 99百分位 | 99%顾客的上菜时间 | < 15秒 |
| Min | 最小值 | 最快上菜时间 | - |
| Max | 最大值 | 最慢上菜时间 | < 30秒 |
| Error % | 错误率 | 上错菜的比例 | < 1% |
| Throughput | 吞吐量 | 每小时服务顾客数 | 越高越好 |
4.6 Assertion(断言)
餐厅比喻 :Assertion 是菜品质量检查员------检查厨房端出来的菜是否符合标准(比如汤够不够热、有没有放盐)。
#mermaid-svg-trx8Rvd1L2zDYBHE{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-trx8Rvd1L2zDYBHE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-trx8Rvd1L2zDYBHE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-trx8Rvd1L2zDYBHE .error-icon{fill:#552222;}#mermaid-svg-trx8Rvd1L2zDYBHE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-trx8Rvd1L2zDYBHE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-trx8Rvd1L2zDYBHE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-trx8Rvd1L2zDYBHE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-trx8Rvd1L2zDYBHE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-trx8Rvd1L2zDYBHE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-trx8Rvd1L2zDYBHE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-trx8Rvd1L2zDYBHE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-trx8Rvd1L2zDYBHE .marker.cross{stroke:#333333;}#mermaid-svg-trx8Rvd1L2zDYBHE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-trx8Rvd1L2zDYBHE p{margin:0;}#mermaid-svg-trx8Rvd1L2zDYBHE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-trx8Rvd1L2zDYBHE .cluster-label text{fill:#333;}#mermaid-svg-trx8Rvd1L2zDYBHE .cluster-label span{color:#333;}#mermaid-svg-trx8Rvd1L2zDYBHE .cluster-label span p{background-color:transparent;}#mermaid-svg-trx8Rvd1L2zDYBHE .label text,#mermaid-svg-trx8Rvd1L2zDYBHE span{fill:#333;color:#333;}#mermaid-svg-trx8Rvd1L2zDYBHE .node rect,#mermaid-svg-trx8Rvd1L2zDYBHE .node circle,#mermaid-svg-trx8Rvd1L2zDYBHE .node ellipse,#mermaid-svg-trx8Rvd1L2zDYBHE .node polygon,#mermaid-svg-trx8Rvd1L2zDYBHE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-trx8Rvd1L2zDYBHE .rough-node .label text,#mermaid-svg-trx8Rvd1L2zDYBHE .node .label text,#mermaid-svg-trx8Rvd1L2zDYBHE .image-shape .label,#mermaid-svg-trx8Rvd1L2zDYBHE .icon-shape .label{text-anchor:middle;}#mermaid-svg-trx8Rvd1L2zDYBHE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-trx8Rvd1L2zDYBHE .rough-node .label,#mermaid-svg-trx8Rvd1L2zDYBHE .node .label,#mermaid-svg-trx8Rvd1L2zDYBHE .image-shape .label,#mermaid-svg-trx8Rvd1L2zDYBHE .icon-shape .label{text-align:center;}#mermaid-svg-trx8Rvd1L2zDYBHE .node.clickable{cursor:pointer;}#mermaid-svg-trx8Rvd1L2zDYBHE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-trx8Rvd1L2zDYBHE .arrowheadPath{fill:#333333;}#mermaid-svg-trx8Rvd1L2zDYBHE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-trx8Rvd1L2zDYBHE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-trx8Rvd1L2zDYBHE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-trx8Rvd1L2zDYBHE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-trx8Rvd1L2zDYBHE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-trx8Rvd1L2zDYBHE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-trx8Rvd1L2zDYBHE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-trx8Rvd1L2zDYBHE .cluster text{fill:#333;}#mermaid-svg-trx8Rvd1L2zDYBHE .cluster span{color:#333;}#mermaid-svg-trx8Rvd1L2zDYBHE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-trx8Rvd1L2zDYBHE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-trx8Rvd1L2zDYBHE rect.text{fill:none;stroke-width:0;}#mermaid-svg-trx8Rvd1L2zDYBHE .icon-shape,#mermaid-svg-trx8Rvd1L2zDYBHE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-trx8Rvd1L2zDYBHE .icon-shape p,#mermaid-svg-trx8Rvd1L2zDYBHE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-trx8Rvd1L2zDYBHE .icon-shape .label rect,#mermaid-svg-trx8Rvd1L2zDYBHE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-trx8Rvd1L2zDYBHE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-trx8Rvd1L2zDYBHE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-trx8Rvd1L2zDYBHE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 断言类型
Response Assertion
= 检查菜品内容
验证响应文本/代码/头
Duration Assertion
= 检查上菜速度
响应时间不超过阈值
Size Assertion
= 检查菜品分量
响应大小在范围内
XML Assertion
= 检查XML格式菜品
验证XML结构
JSON Assertion
= 检查JSON格式菜品
验证JSON内容
MD5Hex Assertion
= 检查菜品指纹
验证内容完整性
Compare Assertion
= 对比两道菜
比较两次响应
Response Assertion 配置示例
xml
<hashTree>
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="验证登录成功">
<collectionProp name="Asserion.test_strings">
<stringProp name="49586">"code":200</stringProp>
<stringProp name="49587">"token"</stringProp>
</collectionProp>
<stringProp name="Assertion.custom_message"></stringProp>
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
<boolProp name="Assertion.assume_success">false</boolProp>
<intProp name="Assertion.test_type">16</intProp>
</ResponseAssertion>
</hashTree>
断言测试类型:
| 类型 | 说明 | 示例 |
|---|---|---|
| Contains | 包含 | 响应包含 "success" |
| Matches | 正则匹配 | 响应匹配 "code":\s*\d+ |
| Equals | 等于 | 响应等于预期字符串 |
| Substring | 子字符串 | 响应的子串匹配 |
| Not Contains | 不包含 | 响应不包含 "error" |
| Not Matches | 不匹配正则 | 响应不匹配错误模式 |
4.7 Timer(定时器)
餐厅比喻 :Timer 是等候叫号器------控制顾客多久点一次菜,避免所有顾客同时涌向服务员。
#mermaid-svg-HvbRxWmVmPVWnmEO{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-HvbRxWmVmPVWnmEO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-HvbRxWmVmPVWnmEO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-HvbRxWmVmPVWnmEO .error-icon{fill:#552222;}#mermaid-svg-HvbRxWmVmPVWnmEO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HvbRxWmVmPVWnmEO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-HvbRxWmVmPVWnmEO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HvbRxWmVmPVWnmEO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HvbRxWmVmPVWnmEO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-HvbRxWmVmPVWnmEO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HvbRxWmVmPVWnmEO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HvbRxWmVmPVWnmEO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HvbRxWmVmPVWnmEO .marker.cross{stroke:#333333;}#mermaid-svg-HvbRxWmVmPVWnmEO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HvbRxWmVmPVWnmEO p{margin:0;}#mermaid-svg-HvbRxWmVmPVWnmEO .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-HvbRxWmVmPVWnmEO .cluster-label text{fill:#333;}#mermaid-svg-HvbRxWmVmPVWnmEO .cluster-label span{color:#333;}#mermaid-svg-HvbRxWmVmPVWnmEO .cluster-label span p{background-color:transparent;}#mermaid-svg-HvbRxWmVmPVWnmEO .label text,#mermaid-svg-HvbRxWmVmPVWnmEO span{fill:#333;color:#333;}#mermaid-svg-HvbRxWmVmPVWnmEO .node rect,#mermaid-svg-HvbRxWmVmPVWnmEO .node circle,#mermaid-svg-HvbRxWmVmPVWnmEO .node ellipse,#mermaid-svg-HvbRxWmVmPVWnmEO .node polygon,#mermaid-svg-HvbRxWmVmPVWnmEO .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-HvbRxWmVmPVWnmEO .rough-node .label text,#mermaid-svg-HvbRxWmVmPVWnmEO .node .label text,#mermaid-svg-HvbRxWmVmPVWnmEO .image-shape .label,#mermaid-svg-HvbRxWmVmPVWnmEO .icon-shape .label{text-anchor:middle;}#mermaid-svg-HvbRxWmVmPVWnmEO .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-HvbRxWmVmPVWnmEO .rough-node .label,#mermaid-svg-HvbRxWmVmPVWnmEO .node .label,#mermaid-svg-HvbRxWmVmPVWnmEO .image-shape .label,#mermaid-svg-HvbRxWmVmPVWnmEO .icon-shape .label{text-align:center;}#mermaid-svg-HvbRxWmVmPVWnmEO .node.clickable{cursor:pointer;}#mermaid-svg-HvbRxWmVmPVWnmEO .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-HvbRxWmVmPVWnmEO .arrowheadPath{fill:#333333;}#mermaid-svg-HvbRxWmVmPVWnmEO .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-HvbRxWmVmPVWnmEO .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-HvbRxWmVmPVWnmEO .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HvbRxWmVmPVWnmEO .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-HvbRxWmVmPVWnmEO .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HvbRxWmVmPVWnmEO .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-HvbRxWmVmPVWnmEO .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-HvbRxWmVmPVWnmEO .cluster text{fill:#333;}#mermaid-svg-HvbRxWmVmPVWnmEO .cluster span{color:#333;}#mermaid-svg-HvbRxWmVmPVWnmEO div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-HvbRxWmVmPVWnmEO .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-HvbRxWmVmPVWnmEO rect.text{fill:none;stroke-width:0;}#mermaid-svg-HvbRxWmVmPVWnmEO .icon-shape,#mermaid-svg-HvbRxWmVmPVWnmEO .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HvbRxWmVmPVWnmEO .icon-shape p,#mermaid-svg-HvbRxWmVmPVWnmEO .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-HvbRxWmVmPVWnmEO .icon-shape .label rect,#mermaid-svg-HvbRxWmVmPVWnmEO .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HvbRxWmVmPVWnmEO .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-HvbRxWmVmPVWnmEO .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-HvbRxWmVmPVWnmEO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 定时器类型
Constant Timer
= 固定等待
每次固定等待N毫秒
Random Timer
= 随机等待
随机等待一段时间
Gaussian Random Timer
= 高斯随机等待
大部分集中在中间值
Uniform Random Timer
= 均匀随机等待
在范围内均匀分布
Precise Throughput Timer
= 精确吞吐量
精确控制每分钟请求数
Synchronizing Timer
= 同步定时器
让用户同时发请求
使用建议:
⚠️ 重要:不要使用 Constant Timer 来模拟真实用户!
真实用户不会精确地每隔 3 秒点一次菜。
推荐使用 Gaussian Random Timer 或 Uniform Random Timer。
示例配置:
- Gaussian Random Timer: 延迟范围 1000ms ~ 3000ms
→ 大部分请求间隔在 2000ms 左右(符合正态分布)
→ 模拟真实用户的不规律行为
4.8 Config Element(配置元件)
餐厅比喻 :Config Element 是餐厅的公共配置------比如默认的餐桌布置、统一的调料架、共享的菜单模板。
#mermaid-svg-pdDZHThIJOZw8uGK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-pdDZHThIJOZw8uGK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pdDZHThIJOZw8uGK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pdDZHThIJOZw8uGK .error-icon{fill:#552222;}#mermaid-svg-pdDZHThIJOZw8uGK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pdDZHThIJOZw8uGK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pdDZHThIJOZw8uGK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pdDZHThIJOZw8uGK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pdDZHThIJOZw8uGK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pdDZHThIJOZw8uGK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pdDZHThIJOZw8uGK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pdDZHThIJOZw8uGK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pdDZHThIJOZw8uGK .marker.cross{stroke:#333333;}#mermaid-svg-pdDZHThIJOZw8uGK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pdDZHThIJOZw8uGK p{margin:0;}#mermaid-svg-pdDZHThIJOZw8uGK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-pdDZHThIJOZw8uGK .cluster-label text{fill:#333;}#mermaid-svg-pdDZHThIJOZw8uGK .cluster-label span{color:#333;}#mermaid-svg-pdDZHThIJOZw8uGK .cluster-label span p{background-color:transparent;}#mermaid-svg-pdDZHThIJOZw8uGK .label text,#mermaid-svg-pdDZHThIJOZw8uGK span{fill:#333;color:#333;}#mermaid-svg-pdDZHThIJOZw8uGK .node rect,#mermaid-svg-pdDZHThIJOZw8uGK .node circle,#mermaid-svg-pdDZHThIJOZw8uGK .node ellipse,#mermaid-svg-pdDZHThIJOZw8uGK .node polygon,#mermaid-svg-pdDZHThIJOZw8uGK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pdDZHThIJOZw8uGK .rough-node .label text,#mermaid-svg-pdDZHThIJOZw8uGK .node .label text,#mermaid-svg-pdDZHThIJOZw8uGK .image-shape .label,#mermaid-svg-pdDZHThIJOZw8uGK .icon-shape .label{text-anchor:middle;}#mermaid-svg-pdDZHThIJOZw8uGK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-pdDZHThIJOZw8uGK .rough-node .label,#mermaid-svg-pdDZHThIJOZw8uGK .node .label,#mermaid-svg-pdDZHThIJOZw8uGK .image-shape .label,#mermaid-svg-pdDZHThIJOZw8uGK .icon-shape .label{text-align:center;}#mermaid-svg-pdDZHThIJOZw8uGK .node.clickable{cursor:pointer;}#mermaid-svg-pdDZHThIJOZw8uGK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-pdDZHThIJOZw8uGK .arrowheadPath{fill:#333333;}#mermaid-svg-pdDZHThIJOZw8uGK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pdDZHThIJOZw8uGK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pdDZHThIJOZw8uGK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pdDZHThIJOZw8uGK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-pdDZHThIJOZw8uGK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pdDZHThIJOZw8uGK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-pdDZHThIJOZw8uGK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pdDZHThIJOZw8uGK .cluster text{fill:#333;}#mermaid-svg-pdDZHThIJOZw8uGK .cluster span{color:#333;}#mermaid-svg-pdDZHThIJOZw8uGK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-pdDZHThIJOZw8uGK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pdDZHThIJOZw8uGK rect.text{fill:none;stroke-width:0;}#mermaid-svg-pdDZHThIJOZw8uGK .icon-shape,#mermaid-svg-pdDZHThIJOZw8uGK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pdDZHThIJOZw8uGK .icon-shape p,#mermaid-svg-pdDZHThIJOZw8uGK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-pdDZHThIJOZw8uGK .icon-shape .label rect,#mermaid-svg-pdDZHThIJOZw8uGK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pdDZHThIJOZw8uGK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-pdDZHThIJOZw8uGK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-pdDZHThIJOZw8uGK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 配置元件
CSV Data Set Config
= 顾客花名册
从CSV读取测试数据
User Defined Variables
= 餐厅公告栏
定义全局变量
HTTP Header Manager
= 统一着装要求
设置公共HTTP头
HTTP Cookie Manager
= 会员卡管理
管理Cookie
HTTP Cache Manager
= 菜品缓存
管理缓存
JDBC Connection Config
= 仓库通道
数据库连接配置
HTTP Request Defaults
= 默认点菜设置
设置默认的协议/域名等
CSV Data Set Config 详解
xml
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="用户数据">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">UTF-8</stringProp>
<stringProp name="filename">/path/to/users.csv</stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="variableNames">username,password,email</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="shareMode.allThreads">true</stringProp>
</CSVDataSet>
CSV 文件示例 (users.csv):
csv
username,password,email
user001,pass123,user001@test.com
user002,pass456,user002@test.com
user003,pass789,user003@test.com
配置项说明:
| 配置项 | 说明 | 推荐设置 |
|---|---|---|
| Filename | CSV 文件路径 | 使用相对路径 |
| Variable Names | 变量名(逗号分隔) | 与CSV列头对应 |
| Delimiter | 分隔符 | ,(逗号) |
| Recycle | 循环使用数据 | 数据不够时循环 |
| Stop Thread | 数据用完停止线程 | 按需选择 |
| Sharing mode | 共享模式 | All Threads(默认) |
4.9 Pre/Post Processor(前置/后置处理器)
餐厅比喻:
- Pre-Processor = 厨师在点菜前先准备好食材
- Post-Processor = 服务员端菜后把顾客的反馈记下来
#mermaid-svg-EeTT1SkEayX2DVyk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-EeTT1SkEayX2DVyk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-EeTT1SkEayX2DVyk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-EeTT1SkEayX2DVyk .error-icon{fill:#552222;}#mermaid-svg-EeTT1SkEayX2DVyk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EeTT1SkEayX2DVyk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-EeTT1SkEayX2DVyk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EeTT1SkEayX2DVyk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EeTT1SkEayX2DVyk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-EeTT1SkEayX2DVyk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EeTT1SkEayX2DVyk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EeTT1SkEayX2DVyk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EeTT1SkEayX2DVyk .marker.cross{stroke:#333333;}#mermaid-svg-EeTT1SkEayX2DVyk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EeTT1SkEayX2DVyk p{margin:0;}#mermaid-svg-EeTT1SkEayX2DVyk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-EeTT1SkEayX2DVyk .cluster-label text{fill:#333;}#mermaid-svg-EeTT1SkEayX2DVyk .cluster-label span{color:#333;}#mermaid-svg-EeTT1SkEayX2DVyk .cluster-label span p{background-color:transparent;}#mermaid-svg-EeTT1SkEayX2DVyk .label text,#mermaid-svg-EeTT1SkEayX2DVyk span{fill:#333;color:#333;}#mermaid-svg-EeTT1SkEayX2DVyk .node rect,#mermaid-svg-EeTT1SkEayX2DVyk .node circle,#mermaid-svg-EeTT1SkEayX2DVyk .node ellipse,#mermaid-svg-EeTT1SkEayX2DVyk .node polygon,#mermaid-svg-EeTT1SkEayX2DVyk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EeTT1SkEayX2DVyk .rough-node .label text,#mermaid-svg-EeTT1SkEayX2DVyk .node .label text,#mermaid-svg-EeTT1SkEayX2DVyk .image-shape .label,#mermaid-svg-EeTT1SkEayX2DVyk .icon-shape .label{text-anchor:middle;}#mermaid-svg-EeTT1SkEayX2DVyk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-EeTT1SkEayX2DVyk .rough-node .label,#mermaid-svg-EeTT1SkEayX2DVyk .node .label,#mermaid-svg-EeTT1SkEayX2DVyk .image-shape .label,#mermaid-svg-EeTT1SkEayX2DVyk .icon-shape .label{text-align:center;}#mermaid-svg-EeTT1SkEayX2DVyk .node.clickable{cursor:pointer;}#mermaid-svg-EeTT1SkEayX2DVyk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-EeTT1SkEayX2DVyk .arrowheadPath{fill:#333333;}#mermaid-svg-EeTT1SkEayX2DVyk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EeTT1SkEayX2DVyk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EeTT1SkEayX2DVyk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EeTT1SkEayX2DVyk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-EeTT1SkEayX2DVyk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EeTT1SkEayX2DVyk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-EeTT1SkEayX2DVyk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EeTT1SkEayX2DVyk .cluster text{fill:#333;}#mermaid-svg-EeTT1SkEayX2DVyk .cluster span{color:#333;}#mermaid-svg-EeTT1SkEayX2DVyk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-EeTT1SkEayX2DVyk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-EeTT1SkEayX2DVyk rect.text{fill:none;stroke-width:0;}#mermaid-svg-EeTT1SkEayX2DVyk .icon-shape,#mermaid-svg-EeTT1SkEayX2DVyk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EeTT1SkEayX2DVyk .icon-shape p,#mermaid-svg-EeTT1SkEayX2DVyk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-EeTT1SkEayX2DVyk .icon-shape .label rect,#mermaid-svg-EeTT1SkEayX2DVyk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EeTT1SkEayX2DVyk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-EeTT1SkEayX2DVyk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-EeTT1SkEayX2DVyk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 常用类型
Pre-Processor
JSR223 PreProcessor
Groovy脚本预处理
BeanShell PreProcessor
HTML Link Parser
解析HTML链接
HTTP PreProcessor
修改请求
Post-Processor
Regular Expression Extractor
正则提取变量
JSON Extractor
JSON提取变量
Boundary Extractor
边界提取
JSR223 PostProcessor
Groovy脚本后处理
XPath Extractor
XPath提取
Debug PostProcessor
调试查看变量
执行流程
Pre-Processor
(前置处理)
Sampler
(发送请求)
Post-Processor
(后置处理)
Regular Expression Extractor(正则提取器)
xml
<RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="提取Token">
<stringProp name="RegexExtractor.regex">"token":"([^"]+)"</stringProp>
<stringProp name="RegexExtractor.template">$1$</stringProp>
<stringProp name="RegexExtractor.match_number">1</stringProp>
<stringProp name="RegexExtractor.default_value">NOT_FOUND</stringProp>
</RegexExtractor>
JSON Extractor(JSON 提取器)
xml
<JSONPostProcessor guiclass="JSONPostProcessorGui" testclass="JSONPostProcessor" testname="提取用户ID">
<stringProp name="JSONPostProcessor.referenceNames">userId</stringProp>
<stringProp name="JSONPostProcessor.jsonPathExprs">$.data.user.id</stringProp>
<stringProp name="JSONPostProcessor.match_numbers">1</stringProp>
<stringProp name="JSONPostProcessor.defaultValues">0</stringProp>
</JSONPostProcessor>
JSON Path 语法速查:
| JSON Path | 说明 | 示例结果 |
|---|---|---|
$.store.book[0].title |
第1本书的标题 | "Sayings of the Century" |
$..author |
所有作者 | "Nigel Rees", ... |
$.store.* |
store下所有子元素 | 所有book和bicycle |
$.store..price |
所有价格 | 8.95, 12.99, ... |
$..book[2] |
第3本书 | 最后那本书 |
$..book[(@.length-1)] |
最后一本书 | 最后那本书 |
$..book[?(@.price<10)] |
价格<10的书 | 便宜的书 |
太长csdn 格式不让,后续见下个