使用LoadRunner进行性能测试时,掌握一些进阶技巧可以显著提升测试效率和结果的准确性。技巧贯穿于脚本编写、场景设计、结果分析和流程优化等各个步骤。
脚本优化让用户更真
高质量的脚本是性能测试的基础。优化是让脚本更健壮、更贴近真实用户行为。
选择正确的协议:这是最重点的第一步。分析应用技术栈,优先选择Web - HTTP/HTML。对于前后端分离或有大量异步调用的应用,可考虑使用TruClient协议。
录制内容:在Recording Options中过滤掉无关的静态资源请求,如图片、CSS文件等,避免这些请求消耗额外带宽并干扰重点数据。
参数化:将脚本中固定的用户名、密码等数据替换为动态参数,模拟多用户行为。在Parameter List中导入数据文件,并设置合适的取值方法,如Unique(唯一)或Each iteration(每次迭代),以避免数据冲突。
动态关联:处理服务器返回的动态值(如Session ID、Token)是脚本成功回放的重点。可以用web_reg_save_param系列函数来捕获并关联这些值。对于JSON响应,web_reg_save_param_json更为便捷。
封装事务:使用lr_start_transaction和lr_end_transaction准确包裹重要业务操作,以便单独度量其响应时间。注意,必须将lr_think_time(思考时间)放在事务外,以保证事务时间只反映服务端处理时长。
模拟异步通信:对于异步请求,可以通过循环轮询的方式来模拟。具体方法是使用do...while循环反复检查服务器返回的状态标志,直到成功或超时。
场景创建真实的负载模型
脚本决定了单个用户的行为,而场景则决定了成千上万用户怎样访问系统。
创建业务混合模型:在Controller中,为不同的业务脚本分配不同数量的虚拟用户(Vuser),以模拟真实环境中不同业务的比例,如80%用户浏览,20%用户下单。
创建负载模型:使用手动场景(Manual Scenario)精确控制Vuser的加载过程。阶梯式加压(Ramp-up) 是定位短板的利器,它可以平滑地增加负载,帮助你观察系统在哪个并发量下出现性能拐点。
按照三段式调度:一个专业的场景调度应包含 加压 (Ramp-up)、稳态 (Duration) 和 减压 (Ramp-down) 三个阶段,以便清晰地观察系统在各个阶段的表现。
保持场景一致:在测试-分析-调优-再测试的循环中,必须使用完全相同的场景配置,否则前后结果将失去可比性。
负载和业务:通过Pacing(控制迭代间隔)调整TPS(每秒事务数)目的,用Controller的调度控制并发用户数增长,用Think Time模拟用户操作间的停顿。
监控分析和短板定位
测试的目的是发现问题,因此有效的监控和分析非常重要。
创建最小可观测流程:在启用LoadRunner监控的同时,必须接入服务器端监控(如CPU、内存、磁盘IO),并将二者的时间轴对齐,从而在事务变慢时能立即定位到是哪个资源出现了短板。
识别资源短板
CPU短板:如果%Processor Time不断大于95%,或处理器队列长度(Processor Queue Length)超过(CPU重要数+1),则CPU是短板。
内存短板:不断监控内存使用率,如果发现它随时间不断增长且无法回落,一般意味着存在内存泄漏。
应用和网络短板:高错误率(如连接失败、超时)和低吞吐量一般表示应用层、数据库或网络存在问题。
合并图表综合分析:使用Analysis中的Merge Graphs功能,将响应时间图和吞吐量图、资源监控图叠加对比,能更直观地发现内在关联。
工具集成和自动化
将LoadRunner融入CI/CD流程,能极大提升测试的自动化程度和反馈速度。
命令行执行:通过批处理或命令行方式运行场景,是集成到CI/CD流水线(如Jenkins)的基础,可实现无人值守的自动化测试。
集成自动化框架:将LoadRunner和Jenkins等自动化测试框架集成,可以在每次代码创建后自动触发性能测试,实现性能问题的左移和早期发现。
复杂场景
分布式压测:当单台负载机资源不足时,可利用LoadRunner的分布式架构,通过Controller调度多台Load Generator节点来生成更大规模的负载,以测试系统的极限容量。
IP欺骗:开启IP Spoofer功能,让每个虚拟用户使用不同的IP地址,以规避服务器对单一IP的访问限制,使测试更真实。
测试集群动态扩容:针对云原生和微服务架构,可以设计测试场景来证实系统在压力下的自动扩容(Auto Scaling)能力。如,使用阶梯式加压触发扩容,并观察扩容期间和完成后的性能变化。
保证结果稳定:如果压测结果波动很大,先排查脚本稳定性和环境原因。在Run-Time Settings中统一Think Time和Pacing方法,并检查参数化数据是不是存在碰撞。同时,通过充分的“预热”让系统进入稳定状态后再开始采集数据。