性能测试从入门到精通-JMeter完全指南(上)

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 后,点击 OptionsPlugins ManagerAvailable 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

作用域规则详解

  1. Sampler:只影响自身(最精确的作用域)
  2. Logic Controller:影响其下所有子元件
  3. Config Element:影响所在线程组的所有元件(除非放在 Controller 下)
  4. Timer:影响同级及下级所有 Sampler(在 Timer 之前和同级范围内的)
  5. Assertion:影响同级及下级所有 Sampler
  6. Listener:影响同级及下级所有 Sampler 的数据
  7. 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 格式不让,后续见下个