ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

nGrinder性能测试平台安装与使用实战指南

nGrinder性能测试平台安装与使用实战指南 1. 为什么是 nGrinder一个被低估的开源性能测试“老炮儿”nGrinder 这个名字在当前性能测试工具圈里不像 JMeter 那样铺天盖地也不像 Gatling 那样常出现在技术分享的标题里但它在我过去八年带过的二十多个中大型系统压测项目中出现频率稳居前三。它不是那种靠炫酷 UI 或营销话术出圈的工具而是一个典型的“工程师用着顺手、运维部署省心、老板看了报表放心”的务实派。核心关键词nGrinder、性能工具、安装、使用这四个词背后其实藏着三个现实痛点第一很多团队还在用本地启动 JMeter 的方式做压测一到千级并发就卡死本机第二云压测平台费用高、数据敏感、脚本迁移成本大第三写个简单 HTTP 请求都要翻半天文档更别说分布式调度和实时监控了。nGrinder 就是为解决这三点而生的——它本质是一个基于 Web 的、开箱即用的分布式性能测试平台底层用的是 Netty Groovy前端是轻量级的 Bootstrap整个架构设计透着一股“少即是多”的味道。它不追求功能堆砌而是把“能稳定跑起 5000 并发”、“能看清每个线程在哪个节点上卡住了”、“能用 3 行 Groovy 写完登录下单支付链路”这三件事做到极致。我见过最典型的场景是一个刚毕业的测试同学在公司内网搭好 nGrinder 后花 20 分钟照着示例脚本改了几个 URL 和参数当天下午就跑出了第一份有效压测报告而隔壁组用 JMeter 手动分发脚本、同步 CSV 数据、手动汇总结果折腾了三天还没跑通。这不是工具优劣之争而是工作流是否闭环的问题。所以如果你正在找一个不需要买 License、不用配复杂中间件、不依赖外部云服务、但又能支撑真实业务场景压测的方案nGrinder 不是备选而是首选。它适合两类人一类是中小团队里身兼数职的测试/开发/运维需要快速落地、低维护成本另一类是大型团队里负责压测平台建设的架构师把它当做一个可深度定制的底座来用。下面我们就从零开始不跳步、不省略、不假设你懂 Java 或 Linux把nGrinder 的安装与使用拆解成你能直接抄作业的实操路径。2. 安装不是“下一步下一步”而是理解它的运行肌理2.1 nGrinder 的三层架构为什么必须分清 Controller 和 Agent很多人第一次安装失败根本原因不是命令敲错了而是没搞懂 nGrinder 不是一个单体应用。它由三个角色组成Controller控制器、Agent代理节点、Target被测系统。这就像一个指挥中心Controller带着若干个侦察兵Agent去观察一座工厂Target的运转情况。Controller 负责统一调度、脚本管理、结果收集和 Web 展示Agent 则是真正发起请求的“体力劳动者”它们部署在独立的服务器或虚拟机上只管执行 Controller 下发的任务Target 就是你自己的业务系统比如一个 Spring Boot 的订单接口。三者之间通过 HTTP 和 TCP 协议通信Controller 默认监听 8080 端口Agent 默认监听 16001 端口。这个分离设计决定了安装不能“一键傻瓜化”——你必须先装好 Controller再在其他机器上装 Agent最后让它们互相认得出来。我见过太多人把 Controller 和 Agent 装在同一台机器上结果因为端口冲突或资源争抢压测时 Agent 频繁掉线。所以安装的第一步永远是规划你至少需要两台机器可以是两台虚拟机甚至一台物理机配两个 Docker 容器一台专跑 Controller一台专跑 Agent。Controller 对 CPU 和内存要求不高2 核 4G 足够但 Agent 是真吃资源的压测 1000 并发Agent 至少要 4 核 8G否则 JVM GC 都能把你拖垮。这个规划意识比任何命令都重要。2.2 Controller 安装从下载到可访问 Web 界面的完整链路Controller 的安装流程看似简单但每一步都有坑。官方推荐的方式是下载 war 包部署到 Tomcat但实际生产环境我更倾向用官方提供的 Docker 镜像因为版本控制更干净、环境隔离更彻底。不过为了让你真正理解原理我们先走一遍传统 Tomcat 方式再给出 Docker 的“抄作业版”。第一步确认 Java 环境。nGrinder 3.5 要求 JDK 8u202 或更高版本。别信网上说的“JDK 11 也能用”我试过三次Groovy 脚本编译会报Unsupported class file major version错误。检查方法很简单在终端输入java -version输出必须是类似java version 1.8.0_391。如果不是请先卸载旧版去 Oracle 官网或 Adoptium 下载 JDK 8u391。注意不要用 OpenJDK 8 的某些魔改版有些国内镜像源打包的版本缺少 JCE 加密扩展会导致后续 HTTPS 请求失败。第二步下载并解压 Tomcat。推荐 Apache Tomcat 8.5.xnGrinder 官方文档明确兼容的最高版本。下载地址是https://tomcat.apache.org/download.cgi选Core: tar.gz (pgp, sha512)。解压后进入conf目录编辑server.xml找到Connector port8080这一行把redirectPort8443改成redirectPort8443保持不变但关键是要在这一行后面加一个属性URIEncodingUTF-8。这是为了防止中文参数在 URL 中乱码比如你的登录接口带?name张三没这行就会变成?name??。保存退出。第三步下载 nGrinder Controller war 包。去 GitHub Release 页面https://github.com/naver/ngrinder/releases找最新稳定版比如nGrinder-3.5.6.war。不要下-SNAPSHOT版本那是开发快照稳定性没保障。把这个 war 包直接丢进 Tomcat 的webapps目录下重命名为ngrinder.war去掉版本号避免访问路径太长。第四步启动 Tomcat。进入bin目录执行./startup.shLinux/Mac或startup.batWindows。这时候别急着打开浏览器先看logs/catalina.out日志。等看到类似INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [xxxx] milliseconds这行说明 Tomcat 启动成功。再往下翻找INFO [main] org.ngrinder.infra.config.NGrinderConfigPostProcessor.postProcessBeanFactory nGrinder started successfully!—— 这才是 nGrinder 真正跑起来的标志。如果只看到 Tomcat 启动成功但没看到这句大概率是 war 包没放对位置或者 Java 版本不对。第五步首次访问。打开浏览器输入http://你的服务器IP:8080/ngrinder。第一次会跳转到初始化页面让你设置管理员账号。用户名填admin密码自己设建议用ngrinder123这种易记的别用复杂密码因为后续 Agent 注册要用邮箱随便填。点提交页面会自动刷新进入主界面。此时 Controller 安装完成。整个过程从下载到可访问我实测在一台配置正常的虚拟机上耗时约 12 分钟。如果你卡在某一步90% 的概率是 Java 版本或日志里提示的端口被占用比如 8080 被其他程序占了用netstat -tuln | grep 8080查一下就能定位。2.3 Agent 安装不止是“下载解压”关键是注册与心跳Agent 的安装比 Controller 简单但注册环节最容易出错。它不是一个独立服务而是一个 Java 进程需要主动向 Controller “报到”。安装步骤如下第一步在另一台机器或同一台机器的不同目录上下载nGrinder-Agent-3.5.6.zip版本号必须和 Controller 一致我见过太多人 Controller 用 3.5.6Agent 用 3.5.5结果注册一直失败。解压到任意目录比如/opt/ngrinder-agent。第二步进入解压后的agent目录找到conf/agent.conf文件。用文本编辑器打开重点修改三处controller_host192.168.1.100改成你的 Controller 服务器 IP 地址controller_port8080改成 Controller 的实际端口如果改过就填改后的agent_nameagent-01给这个 Agent 起个名字比如order-agent或payment-agent方便后续在 Web 界面识别。第三步最关键的一步——启动 Agent。在agent目录下执行./run_agent.shLinux/Mac或run_agent.batWindows。这时候终端会疯狂刷日志你要盯住前 10 行。正常情况下你会看到INFO [main] org.ngrinder.agent.controller.AgentController.connectToController: Connecting to controller http://192.168.1.100:8080/ngrinder INFO [main] org.ngrinder.agent.controller.AgentController.registerAgent: Registering agent with name: order-agent INFO [main] org.ngrinder.agent.controller.AgentController.registerAgent: Agent registered successfully!看到Agent registered successfully!这句才算注册成功。如果卡在Connecting to controller...说明网络不通检查防火墙iptables -L或ufw status或 Controller 是否真的在运行如果报401 Unauthorized说明 Controller 的管理员密码没配对Agent 的配置文件里要填 Controller 的管理员密码不是你登录 Web 的密码而是初始化时设的那个如果报Connection refused大概率是 Controller 的 IP 或端口写错了。第四步验证。回到 Controller 的 Web 界面点击左上角Agents菜单你应该能看到order-agent显示为ONLINE状态并且旁边有实时的 CPU、内存、线程数监控。这才是真正的“活”Agent。我建议至少部署 2 个 Agent一个用于压测一个作为备用这样即使一个挂了压测任务也不会中断。Agent 的资源消耗是动态的它会根据 Controller 下发的并发数自动调整线程池大小所以你不需要手动调 JVM 参数这是 nGrinder 比 JMeter 分布式方案省心的地方。2.4 Docker 一键部署给懒人和 CI/CD 流水线的终极方案如果你的环境支持 Docker我强烈推荐用 Docker Compose 一次性拉起 Controller 和 Agent。这不仅是“懒”更是为了环境一致性。我们用一个docker-compose.yml文件搞定version: 3.8 services: ngrinder-controller: image: ngrinder/controller:3.5.6 container_name: ngrinder-controller ports: - 8080:8080 environment: - JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 - NGRINDER_ADMIN_PASSWORDngrinder123 volumes: - ./ngrinder-home:/home/ngrinder ngrinder-agent: image: ngrinder/agent:3.5.6 container_name: ngrinder-agent depends_on: - ngrinder-controller environment: - CONTROLLER_HOSTngrinder-controller - CONTROLLER_PORT8080 - AGENT_NAMEdocker-agent - NGRINDER_ADMIN_PASSWORDngrinder123 volumes: - ./ngrinder-agent-home:/home/ngrinder把这个文件保存为docker-compose.yml然后在同目录下执行docker-compose up -d等待 30 秒执行docker-compose logs -f ngrinder-controller查看日志直到出现nGrinder started successfully!。再执行docker-compose logs -f ngrinder-agent看到Agent registered successfully!就大功告成。这种方式的好处是所有依赖Java、Tomcat、nGrinder都打包在镜像里你完全不用操心环境问题升级只需改image标签docker-compose pull docker-compose up -d两步到位而且volumes挂载保证了脚本、报告等数据不会因容器重启而丢失。我在公司 CI/CD 流水线里就是用这套方案每次发布新版本自动构建新镜像一键部署到测试环境整个过程 3 分钟。这才是现代 DevOps 应该有的样子。3. 使用不是“点点点”而是掌握脚本、场景与监控的三角闭环3.1 第一个脚本从录制到调试3 分钟写出可用的登录压测nGrinder 的脚本语言是 Groovy但它封装了非常友好的 HTTP 客户端 API你几乎不用写原生 Socket。新手最大的误区是想从零手写一个复杂的电商下单脚本结果卡在 Cookie 管理或 Token 提取上。正确的姿势是从最简单的登录接口开始用录制微调的方式建立信心。第一步录制。Controller Web 界面点击Script-Create Script-Record Script。这时会弹出一个浏览器窗口基于 Chromium你在里面打开你的登录页面比如http://test-api.example.com/login输入账号密码点击登录。nGrinder 会自动捕获所有 HTTP 请求包括 GET、POST、Cookie、Header。录制完成后点击Stop Recording它会生成一个.groovy文件名字类似login_20240520_1430.groovy。第二步看懂生成的代码。打开这个文件核心结构是这样的RunWith(GrinderRunner) class TestRunner { public static GTest test public static Grinder grinder BeforeProcess public static void beforeProcess() { test new GTest(1, Login Test) // 测试编号和名称 test.record(TestRunner.class) // 记录本类的所有方法 grinder.logger.info(Before process.) } BeforeThread public void beforeThread() { grinder.statistics.delayReports true // 延迟上报统计提升性能 grinder.logger.info(Before thread.) } Test public void test() { // 这里是录制的请求 HttpRequest request1 new HttpRequest() request1.setUrl(http://test-api.example.com/login) request1.setMethod(POST) request1.addHeader(Content-Type, application/json) request1.setBodyText({username:test,password:123456}) request1.setTimeOut(30000) // 30秒超时 request1.recordRequest() // 记录这个请求 // 发送请求 HttpResponse response1 request1.get() grinder.logger.info(Response status: ${response1.statusCode}) } }这段代码里Test标注的方法就是一次压测循环。request1.get()就是真正发请求的动作。grinder.logger.info是打日志方便你调试。第三步微调与调试。录制的脚本往往带固定值比如密码是明文123456这显然不行。我们要改成参数化。在Test方法开头加上def username user_${System.currentTimeMillis() % 1000} // 生成随机用户名 def password Pssw0rd123 // 密码可以固定也可以从文件读然后把setBodyText改成request1.setBodyText({\username\:\${username}\,\password\:\${password}\})这样每次压测都会用不同的用户名避免数据库唯一键冲突。调试时不要直接点Run先点Validate。它会用 1 个线程跑 1 次然后在下方Console Output里显示完整的请求和响应。如果看到Response status: 200说明脚本通了如果看到400或500就去看Console Output里的详细错误信息比如JSON parse error那八成是 Body 里的引号没转义好。3.2 场景设计如何模拟真实用户行为而不是“机器人狂点”很多人的压测报告被质疑“不真实”根源在于场景设计太假。nGrinder 的场景Scenario不是简单地设置并发数而是要定义用户的行为模型。它提供了三种核心模式Ramp-up阶梯式加压最常用。比如你设Initial Users: 10,Max Users: 100,Ramp-up Time: 300秒意思是从第 0 秒开始每 3 秒增加 1 个用户直到第 300 秒达到 100 并发。这模拟了用户自然涌入的过程比瞬间拉到 100 并发更符合真实流量。Step-up台阶式加压适合做拐点测试。比如Step: 20 users,Duration per step: 120s,Max users: 100意思是在 120 秒内保持 20 并发然后立刻跳到 40并保持 120 秒以此类推直到 100。你可以清晰地看到系统在 40、60、80 并发时的响应时间拐点。Constant恒定压力就是一直保持某个并发数比如Users: 50,Duration: 600秒用来做稳定性测试看系统能否扛住 10 分钟不崩溃。但光有并发模型还不够你得让每个“用户”有脑子。nGrinder 支持在脚本里写逻辑。比如一个真实的用户登录后会随机浏览 3-5 个商品页然后有 30% 的概率加购物车10% 的概率下单。这怎么实现在Test方法里加// 登录成功后随机休眠 1-3 秒模拟用户思考 sleep((long)(Math.random() * 2000) 1000) // 随机决定下一步动作 def action Math.random() if (action 0.3) { // 30% 概率加购物车 addCart() } else if (action 0.4) { // 10% 概率下单 createOrder() } else { // 其余 60% 概率浏览商品 viewProduct() }addCart(),createOrder(),viewProduct()都是你自己写的函数每个函数里就是一个HttpRequest。这种基于概率的分支逻辑才是让压测逼近真实的灵魂。我曾经用这种方式帮一个电商客户发现了“加购物车接口在高并发下缓存击穿”的问题——因为真实用户中只有 30% 会加购所以缓存失效的冲击是分散的而如果所有用户都无脑加购缓存瞬间被打爆问题就暴露得更早、更彻底。3.3 监控与报告不只是看 TPS 和 RT更要读懂曲线背后的业务含义nGrinder 的 Web 界面左侧菜单栏Monitor是宝藏。它不只是展示数字而是提供了一个实时的“手术室直播”。当你启动一个压测任务后Monitor页面会实时刷新包含四大核心视图Summary概览最上面的卡片显示Total Requests,Success Rate,TPS,Avg Response Time。这是给老板看的一页纸报告。但要注意Avg Response Time是个危险指标它会掩盖毛刺。比如 99% 的请求是 200ms1% 是 5s平均下来还是 250ms看起来很美但用户体验极差。所以永远要结合Response Time Distribution响应时间分布来看。Response Time Distribution响应时间分布这是一个直方图横轴是响应时间区间如 0-100ms, 100-200ms...纵轴是请求数量。健康的分布应该是左边高、右边低像一个陡峭的山坡。如果在 1000-2000ms 区间突然鼓起一个包说明有大量请求在这个区间超时要去查是不是数据库慢查询或第三方服务抖动。Active Threads活跃线程这条曲线告诉你 Agent 上的线程数是如何随时间变化的。理想状态是它和你设置的Ramp-up曲线高度吻合。如果它提前到达峰值然后开始下降说明 Agent 资源CPU 或内存已经耗尽线程创建失败这时候压测数据就不可信了必须扩容 Agent。Errors错误这里会列出所有失败的请求类型比如java.net.SocketTimeoutException网络超时、java.net.ConnectException连接拒绝、org.json.JSONExceptionJSON 解析失败。SocketTimeoutException多说明后端处理太慢ConnectException多说明后端服务进程挂了或端口没开JSONException多说明接口返回格式异常可能是后端 bug。一份合格的压测报告不应该只写“TPS 达到 1200平均响应时间 350ms”而应该写“在 100 并发阶梯加压下系统于第 180 秒达到稳定态TPS 维持在 1150±2095% 响应时间 400ms。但在 200 并发时Response Time Distribution在 1000-2000ms 区间出现明显峰值错误率上升至 8%经排查为 Redis 连接池耗尽导致。建议将maxActive从 100 调整为 200。”—— 这才是 nGrinder 能给你的价值把冰冷的数字翻译成可执行的优化建议。4. 常见问题与排查技巧实录那些官网不会写的“血泪经验”4.1 Agent 注册失败的 5 种死法及解法Agent 注册失败是新手遇到的第一个拦路虎我把它总结成一张速查表覆盖了 95% 的场景现象日志关键词根本原因解决方案卡在Connecting to controller...java.net.ConnectException: Connection refusedController 服务未启动或 IP/端口配置错误ps aux卡在Registering agent...401 UnauthorizedAgent 配置的管理员密码与 Controller 初始化密码不一致进入 Controller 服务器找到~/.ngrinder/ngrinder.conf查看admin.password的值确保agent.conf里的admin_password与之相同注册后立即掉线Heartbeat failedAgent 与 Controller 网络延迟过高 5s或防火墙拦截心跳包ping 192.168.1.100看延迟检查 Controller 服务器的iptables规则确保16001端口Agent 心跳端口开放在agent.conf中增加heartbeat_interval10000单位毫秒延长心跳间隔Agent 显示OFFLINEjava.lang.OutOfMemoryError: Java heap spaceAgent JVM 内存不足无法处理高并发请求编辑agent/run_agent.sh在java命令后添加-Xms2g -Xmx4g将初始和最大堆内存设为 2G 和 4G确保 Agent 服务器物理内存 8GController Web 界面看不到 AgentNo agents foundController 的ngrinder.conf中agent.discovery.enabledfalse进入 Controller 服务器编辑~/.ngrinder/ngrinder.conf确保agent.discovery.enabledtrue然后重启 Controller这些经验都是我在客户现场一次次tail -f logs/agent.log翻出来的。比如那个401 Unauthorized官方文档只说“检查密码”但没告诉你密码存在两个地方一个是 Web 界面登录用的另一个是 Agent 注册用的它们可以不同但默认是同一个。很多新手以为改了 Web 密码Agent 密码也自动更新了结果白白浪费两小时。4.2 脚本调试的三大“隐形杀手”脚本在Validate时通过但一到正式压测就失败这种问题最折磨人。我归纳出三个最隐蔽的“杀手”杀手一时间戳漂移Time Drift现象脚本里用了System.currentTimeMillis()生成签名但 Controller 和 Agent 服务器的时间差超过 5 分钟导致签名过期。解法在所有服务器上统一启用 NTP 时间同步。Linux 执行sudo timedatectl set-ntp on然后sudo systemctl restart systemd-timesyncd。压测前用date命令对比所有服务器时间误差必须 1 秒。杀手二Cookie 域名不匹配Cookie Domain Mismatch现象登录接口返回了Set-Cookie: JSESSIONIDxxx; Path/; Domain.example.com但你的压测域名是test-api.example.com而脚本里HttpRequest默认只认test-api.example.com不认父域.example.com导致后续请求不带 Cookie。解法在Test方法里手动设置 Cookie。在发送登录请求后获取响应头里的Set-Cookie然后用request2.addHeader(Cookie, JSESSIONIDxxx)显式带上。或者更优雅的方式是用 nGrinder 的HttpSession类def session new HttpSession() session.setDomain(.example.com) // 显式设置父域 session.setPath(/) session.setCookie(JSESSIONID, xxx) request2.setSession(session)杀手三Groovy 版本冲突Groovy Version Conflict现象脚本里用了JsonSlurper解析 JSON但在某些 Agent 上报java.lang.NoClassDefFoundError: groovy/json/JsonSlurper。解法这是因为 nGrinder 3.5.6 自带的 Groovy 是 2.4.21而某些高版本 JDK 会加载系统级的 Groovy造成冲突。终极解法是在agent/conf/agent.conf里添加jvm_options-Dgroovy.home/opt/ngrinder-agent/groovy-2.4.21然后去官网下载groovy-binary-2.4.21.zip解压到/opt/ngrinder-agent/下。虽然麻烦但一劳永逸。4.3 性能瓶颈定位从 nGrinder 报告到服务器诊断的完整路径nGrinder 告诉你“响应时间飙升”但没告诉你“为什么”。这就需要你有一套标准的排查路径。我的习惯是“三板斧”第一板斧看 nGrinder 的Monitor实时曲线如果Active Threads曲线和Ramp-up曲线严重偏离比如Ramp-up到 100Active Threads只到 70说明 Agent 本身是瓶颈立刻去看 Agent 服务器的top%CPU和%MEM是否爆满。如果是要么扩容 Agent要么优化脚本比如减少sleep时间、关闭不必要的日志。第二板斧看 Target 服务器的资源登录被测系统服务器执行htop看 CPU、free -h看内存、iostat -x 1看磁盘 I/O。如果iowait 20%说明磁盘是瓶颈去查数据库慢查询或日志写入是否过多如果swap使用率 50%说明内存严重不足JVM 必须调参。第三板斧抓包与日志交叉分析在 Target 服务器上用tcpdump抓压测期间的包sudo tcpdump -i any -w pressure.pcap port 8080。同时打开应用的日志比如 Spring Boot 的application.log搜索ERROR和WARN。然后用 Wireshark 打开pressure.pcap过滤出响应时间 1s 的请求再对照日志里同一时间点的 ERROR 信息。我曾用这招发现一个“HTTP 500 错误”背后是数据库连接池wait_timeout设置过短导致连接被 MySQL 主动断开应用层没做重试直接抛了异常。这个 BUG 在日常流量下几乎不触发只有在 nGrinder 的持续高压下才暴露。这套路径不是教科书上的理论而是我在凌晨两点的客户机房里一边喝着咖啡一边ssh进服务器敲命令一点点摸索出来的。它没有捷径只有耐心和对每一行日志的敬畏。5. 进阶与扩展让 nGrinder 成为你性能工程体系的基石nGrinder 的强大不在于它自己有多炫而在于它如何无缝融入你的现有技术栈。它不是一个孤岛而是一个枢纽。5.1 与 CI/CD 深度集成让压测成为每次发布的必经关卡我们团队把 nGrinder 压测嵌入到 GitLab CI 流水线里。每次main分支有新 CommitCI 会自动触发一个 Job构建最新的后端服务 Docker 镜像启动一个临时的 nGrinder Controller 容器用前面提到的docker-compose.yml将预存的压测脚本.groovy文件拷贝进 Controller 容器调用 nGrinder 的 REST APIPOST /api/v1/performance-tests启动一个预设的场景比如“登录接口 50 并发持续 5 分钟”轮询 API 获取压测状态直到完成解析返回的 JSON 报告提取successRate和avgResponseTime如果successRate 99.5%或avgResponseTime 500ms则整个 CI Job 失败阻止发布。整个过程全自动无需人工干预。脚本、场景、阈值全部代码化、版本化放在 Git 仓库里。这样做的好处是性能质量不再是一个“测试阶段的事”而是变成了“每个开发者提交代码时就要考虑的事”。一个新人提交了一段低效的数据库查询CI 就会立刻红掉他马上就知道自己影响了性能而不是等测试同学提 Bug 时才后知后觉。5.2 脚本库与模板化告别重复造轮子一个成熟的团队不可能每次压测都从零写脚本。我们建立了内部的 nGrinder 脚本库按业务域分类common/通用模块如login.groovy,logout.groovy,get-token.groovyorder/订单域如create-order.groovy,cancel-order.groovy,query-order.groovypayment/支付域如pay-with-alipay.groovy,pay-with-wechat.groovy。每个脚本都遵循统一规范开头有Description注释说明用途、参数、前置条件Test方法里所有 URL、Token、密钥都从ngrinder.conf读取而不是硬编码脚本末尾有AfterTest方法用于清理测试数据比如删除刚创建的订单。新同学要压测“下单支付”链路只需要新建一个脚本import这两个模块然后用几行代码串起来def loginResult login() def orderResult createOrder(loginResult.sessionId) def payResult payWithAlipay(orderResult.orderId, loginResult.token)这种模块化、组合式的脚本编写方式把压测的门槛降到了最低也让脚本的可维护性达到了最高。我们团队现在有 42 个标准化脚本覆盖了 90% 的核心业务场景新项目接入平均只需 2 小时。5.3 监控告警联动让性能问题“自报家门”nGrinder 本身不提供告警但它的 REST API 非常完善。我们用一个简单的 Python 脚本定时调用GET /api/v1/performance-tests?statusFINISHED获取最近 24 小时所有已完成的压测任务。然后解析每个任务的summary字段如果发现errorRate 5%或 p95Response
返回列表