使用LoadRunner进行移动应用性能测试是准确模拟真实用户从移动设备发起的完整行为链,而Mobile Application - HTTP/HTML协议正是为此而设计的工具。
1. 为什么是Mobile Application - HTTP/HTML?
这个协议并不是全新协议,而是 Web (HTTP/HTML) 协议的增强扩展:
一个移动设备模拟器:在VuGen脚本中生成并管理移动设备特有的User-Agent、设备标识符(如IMEI)等HTTP头信息,使服务器端识别请求来自移动端。
一个网络流量记录器:录制移动设备和应用服务器之间所有的HTTP/HTTPS通信,包括API调用、静态资源(图片、JS、CSS)加载。
一个原生动作翻译器:将用户在移动应用上的手势操作(点击、滑动)翻译为底层对应的HTTP请求序列。
主要适用于测试移动应用的后端服务性能,即模拟海量移动设备并发访问服务器API、下载数据时的服务器负载情况。并不测试App本身的UI渲染性能或手机硬件消耗。
2. 脚本录制、增强和调试
第一步:环境配置和录制设置
选择协议:在VuGen中创建新脚本,选择 Mobile Application - HTTP/HTML。
配置代理:
在VuGen的录制选项中,将录制方式设置为Proxy: WinINet或Proxy: Socket。
获取测试机(手机或模拟器)的IP,在VuGen中设置代理服务器为该IP,端口(如8888)需和手机上配置一致。
设备代理设置:在移动设备的Wi-Fi设置中,配置手动代理,输入运行VuGen的电脑IP地址和上述端口。
开始录制:在VuGen中开始录制,然后在移动设备上操作被测应用。所有网络流量将被捕获并生成脚本。
脚本技术
录制生成的原始脚本非常脆弱,必须进行处理。
a. 动态参数关联
从服务器响应中提取动态值(如sessionId, token, orderId),供后续请求使用。
c
// 使用web_reg_save_param_ex函数,在请求前注册,从响应JSON中提取token
web_reg_save_param_ex(
"ParamName=userToken",
"LB=\"token\":\"",
"RB=\"",
SEARCH_FILTERS,
"Scope=Body",
LAST);
// 接下来触发产生该响应的请求,如登录请求
web_submit_data("login.api",
"Action=https://www.zmtests.com/login",
"Method=POST",
"EncType=application/json",
"Body={\"user\":\"{username}\",\"pwd\":\"{password}\"}",
LAST);
// 后续请求中使用提取到的token
web_add_header("Authorization", "Bearer {userToken}");
b. 移动设备参数化和模拟
模拟不同设备型号、操作系统、网络制式,来模拟真实的用户群体。
c
// 使用web_set_user_agent直接设置User-Agent,模拟不同设备
web_set_user_agent("Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148");
// 参数化文件devices.dat中可定义多组设备信息
// 在运行时设置中,为每个虚拟用户分配不同的设备数据。
c. 事务和检查点
定义业务操作并证实正确。
c
lr_start_transaction("T02_Add_to_Cart"); // 开始事务
web_custom_request("addCart.api",
"URL=https://www.zmtests.com/cart/add",
"Method=POST",
"Body={...}",
LAST);
// 添加文本检查点,确定添加成功
web_reg_find("Text={\"code\":200}",
"SaveCount=addCart_count",
LAST);
if (atoi(lr_eval_string("{addCart_count}")) > 0) {
lr_end_transaction("T02_Add_to_Cart", LR_PASS);
} else {
lr_end_transaction("T02_Add_to_Cart", LR_FAIL);
}
d. 思考时间和步调
使用lr_think_time模拟用户操作间隔,并使用步调(Pacing)控制迭代频率,来模拟真实的用户使用情况。
3. 场景设计
负载生成器管理:保证有足够资源生成所需的虚拟用户(VUsers)。
虚拟用户行为:
渐进加载:使用Ramp Up逐步增加用户数,观察系统压力变化曲线。
稳态压力:在达到峰值用户数后,维持一段时间,测试系统的不断处理能力。
混合业务场景:将浏览、搜索、下单等不同脚本的用户按一定比例混合,模拟真实用户群体。
移动网络模拟:
在 Runtime Settings -> Network 中,可以模拟不同的移动网络条件,如3G、4G或高延迟、丢包的网络。考虑应用在弱网环境下的表现比较重要。
可以定义带宽、延迟、丢包率等参数。
监控和标准收集:除了默认的VUsers和事务响应时间,必须添加对服务器重点标准的监控,如CPU、内存、应用服务器线程池、数据库连接池等。
4. 结果分析
测试结束后,使用Analysis工具进行深度分析:
性能目的:先对照需求(如“95%的登录事务响应时间应小于2秒”)判断是不是达标。
分析:将事务响应时间图和系统资源监控图(如服务器CPU)进行叠加关联。如,当事务时间陡增时,CPU是不是已饱和?数据库磁盘I/O是不是出现短板?
分析花费的时间:查看Web Page Diagnostics功能,可以分解每个请求的时间花费在网络连接、服务器处理、数据接收哪个步骤。
建议:报告应指出系统的最大并发支撑能力、短板所在(如某API接口、数据库查询),并给出具体的优化建议(如增加缓存、优化SQL语句、调整服务器配置)。
适用架构:此协议最适合测试原生App、混合App(Hybrid) 以及响应式Web应用的后端服务。对于重度依赖WebView的应用,保证录制到WebView内的所有流量。
安全和证书:测试HTTPS应用时,需要在移动设备上安装LoadRunner的根证书,便于解密和录制加密流量。
原生协议:对于极少数使用非HTTP协议(如自定义TCP协议)进行通信的App,可能需要结合Windows Sockets协议进行录制。
集成:可将LoadRunner脚本和Jenkins等CI工具集成,实现性能测试自动化,在每次创建后自动执行标准测试。