LoadRunner正确使用唯一(Unique)参数,是创建高可靠性并发测试的重点。
唯一性原理
LoadRunner的唯一参数实现了一种预分配和隔离机制,而不是动态去重。当选择Unique时,Controller会在情形初始化阶段,根据Allocate...设置将整个数据池切割成互不重叠的独立数据块,分配给各个Vuser或每次迭代。
重点:这种分配是一次性且静态的。一旦分配完成,每个执行单元只能在自己被分配到的数据块内按顺序、随机或唯一方式取数据,无法访问其他单元的数据块。这是实现无冲突的根本,但也对数据量规划提出了精确要求。
精确计算模型和数据规划
避免参数池耗尽错误需要像规划生产系统容量一样精确计算。以下是两种分配方式下的数学模型。
each Vuser(按虚拟用户分配):总数据量 ≥ Vuser总数 × 每个Vuser分配值数量,场景:模拟500用户不断运行30分钟,每用户约执行20次迭代(业务事务)。计算:如果希望每用户每次迭代都用新值,则 每个Vuser分配值数量 = 20。结果:需至少 500 × 20 = 10,000 条唯一数据。
each Vuser and each iteration(按虚拟用户及迭代分配):总数据量 ≥ Vuser总数 × 每次迭代分配值数量 × 计划迭代次数,场景:100用户,每用户执行5次迭代,每次迭代内一个参数出现3次(Each occurrence)。计算:每次迭代分配值数量 = 3。结果:需至少 100 × 3 × 5 = 1,500 条唯一数据。
规划建议:
安全冗余:在实际计算最小值上增加 20%-30% 的冗余,以应对脚本调试、情形微调或突发性重试。
动态数据源:对于超长时长稳定性测试(如24小时以上),可考虑将参数类型设置为 SQL,从数据库序列或应用程序接口实时获取唯一值,但需严格考虑对测试结果带来的性能影响和网络依赖性。
生产级高级配置
在复杂业务情形下,需组合使用多种技术来实现准确模拟。
跨脚本全局唯一性方案
需求:在多脚本混合情形中(如30%用户登录浏览,70%用户搜索下单),保证如用户ID等重点参数在所有业务流中全局唯一使用。
实现:
创建一个所有脚本共用的标准参数文件(如 global_user_id.dat)。
在每个脚本中,对该参数均设置为 Unique + each Vuser。
在Controller情形加载所有脚本后,LoadRunner的调度引擎会自动协调,保证每个Vuser(不管执行哪个脚本)被分配到一个全局唯一的ID块,实现跨业务流的无冲突。
模拟非均匀数据访问
需求:真实情形中,热门商品或常用重点词被访问频率远高于冷门数据。
实现:通过多参数文件和脚本思路控制来模拟。
准备数据:创建两个参数文件:hot_items.dat(存放20%的热门数据)和 cold_items.dat(存放80%的冷门数据)。
控制思路:在脚本中使用随机数控制访问概率。
c
// 示例代码思路
int rand_num = rand() % 100 + 1; // 生成1-100的随机数
if (rand_num <= 80) { // 80%的概率访问热门数据
lr_save_string(lr_eval_string("{hot_item}"), "selected_item");
} else { // 20%的概率访问冷门数据
lr_save_string(lr_eval_string("{cold_item}"), "selected_item");
}
// 后续请求使用 lr_eval_string("{selected_item}") 作为参数
参数设置:hot_item 和 cold_item 参数可设置为 Unique 或 Random,取决于测试目的。
故障排查清单
当出现唯一性冲突或耗尽错误时,可按照以下系统性途径排查:
1. 设计复核:
数据总量是不是满足前述计算公式?复核情形设计的Vuser数、迭代次数和参数分配公式。
参数在脚本单次迭代中是不是被意外多次调用?检查脚本思路,特别是循环和条件判断内的参数使用。
2. 配置证实:
Select next row 是不是确为 Unique?在VuGen中按 Ctrl+L 打开参数列表逐一检查。
Allocate... 方式选择是不是正确?确定是 each Vuser 还是 each Vuser and each iteration。
When out of values 是不是设置为 Abort Vuser?建议设为中止,以便第一时间暴露问题。
3. 运行时证实:
实际分配值是不是符合预期?开启详细日志:在VuGen的 Run-time Settings -> Log 中,启用 Extended log 并勾选 Parameter substitution。回放脚本,在输出日志中观察具体取值。
在分布式负载生成器上,数据文件是不是同步且途径一致?检查所有Load Generator上的参数文件途径、内容及权限是不是完全相同。
4. 数据源检查:
参数文件格式是不是正确?保证 .dat 文件为纯文本,默认以逗号分隔,无多余空行或格式错误。
如果使用数据库参数,连接和SQL语句是不是稳定?在初始化阶段测试数据库连接,保证SQL能返回足量且不重复的数据集。
工业化部署检查清单
在将测试脚本部署到生产测试环境前,请逐项核对:
数据冗余达标:唯一数据总量 = 计算理论最小值 × (1 + 20% 安全冗余)。
配置方法固化:所有唯一参数均已确定并统一分配方法(each Vuser 或 each Vuser and each iteration)。
耗尽方法严格:When out of values 全局设置为 Abort Vuser,杜绝静默循环。
日志证实完成:已通过扩展日志证实前3个Vuser的参数替换值符合业务思路且无重复。
环境一致确定:在分布式负载生成器集群中,参数文件已通过同步工具(如Robocopy)分发至所有机器相同途径。
清理和恢复机制:准备了数据库脚本或系统接口,用于在每次测试执行后,清理或重置由测试数据产生的状态(如注册用户、待支付订单),保障测试可重复执行。