前面介绍过在LoadRunner的Java协议实现“使用SSH连接Linux”,当然连接之后的故事由你主导。
今天要讲的,是一个非Java版本。是对“在LoadRunner中执行命令行程序之:popen()取代system()”的一个升华。
下面的脚本,是在LoadRunner里连接Linux/Unix远程服务器,收集其磁盘IO的负载到测试结果中。
涉及到三个知识点:
1、LoadRunner自带“PuTTY Link”的使用,路径为“%LR_PATH%\bin\plink.exe”;
2、Linux/Unix的磁盘监控指令,读者也可以扩展为其它任何实用指令;
3、LoadRunner自带函数lr_user_data_point的使用,保存自定义数据到测试结果。
脚本贴出如下:
#define BUFFER_SIZE 20480 // 初始给它 20 KB
extern char*
strtok(char *token, const char *delimiter); //
显示申明
Action(){
long fp; //
数据流
int count; //
用于保存流长度
char buffer[BUFFER_SIZE]; //
给数据流分配内存空间
char * row_token; //
记录每一行的地址
char field_name[100]; //
第一列的名称
int field_value; //
保存系列的值
char lrudp_name[100]; //
保存LR自定义指标值
int rc; //
保存返回值
lr_start_transaction("DiskIO");//
Linux采样方式: plink -ssh -l username -pw password hostname
command
lr_save_string("higkoo",
"UserName");
lr_save_string("123456",
"Password");
lr_save_string("192.168.10.31",
"Server");
lr_save_string("iostat -xc | awk
‘NR >2 {print $1, $10}‘", "Command"); //
使用iostat拿到磁盘IO的状态信息
lr_save_string(lr_eval_string("\"%LR_PATH%\\bin\\plink\" -ssh -l
{UserName} -pw {Password} {Server} \"{Command}\" 2>&1 "),
"Result"); // 使用plink连接远程Linux服务器并拿到执行结果
fp =
popen(lr_eval_string("{Result}"), "r");
if (fp
== NULL) {
lr_error_message("执行命令失败");
return -1;
}
count
= fread(buffer, sizeof(char), BUFFER_SIZE, fp); //
读取结果
if (feof(fp) == 0)
{
lr_error_message("返回结果太大,请给数据流分配更大内存空间,谢谢!");
return -1;
}
if
(ferror(fp)) {
lr_error_message
("监控指令返回错误");
return
-1;
}
if (count ==
0) {
lr_error_message("监控指令返回结果为熔");
return -1;
}
buffer[count] = NULL;
row_token = (char*)
strtok(buffer, "\n"); // 按换行符分割
if (row_token
== NULL) {
lr_error_message
("未发现有效数据");
return
-1;
}
while
(row_token != NULL) { //
开始读取数据
rc =
sscanf(row_token, "%s %d", field_name, &field_value);
//分割名称与值
if (rc != 2)
{
lr_error_message("Incorrect number of items read from the
row.");
return -1;
}
sprintf(lrudp_name,
"disk_busy_%s", field_name);//
自定义数据的名称
lr_user_data_point(lrudp_name, field_value);//
保存到LR自定义数据
row_token =
(char*) strtok(NULL, "\n");
}
pclose(fp);
lr_end_transaction("DiskIO", LR_AUTO);
}
功能实现了,后面的故事你来讲~~