A. 全局变量
实验1:
globals.h
#ifndef _GLOBALS_H
#define _GLOBALS_H
//--------------------------------------------------------------------
// Include Files
#include "lrun.h"
#include "web_api.h"
#include "lrw_custom_body.h"
//--------------------------------------------------------------------
// Global Variables
int int_var = 0;
#endif // _GLOBALS_H
Action
Action()
{
lr_rendezvous("lre");
lr_start_transaction("sum");
int_var = int_var 1;
lr_save_int(int_var, "value_for_int_var");
lr_output_message(lr_eval_string("value_for_int_var = {value_for_int_var}"));
if (strcmp(lr_eval_string("{value_for_int_var}"), lr_eval_string("{IterationNumber}")) == 0) {
lr_end_transaction("sum", LR_PASS);
}
else{
lr_end_transaction("sum", LR_FAIL);
}
return 0;
}
场景中,加载上述脚本,设置6个用户,迭代运行2次,查看日志输出。
结果:每个用户的全局变量的取值日志都一样,先输出 "value_for_int_var" = "1",然后输出"value_for_int_var" = "2"
结论:针对全局变量,针对场景中的每个用户,全局变量的取值互不干扰,相当于说,每个用户都有一个自己的全局变量,变量名称,变量的初始值都一样,每个用户负责更新自己的全局变量的值。
实验2:
globals.h
#ifndef _GLOBALS_H
#define _GLOBALS_H
//--------------------------------------------------------------------
// Include Files
#include "lrun.h"
#include "web_api.h"
#include "lrw_custom_body.h"
//--------------------------------------------------------------------
// Global Variables
int vuser_id;
#endif // _GLOBALS_H
Action
Action()
{
lr_rendezvous("lre");
vuser_id = func();
lr_output_message("action vuser_id: %d", vuser_id);
return 0;
}
# 模拟服务器返回数据
func()
{
int i = 0;
int vuserID = atoi(lr_eval_string("{vuserID}"));
lr_output_message("action vuserID: %d", vuserID);
//添加以下代码,模拟服务器处理请求
for(i=0;i<100;i ){
lr_output_message("测试测试");
}
return vuserID;
}
注:{vuserID},参数化值取的是Paramter List中的VuserID
Action2
模拟把服务器返回结果当作下一步的输入来使用
Action2()
{
int vuserID;
int result;
lr_start_transaction("compare");
vuserID = atoi(lr_eval_string("{vuserID}"));
result = function(vuser_id, vuserID);
if (result == 1) {
lr_end_transaction("compare", LR_PASS);
}
else{
lr_end_transaction("compare", LR_FAIL);
}
return 0;
}
function(vuser_id, vuserID)
{
lr_output_message("action2 vuserID: %d, vuser_id: %d", vuserID, vuser_id);
if(vuserID == vuser_id){
return 1;
}else{
return 0;
}
}
把上述脚本加载到场景中,设置10000个用户并发,迭代一次
结果: 如下,没有失败的事务
结论:场景中,每个并发用户负责自己的数据结果。简单说,假如有一定量(假设10000)的并发用户,发起同一个请求,获取服务返回数据(比如Token),然后在下一个操作中使用该Token值,这种情况下,每个虚拟用户获取的Token值都是来自它发起请求后,服务器返回的Token,即不会把其它用户的Token当做自己的Token在下一个步骤中使用。
B. 关联参数
基于A中的实验结果,关联参数的取值也是一样的,所以,并发场景下,也可以通过关联函数web_reg_save_param获取服务器的返回结果,并在下一个步骤中使用