Loadrunner脚本读取 XMl 文件

性能测试工程师要懂代码么?答案是必须的,好多测试员认为在 loadrunner 中编写脚本很难很牛 X 。 好多人认为 loadrunner 只支持 C 语言(包括我之前也一直这么认为),因为 loadrunner 默认的脚本是 C 语言的,其实它支持目前所有主流的语言,如: Java User 、 VB User 、 VB script User 、 Javascript User 、 Mmicrosoft .NET 等,总有一款适合你的吧,最起码 C 语言是必修课吧。

为了测试方便,下面用 C 语言来实现读取 XML 文件,然后通过读取的值进行比较判断。

1. 运行 Virtual User Generator

Loadrunner脚本读取  XMl  文件_性能测试

2. 新建 C User (此代码可用于 webservices )保存为 b-3

Loadrunner脚本读取  XMl  文件_javascript_02

3. 在 D 盘新建 test.xml 文件,内容如下

<employee>

<id>[0]</id>

<name>{2}</name>

<add>beijing</add>

<age>20</age>

</employee>

4. 在 action 中编写读取 xml 代码

Loadrunner脚本读取  XMl  文件_指针传递_03

5. 将下面代码复制到 Action 中的文件中,即可测试 .

Loadrunner脚本读取  XMl  文件_性能测试_04

//*********************** 代码开始 *********************

#define filePath "D:\\test.xml" // 定义文件的路径


int lr_loadXml_strcmp(); // 申明读取 xml 的函数

int * call_webservices(char * opt1,char *opt2);

char *tmpVar="[0]"; // 申明一个全局的临时变量指针

char *param1="a=3"; // 申明调用 webservices 的第一个参数指针

char *param2="b=3"; // 申明调用 webservices 的第二个参数指针

int *p_call_webservices;

//

Action() // 执行的入口

{


p_call_webservices=call_webservices( param1, param2); // 将函数交给指针

if(lr_loadXml_strcmp()==0) // 返回不相等的比较

{

lr_log_message(" 比较正确,请进行业务处理 ");

//p_call_webservices; // 需要一个 webservices 提供两个参数进入加运算


}

else

{

lr_log_message(" 没有找到相关的处理请求 ");

}


return 0;

}


// 下面这个函数,只是为了演示参数可以指针传递

int * call_webservices(char * opt1,char *opt2)

{

int j=0;

for (j=0;j<10;j++) {

web_service_call( "StepName=add_103",

"SOAPMethod=MyServiceImplService|MyServiceImplPort|add",

"ResponseParam=response",

"Service=MyServiceImplService",

"ExpectedResponse=SoapResult",

"Snapshot=t1392023302.inf",

BEGIN_ARGUMENTS,

opt1, //webservice 第一个参数, a=3

opt2,//webservice 第一个参数, b=3

END_ARGUMENTS,

BEGIN_RESULT,

"addResult=Param_addResult", // 返回值 a+b 的值

END_RESULT,

LAST);

lr_log_message("dn");

}

return 0 ;// 暂时返回 0

}


int lr_loadXml_strcmp()

{

long fp;


int total = 0;

int readbufsize = 0;

int count = 0;

int i = 0;



int NumOfReadbuf_1 = 0;

int NumOfReadbuf_2 = 0;

int NumOfReadbuf_3 = 0;

int NumOfReadbuf_4 = 0;


int result=0;




char *readbuf;

char *file = filePath;


// 读取 XML 文件

if ( (fp = fopen(file, "r")) == NULL)

{

lr_message("open logfile failed!\n");

return -1;

}


// 申请 readbuf


readbuf = (char*) calloc(50, sizeof(char));

if (readbuf == NULL)

{

lr_message("Insufficient memory available");

return -1;

}


// 循环读取文件

while(!feof(fp))

{

// 扩展缓冲区

if( readbufsize - total <= 10 )

{

readbufsize += 50;

readbuf = (char*) realloc(readbuf, readbufsize);

}


count = fread(readbuf + total, sizeof(char), 10, fp);


total += count;

}


// 关闭文件句柄

fclose(fp);


// 修改 readbuf 内存值

readbuf = (char*) realloc(readbuf, readbufsize+1);

*(readbuf+total) = '\0';


// 保存参数

lr_save_string(readbuf,"readbuf_param");


// 读取记录

NumOfReadbuf_1 = lr_xml_get_values("XML={readbuf_param}",

"ValueParam=id",

"Query=/employee/id",

"SelectAll=yes",

LAST);


NumOfReadbuf_2 = lr_xml_get_values("XML={readbuf_param}",

"ValueParam=name",

"Query=/employee/name",

"SelectAll=yes",

LAST);


NumOfReadbuf_3 = lr_xml_get_values("XML={readbuf_param}",

"ValueParam=add",

"Query=/employee/add",

"SelectAll=yes",

LAST);


NumOfReadbuf_4 = lr_xml_get_values("XML={readbuf_param}",

"ValueParam=age",

"Query=/employee/age",

"SelectAll=yes",

LAST);


lr_log_message("%s",lr_eval_string("{id_1}")); // 将 xml 中的第一个 id 节点值转为字符串并打印

/*lr_log_message("%s",lr_eval_string("{name_1}"));

lr_log_message("%s",lr_eval_string("{add_1}"));

lr_log_message("%s",lr_eval_string("{age_1}"));

*/


lr_save_string(lr_eval_string("{id_1}"),"getXmlValue");// 将 xml 中第一个 id 节点 {id_1} 的值给 getXmlValue


// 将变量保存为参数 ,tmp 为变量

lr_output_message(lr_eval_string("{getXmlValue}"));

result=strcmp(tmpVar,lr_eval_string("{id_1}"));

if(result==0)

{

lr_output_message(" 成功取得了数据 ");


}else

{

lr_output_message(" 没有成功取得了数据 ");

}


return result; // 返回比较后的值 0 成功

}


//************************* 代码结束

6.run 运行后,控制台显示读取的 xml 数据

Loadrunner脚本读取  XMl  文件_xml_05




作者:Agoly

本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

如果文中有什么错误,欢迎指出。以免更多的人被误导。