在并发组中的函数不是立即执行的。在并发组开始时,所有的函数首先被记录下来,当并发组结束时,所有的函数并发执行。正因为这样,我们使用的时候要注意,不是所有的函数或代码都可以放到并发组内的,比如lr_output_message函数的调试输出,如果放到并发组内,你将会得到错误的输出(有不少新手都碰到这样的问题,所以有必要在这提出):
举例以下脚本:
web_concurrent_start(NULL);
web_url("getWidgetList.do",
"URL=http://172.17.2.33:8090/dashboard/getWidgetList.do",
"Resource=1",
"RecContentType=application/json",
"Referer=http://172.17.2.33:8090/starter.html",
"Snapshot=t254.inf",
LAST);
web_reg_save_param("deleteID",
"LB={\"id\":",
"RB=,\"userId\"",
"Ord=All",
"NotFound=ERROR",
LAST);
web_reg_save_param("subjectID",
"LB=\"subjectId\":\"",
"RB=\",",
"Ord=All",
"NotFound=ERROR",
LAST);
web_reg_save_param("responseBody",
"LB=",
"RB=",
"NotFound=ERROR",
LAST);
web_url("getBoardListNoDelFlag.do",
"URL=http://172.17.2.33:8090/dashboard/getBoardListNoDelFlag.do",
"Resource=1",
"RecContentType=application/json",
"Referer=http://172.17.2.33:8090/starter.html",
"Snapshot=t255.inf",
LAST);
web_url("getWidgetList.do_2",
"URL=http://172.17.2.33:8090/dashboard/getWidgetList.do",
"Resource=1",
"RecContentType=application/json",
"Referer=http://172.17.2.33:8090/starter.html",
"Snapshot=t256.inf",
LAST);
lr_output_message("deleteID: %s", lr_eval_string("{deleteID_count}"));
lr_output_message("subjectID: %s", lr_paramarr_idx("subjectID",1));
lr_output_message("responseBody: %s", lr_eval_string("{responseBody}"));
web_concurrent_end(NULL);
输出的结果如下:
太让人崩溃了,明明显示reg成功了,怎么参数输出结果为0(Response Body也为空)!
我们只要把以上的lr_output_message位置调整一下,放到web_concurrent_end(NULL);后面:
web_concurrent_end(NULL);
lr_output_message("deleteID: %s", lr_eval_string("{deleteID_count}"));
lr_output_message("subjectID: %s", lr_paramarr_idx("subjectID",1));
lr_output_message("responseBody: %s", lr_eval_string("{responseBody}"));
你就能看到你想要的结果了:
这是在应用Loadrunner中有些人会遇到的一个很小很小的坑,但也足够让人好一顿调试和四处搜索解决答案了。其实避免这样的错误,只要我们理解好web_concurrent并发组的原理,并且明确除了以上提到函数,其他都不要放到并发组内。
附上并发组函数的语法:
1、int web_concurrent_start ( [char * ConcurrentGroupName,] NULL );
参数:
ConcurrentGroupName:可选的,并发组的标识符。
NULL:参数列表结束的标记符。
返回值
整型。返回LR_PASS (0)表示成功,返回LR_FAIL (1)表示失败。
2、int web_concurrent_end ( reserved );
参数:
reserved:保留的供扩展的字段。
返回值
整型。返回LR_PASS (0)表示成功,返回LR_FAIL (1)表示失败。