Loadrunner脚本读取 XMl 文件

news/2023/6/10 22:06:06

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

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

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

<employee>

    <id>[0]</id>

    <name>{2}</name>

    <add>beijing</add>

    <age>20</age>

</employee>

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

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

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

#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 数据

 

转载于:https://www.cnblogs.com/qmfsun/p/4512001.html


https://dhexx.cn/news/show-16350.html

相关文章

06-jvm-堆

目录 6.1 堆的核心概述 6.2 设置堆内存大小与OOM 6.3 年轻代与老年代 6.4 图解对象分配过程 6.5 Minor GC,Major GC,Full GC 6.6 堆空间分带思想 6.7 内存分配策略 6.8 为对象分配内存:TLAB 6.8.1为什么有TLAB(ThreadLocal Allocation Buffer) 6.8.2 什么是TLAB? 6…

标签库

ThinkPHP 模版中的标签库&#xff0c;我们使用的很多内置标签就是通过标签库声明而来的&#xff0c;当然还可以自定义扩展标签。 一&#xff0e;内置标签 模版中的这些内置标签是是在 ThinkPHP/Library/Think/Template/TagLib 下 在完整版中提供了两个类文件&#xff1a; Cx.…

idea 自动定位类所在目录_中国自动化学会推荐的A类和B类学术期刊目录(包含国产和外文)...

中国自动化学会于2018年7月31日发布了《中国自动化学会推荐学术期刊目录(试行)》&#xff0c;主要包含自动化学科领域11个细分领域的302份学术期刊&#xff0c;11个细分领域为&#xff1a;(1)控制理论与控制工程&#xff1b;(2)模式识别与智能系统&#xff1b;(3)检测技术与自动…

绿盟数据库审计系统hive_案例|绿盟DAS助力某高校数据库安全防护加固

一、项目背景某985高校数据库安全防护建设中&#xff0c;通过部署绿盟数据库审计系统(NSFOCUS Database Audit System&#xff0c;简称DAS)&#xff0c;切实加快了数据库安全相关事件的响应速度&#xff0c;提高了内部监管力度&#xff0c;满足等保合规的同时有效解决非法访问监…

学会这些方法,扩展磁盘分区还不是轻轻松松?

大家在网上冲浪时应该都或多或少地会遇到这些问题&#xff0c;就是说自己的C盘空间不足。这确实是一个比较常见的状况&#xff0c;那么为什么会出现这种问题呢&#xff1f; 一般来说&#xff0c;电脑桌面其实是归C盘管的&#xff0c;很多人在下载了东西之后喜欢直接丢在桌面上…

分布式架构的演进

著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。作者&#xff1a;李小翀链接&#xff1a;http://www.zhihu.com/question/22764869/answer/31277656来源&#xff1a;知乎 系统架构演化历程-初始阶段架构 &amp;lt;img data-rawheight"…

Spring-创建完bean之后自动回调里面的方法

目录 1.实现SmartInitializingSingleton接口,具体原因解释如下: 2.实现ApplicationListener接口:基于监听器解决问题,具体原因解释如下: 在公司统一配置中心客户端的程序代码中,遇到了这么一个问题:将所写的客户端程序打成jar后放到客户端里面,创建完Bean之后需要自动回调里面的…

最好的船_充气船垂钓注意事项

点击上方中国钓鱼&#xff0c;上鱼更快、鱼获更多文字 | 中国钓鱼图片 | 网络本人自从1980年开始&#xff0c;一直使用充气船垂钓。现就30年来使用充气船安全垂钓的一些体会与大家交流。一、必须会游泳。这对于使用充气船垂钓的钓友们来说&#xff0c;是必须的基本条件&#xf…

Springboot基于@Conditional的衍生注解

目录 1.ConditionalOnProperty 2.ConditionalOnBean 3.ConditionalOnMissingBean 4.ConditionalOnClass 5.ConditionalOnMissingClass 6.ConditionalOnSingleCandidate 7.ConditionalOnResource 1.ConditionalOnProperty 通过配置…

打破双亲委派机制有什么用_呜,双亲委派模式伤心史

一、前言双亲委托模式不是固定死的&#xff0c;它就是Java指定的一个类加载的一个规则&#xff0c;你完全可以不遵守它&#xff0c;只要你能帮类加载到JVM内存中即可。二、双亲委派模式2.1 双亲委派模式的结构JVM类加载机制的结构&#xff0c;即双亲委派模式的结构支持&#xf…