LoadRunner 12录制+11压测:APP后端并发测试实战指南
简介这份资源面向移动端性能测试工程师与后端开发人员聚焦APP后台服务器的压力测试场景解决LoadRunner无法直接录制手机APP脚本的痛点。核心思路是借助LoadRunner12的代理录制能力抓取APP请求再将调试好的脚本放到LoadRunner11上执行从而利用其免费license实现最高6.5万并发兼顾脚本录制与高并发压测两方面需求。资源包内为1个docx文档约691KB内容涵盖LoadRunner简介、安装手册与完整使用教程包括代理设置、脚本录制、回放调试、错误行处理以及LR11安装破解与脚本执行等关键环节并配有操作截图辅助理解。目前已有555人学习下载适合希望低成本搭建APP压测环境、快速掌握脚本录制与并发执行流程的测试人员参考。1. 拆开一套「12 录制 11 压测」的 APP 后端压测组合拳移动端后端压测最尴尬的地方在于脚本录制和并发执行往往被拆在两个工具里。LoadRunner12 能通过代理抓取手机 APP 的真实 HTTP 请求但社区版只给 50 个并发跑不出有参考价值的曲线LoadRunner11 有免费的超大 license6.5 万并发随便压可它偏偏不支持手机 APP 的脚本录制。这套资源的核心思路就是取长补短——用 12 录脚本把脚本拿到 11 上跑。听起来像绕路实际是当前成本最低、落地最快的一条路。适合手里有 APP 后端接口、需要做并发验证又不想掏 license 钱的测试和运维同学。下面按「录制 → 迁移 → 压测 → 排错」的顺序拆一遍参数和坑都标清楚。2. 录制端环境搭建代理、端口与脚本生成2.1 为什么选 LoadRunner12 社区版做录制LoadRunner12 相比 11 最大的变化是加入了移动端协议支持能识别手机 APP 发出的 HTTP/HTTPS 请求。社区版虽然并发被锁在 50但录制功能没有阉割脚本生成质量跟商业版一致。这就意味着你可以把它当成一个「免费的脚本采集器」来用压测执行交给 11。安装前有两个硬性条件必须满足一是系统选 Win7 64 位二是安装路径不能带中文。这两条不是建议是硬门槛。中文路径会导致部分组件注册失败装完打开 VuGen 直接报错。安装过程本身没什么好说的一路下一步装完桌面会出现三个图标——Virtual User Generator录制脚本、Controller执行压测、Analysis结果分析。社区版只用得上第一个。2.2 手机代理配置与录制参数录制原理是 LoadRunner12 在本机起一个代理服务手机通过 Wi-Fi 连到同一网段后把 HTTP 代理指向这台电脑所有请求就会经过 VuGen 被记录下来。具体操作分三步第一步在录制用的电脑上开一个 Wi-Fi 热点让手机连上来确保手机和电脑在同一局域网。记下电脑的 IP后面代理要填。第二步手机 Wi-Fi 设置里找到代理选项改为手动主机名填电脑 IP端口填一个四位数比如 8899。端口不要选 80、443 这类常用端口避免冲突。第三步打开 VuGen新建脚本时协议选「Web-HTTP/HTML」然后点录制按钮。录制模式选「Remote Application via LoadRunner Proxy」端口填手机上设的那个 8899点开始录制。# 录制前的网络连通性自检在录制电脑上执行 # 确认手机能 ping 通电脑 ping 192.168.0.103 # 确认代理端口没有被占用 netstat -ano | findstr 8899 # 如果端口被占用换一个端口比如 8898这里的关键参数是代理端口它必须和手机端填的完全一致差一位都录不到包。录制模式选 Remote Application 而不是默认的本地模式是因为请求来源是手机而不是本机浏览器。2.3 录制后的脚本清理录制完成后 VuGen 会生成一份脚本点回放按钮跑一遍。大概率会报错这很正常。报错的行基本是调用第三方插件或外部资源的请求比如统计 SDK、广告接口、推送服务这些在脱离 APP 环境后无法执行。处理原则很简单找到报错行直接注释或删除只要不影响主业务流程的请求链路就行。判断标准是看这行请求的 URL 是不是你后端服务器的域名不是就删。删完再回放一次直到脚本能完整跑通主流程。提示录制时尽量只操作核心业务路径比如登录 → 浏览列表 → 下单 → 支付不要把所有页面都点一遍。脚本越长后期参数化和关联的工作量越大。3. 脚本迁移到 LoadRunner11兼容性处理与参数化3.1 跨版本脚本兼容的底层逻辑LoadRunner12 和 11 的脚本底层都是基于 C 语言的 VuGen 脚本结构核心的 web_url、web_submit_data 等函数在两个版本间是通用的。12 录制出来的脚本之所以能拿到 11 上跑就是因为这些基础函数没有变。差异主要出现在少数新版本才支持的函数和头文件引用上迁移时把不兼容的部分替换掉即可。迁移操作就是把 12 生成的脚本目录整个拷贝到装了 LoadRunner11 的机器上用 11 的 VuGen 打开。打开时如果提示脚本版本不匹配选择继续打开就行VuGen 会自动做一次格式转换。3.2 参数化让脚本从「单次回放」变成「并发压测」录制出来的脚本是死的每次请求都发同样的数据。压测时必须做参数化否则所有虚拟用户发一模一样的数据后端缓存一命中压测结果就失真了。参数化的核心是把请求里的用户凭证、订单号、搜索关键词等替换成变量。在 VuGen 里选中要参数化的值右键选择「Replace with a Parameter」新建一个参数名然后配置数据源。// 参数化前的登录请求 web_submit_data(login, Actionhttp://api.example.com/login, MethodPOST, ITEMDATA, Nameusername, Valuetestuser001, ENDITEM, Namepassword, ValuePass123456, ENDITEM, LAST); // 参数化后的登录请求 web_submit_data(login, Actionhttp://api.example.com/login, MethodPOST, ITEMDATA, Nameusername, Value{username}, ENDITEM, Namepassword, Value{password}, ENDITEM, LAST);参数 {username} 和 {password} 的数据源可以是一份 CSV 文件里面放几百组测试账号。在参数属性里设置「Select next row」为 Sequential 或 Random「Update value on」为 Each iteration这样每个虚拟用户每次迭代都会取不同的账号。3.3 关联处理动态 token 和 sessionAPP 后端接口通常会在登录后返回一个 token后续请求都要带上这个 token。录制时 token 是写死的压测时每个用户的 token 都不一样必须做关联——把服务器返回的动态值提取出来存成变量在后续请求里引用。// 从登录响应中提取 token web_reg_save_param(auth_token, LB\token\:\, RB\, SearchBody, LAST); // 后续请求中引用提取到的 token web_add_header(Authorization, Bearer {auth_token});web_reg_save_param 必须写在产生该响应的请求之前这是 VuGen 的注册机制决定的。LB 和 RB 是左右边界要跟实际响应报文完全匹配差一个字符就提取不到。提取失败时脚本不会报错但后续请求会因为 token 为空而返回 401这种问题排查起来很费时间建议每次改完关联都单独回放验证一次。4. 压测执行与场景设计并发、持续时间和监控4.1 Controller 场景配置脚本调通后打开 LoadRunner11 的 Controller把脚本加载进来开始设计压测场景。场景设计主要定三个参数虚拟用户数、加压方式、持续时间。虚拟用户数根据后端服务器的承载预期来定第一次压测建议从 50 或 100 起步观察系统表现后再逐步往上加。加压方式选「Gradual」渐进式比如每 15 秒增加 10 个用户这样能看到系统在不同负载下的响应曲线而不是一上来就被打满。持续时间一般设 10 到 30 分钟。太短了系统还没进入稳定状态就结束了太长了浪费资源。如果要做稳定性测试可以拉到 1 到 2 小时。# Controller 场景关键参数参考 # 初始用户数10 # 每 15 秒增加10 个用户 # 最大用户数200 # 持续时间15 分钟 # 停止方式每 15 秒停止 10 个用户4.2 压测期间要盯的指标压测跑起来后不能只看最后的结果报告过程中要实时盯几个关键指标。Controller 自带的监控面板能看到 TPS、响应时间、错误率但这些还不够后端服务器的 CPU、内存、数据库连接数、慢查询也要同步看。常见做法是在压测机上开一个终端跑 top 或 nmon同时让 DBA 那边盯着数据库的活跃连接和慢日志。压测出问题往往不是 LoadRunner 本身的问题而是后端某个环节先扛不住了。监控项正常范围异常信号TPS随并发上升后趋于平稳上升到某点后骤降平均响应时间200ms 以内超过 1s 且持续上升错误率低于 0.1%超过 1%服务器 CPU低于 70%持续 90% 以上数据库连接数低于最大连接数的 80%接近或达到上限4.3 结果分析从 Analysis 报告里找瓶颈压测结束后用 Analysis 打开结果文件重点看三张图TPS 趋势图、响应时间分布图、错误率趋势图。TPS 曲线如果在某个并发点开始走平甚至下降说明系统达到了处理上限。响应时间分布图能看出是大部分请求都慢还是少数请求拖了后腿。有个容易被忽略的点Analysis 里的响应时间包含了网络传输时间。如果压测机和被测服务器不在同一机房网络延迟会混进结果里。判断方法是看最小响应时间如果最小值都有几十毫秒那基本是网络开销不是后端处理慢。5. 避坑与排查录制、迁移、压测中的常见翻车点5.1 录制时抓不到包现象手机操作了 APP但 VuGen 里没有任何请求记录。原因通常有三个手机代理没设对、端口被防火墙拦了、APP 走了 HTTPS 但证书没装。先检查手机代理的 IP 和端口是否和 VuGen 里填的一致再确认录制电脑的防火墙有没有放行该端口。如果是 HTTPS 请求需要在手机上安装 LoadRunner 的代理证书否则请求内容会被加密VuGen 只能看到 CONNECT 请求而看不到具体报文。5.2 脚本迁移后回放报「函数未定义」现象12 录的脚本在 11 里打开回放时报某个函数找不到。原因是 12 的脚本里可能引用了新版本才有的函数或头文件。解决办法是找到报错的那行查一下这个函数在 11 里有没有替代写法。大部分情况下是 web_add_header 或 web_reg_save_param 的参数格式差异把多出来的参数删掉就能兼容。如果实在找不到替代就把那行注释掉看是否影响主流程。5.3 压测时错误率飙升但服务器指标正常现象Controller 里错误率超过 10%但后端 CPU、内存、数据库都很闲。这种情况大概率是脚本本身的问题不是服务器扛不住。常见原因是参数化数据不够几百个虚拟用户循环取几十组账号导致大量请求因为账号重复被服务端拒绝。另一个可能是关联没做好token 过期后没有重新获取后续请求全部 401。排查方法是把虚拟用户降到 1 个单独回放脚本看是否报错。5.4 并发上不去TPS 卡在某个值现象虚拟用户数加到 500但 TPS 和 100 用户时差不多。先确认 LoadRunner 的 license 是否支持这么多并发。LoadRunner11 的免费 license 虽然标称 6.5 万但实际部署时受机器性能和网络带宽限制。压测机本身的 CPU 和内存如果不够生成不了那么多并发请求。另外检查一下脚本里是否有 think time如果每个请求之间等了 5 秒那并发数再高 TPS 也上不去。在 Controller 里把 think time 忽略掉再跑一次对比。5.5 压测结果波动大每次跑都不一样现象同样的脚本和场景两次压测的 TPS 差了一倍。压测结果受环境影响很大。如果压测机和被测服务器之间有其他流量或者数据库同时在跑其他任务结果就会不稳定。建议压测前确认环境干净关掉不必要的后台任务。另外第一次压测往往受缓存影响偏乐观第二次才是真实水平。我一般会连续跑三次取后两次的平均值作为参考。6. 把脚本跑稳的几个进阶习惯脚本调通只是第一步真正让压测结果可信的是后面这些细节。第一个习惯是给脚本加检查点。不要只看 HTTP 返回码是不是 200很多接口出错时也返回 200但响应体里是错误信息。在关键请求后面加 web_reg_find 检查特定字符串找不到就标记失败这样错误率才真实。// 在登录请求后加检查点确认返回了 token web_reg_find(Text\token\, SaveCounttoken_found, LAST); // 后续判断 if (atoi(lr_eval_string({token_found})) 0) { lr_error_message(登录失败未返回 token); lr_exit(LR_EXIT_ITERATION_AND_CONTINUE, LR_FAIL); }第二个习惯是分阶段加压。不要一上来就 500 并发先跑 50 看基线再跑 100 看线性度再跑 200 看拐点。每次只改一个变量这样才能定位到瓶颈出现在哪个量级。第三个习惯是记录每次压测的完整参数。脚本版本、并发数、持续时间、参数化数据量、后端服务版本这些都要记下来。不然过两周回头看结果根本想不起来当时的环境是什么样。第四个习惯是压测完立刻导出 Analysis 报告并备份原始结果文件。LoadRunner 的结果文件很大但删了就真没了。我吃过一次亏压测跑完觉得结果不理想想调整参数重跑结果把原始结果覆盖了后来想对比都找不到基准。最后一个习惯是关于 think time 的。真实用户操作 APP 时每个请求之间是有间隔的但压测时如果保留这个间隔并发数就要设得很大才能压出效果。我的做法是压测时把 think time 设为 0先测出系统的极限处理能力然后再按真实用户行为模型折算需要的并发数。这样既能摸到天花板又能推算出实际部署需要多少资源。从那以后我每次做压测都会先把脚本在单用户下跑通、加好检查点、确认参数化和关联都生效再开始上并发。这个顺序反过来做后面全是坑。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Agent规模化落地:执行环境才是第一道坎

Agent规模化落地:执行环境才是第一道坎

1. 为什么Agent规模化,第一关就卡在执行环境过去大半年,我一直在用DeepSeek现成的API做Agent类项目。说实话,单机版玩Agent,体验是相当愉快的:模型推理能力在线、上下文窗口够用、工具调用也越来越稳,几个关…

2026/10/14 6:59:33 阅读更多 →
纯白主题紧凑型主机装机避坑指南

纯白主题紧凑型主机装机避坑指南

“男孩子的婚纱”这句话,第一次听到时我笑了,笑完之后又觉得特别贴切。攒钱、选件、等快递、拧螺丝、理线、反复点亮又拔掉重来,最后把侧板盖上,按下开机键的那一下整台机器亮起来——那个瞬间的满足感,真的不亚于新娘…

2026/10/14 6:59:33 阅读更多 →
限制性三体问题数值仿真:从平动点到混沌轨道的工程实践

限制性三体问题数值仿真:从平动点到混沌轨道的工程实践

我最早被这个题目绊住,是A同学拿一个半成品代码来问:为什么轨道一旦靠近其中一颗主星,几秒之后就彻底崩了。那个代码写的是平面限制性三体问题——两个大质量天体在同一个平面内绕公共质心匀速转动,第三个小质量天体只受它们的引力…

2026/10/14 6:59:33 阅读更多 →

最新新闻

Java Lambda不只是语法糖:从字节码到序列化的工程实践

Java Lambda不只是语法糖:从字节码到序列化的工程实践

1. Lambda身后的字节码:语法糖背后的真实身份1.1 先说结论:Lambda不完全是"匿名内部类的简写"很多Java开发者对Lambda最早的认知,就是"可以用Lambda代替匿名内部类,代码更简洁"。这个说法在80%的日常场景下是…

2026/10/14 7:51:44 阅读更多 →
融合虚拟储能的楼宇微网优化调度:Matlab代码实现深度解析

融合虚拟储能的楼宇微网优化调度:Matlab代码实现深度解析

“融合需求侧虚拟储能系统的楼宇微网优化调度”这个项目,听起来像是又一篇把关键词堆在一起的论文标题,但真正把它落到Matlab代码里跑通之后,我才意识到这里面其实藏着一个很值得展开的工程命题。这个项目做的事情,通俗说就是把楼…

2026/10/14 7:51:44 阅读更多 →
Java毕业设计:校园招聘管理系统需求分析、数据库设计与核心代码实战

Java毕业设计:校园招聘管理系统需求分析、数据库设计与核心代码实战

写毕业设计选题目的时候,"校园招聘管理系统"很容易被当成一个平平无奇的CRUD项目。但只要你真的去参加过学校组织的双选会,或者蹲在就业办看过辅导员怎么手动核对企业资质和岗位表,你就会发现:这个场景里的业务复杂度&a…

2026/10/14 7:51:44 阅读更多 →
KUKA机器人通过EtherNet/IP对接OMRON相机:通讯配置与IO映射实战

KUKA机器人通过EtherNet/IP对接OMRON相机:通讯配置与IO映射实战

简介:这份文档面向工业自动化工程师与机器人集成调试人员,聚焦KUKA机器人与OMRON工业相机之间基于EtherNet/IP协议的通讯配置,解决视觉引导场景下设备互联与数据映射的实际问题。内容围绕KRC4 EtherNet IP V2.0以上通讯软件的安装、Wov总线结…

2026/10/14 7:51:44 阅读更多 →
打卡信奥刷题(3628)用C++实现信奥题 P11860 [CCC 2025 Senior] 熔岩路 / Floor is Lava

打卡信奥刷题(3628)用C++实现信奥题 P11860 [CCC 2025 Senior] 熔岩路 / Floor is Lava

P11860 [CCC 2025 Senior] 熔岩路 / Floor is Lava 题目背景 译自 CCC 2025 Senior T4。本题满分为 151515。 题目描述 你被困在一个炽热的地牢中。 地牢由 nnn 个房间组成,房间编号 1∼n1\sim n1∼n。这些房间通过 mmm 条双向隧道相连,第 iii 条双向隧道…

2026/10/14 7:51:44 阅读更多 →
Vulkan多重采样技术:原理与性能优化实践

Vulkan多重采样技术:原理与性能优化实践

1. 多重采样技术背景与核心价值在实时图形渲染领域,锯齿(Aliasing)问题一直是影响视觉质量的关键瓶颈。当高分辨率几何边缘或纹理细节在低分辨率帧缓冲中渲染时,由于采样率不足导致的锯齿现象会显著降低画面品质。传统解决方案如超…

2026/10/14 7:50:43 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →