LoadRunner脚本的参数化和关联创建高保真、可复用性能测试脚本,解决了脚本从记录单一操作到仿真多样并发。
参数化模拟真实用户
参数化的本质是用变量替换脚本中的硬编码数据,使每个虚拟用户或每次迭代使用不同数据,避免缓存和服务器优化带来的失真。
1. 参数化数据识别和设计方法
识别数据点:系统化地扫描脚本,识别必须参数化的数据:
身份标识:用户名、用户ID、会话标识。
搜索和查询输入:产品名称、重点词、日期范围、挑选条件。
交易数据:账号、订单号、金额、收货地址。
动态表单字段:隐藏域、时间戳、防重放令牌。
数据文件设计和生成:
来源真实:数据应尽可能从生产环境脱敏导出,或使用脚本按业务规则生成。如,用户名应有前缀后缀,地址应符合真实格式。
数据量分布:数据行数需满足 (虚拟用户数 × 迭代次数) + 安全余量。对于搜索词等数据,应模拟“长尾分布”-少数热门词汇被高频访问,大量冷门词汇低频出现。
文件格式:优先使用.dat或.csv文件。在文件第一行定义列名,如:{username}, {password}, {productId}。
2. 参数配置方法
在Parameter List中,每个参数的配置都是模拟的重点:
参数类型选择:
File:最常用,用于大多数需要大量、可变数据的情形。
Table / SQL:直接从数据库实时读取数据,保证数据状态最新,常用于测试依赖实时库存或状态的流程。
Unique Number:生成唯一的数字序列,常用于生成不重复的订单号或ID。
Random:在一定范围内随机取值,适用于如浏览随机页码等情形。
数据更新和分配方式:
这两个设置的组合决定了数据怎样在虚拟用户和迭代间分配。
更新:
Each iteration:每次迭代更新参数值。这是模拟用户连续操作不同数据的标准方式。
Each occurrence:参数每次被使用时都更新。适用于一个迭代中多次使用不同值的情形。
Once:在整个运行期间,每个虚拟用户只取一次值。适用于模拟用户登录后身份不变。
分配方式:
Sequential:顺序读取。适用于需要保证数据唯一且简单的情况。
Random:随机读取。模拟真实用户的不确定性。
Unique:保证每个虚拟用户或每次迭代取到的值是全局唯一的。这是避免数据冲突的设置。必须和“Allocate X values for each Vuser”配合,预先为每个用户分配一个独立的数据块。
3. 高级参数化
数据依赖和组合:使用多个参数文件,并通过{Param1}_{Param2}的方式进行组合。如,姓和名分开参数化,再组合成完整姓名。
参数处理:在脚本中使用C语言思路对参数进行处理。如,使用 lr_save_string 函数将格式化后的日期字符串保存为新参数。
关联技术处理动态服务器响应
关联用于捕获服务器响应中的动态值,并将其作为参数提交给后续请求。
1. 动态值识别和捕获方法
识别需关联的动态值:
会话标识:JSESSIONID, ASPSESSIONID, VIEWSTATE, __RequestVerificationToken。
安全令牌:csrfToken, access_token, nonce。
服务器生成ID:订单号、流程实例ID、证实码。
方法:对比两次录制同一业务流程的脚本(使用不同数据),所有差别点一般就是需要关联的动态值。
选择关联函数:
注册型函数(推荐):如 web_reg_save_param_ex。此类函数在下一个动作函数(如web_url)执行之前,预先注册一个“钩子”,从接下来的服务器响应中捕获数据。这是LoadRunner关联的标准做法。
脚本示例:
c
// 在请求前注册,准备从响应中捕获
web_reg_save_param_ex(
"ParamName=CorrelationParam",
"LB=name=\"csrf_token\" value=\"", // 左边界:要捕获文本的左邻字符串
"RB=\"", // 右边界:要捕获文本的右邻字符串
"Search=Body",
"IgnoreRedirections=Yes",
LAST);
// 执行请求,响应中的csrf_token会被自动捕获到 `CorrelationParam` 参数中
web_submit_form("submit.php", ...);
// 在后续请求中使用捕获到的参数值
web_submit_data("process.php",
ITEMDATA,
"Name=csrf_token", "Value={CorrelationParam}", ENDITEM,
...);
2. 关联函数配置
边界定位:
LB 和 RB 必须唯一、稳定地标识出动态值。一般选择其左侧和右侧的固定字符串。
对于JSON响应,边界可能是 "orderId":" 和 "。
使用 ORD 属性处理同一响应中出现多次的相同边界,如 "ORD=All" 捕获所有一致项到数组中。
搜索范围:Search 属性可指定在 Headers、Body、NoResource(仅主资源)或 All 中搜索。
数组:当需要捕获一组动态值(如查询结果列表的所有ID)时,使用数组参数。通过 {ParamName_1}、{ParamName_2}... 访问。
3. 调试
日志:在运行时设置中开启 Extended log 并勾选 Parameter substitution。回放脚本,在日志中确定参数是不是被正确捕获和替换。
自动关联扫描:录制后使用 Scan for Correlation 功能,但不能完全依赖它。结果还需人工逐一核对,自动关联可能遗漏或误关联。
关联标准:当脚本回放失败,查看失败请求的响应。如果其中包含一个本应在上一步响应中出现的动态值,则几乎可以肯定关联遗漏或失败。