LoadRunner脚本编写之一

性能测试工程师要懂代码么?答案是必须的。好多测试员认为在loadrunner中编写脚本很难很牛X ,主要是大多测试人员并未做过开发工作,大学的那点程序基础也忘记的差不多了。还有非计算机专业出身的测试员,所以对代码望都比较望而生畏。

好多人认为loadrunner只支持C语言(包括我之前也一直这么认为),因为loadrunner默认的脚本是C语言的,其实它支持目前所有主流的语言,如:Java User、VB User、VB script User 、Javascript User、Mmicrosoft .NET等,总有一款适合你的吧,最起码C语言是必修课吧。

对于编写loadrunner脚本的态度

现在有一辆自行车放在你的面前,你为显示自己体力很好,每天走路去上班。我骑车只要半小时,而你走路却要2小时,我们的目的是一样的,你是为了让人说你牛呢,还是让人说你傻呢?当然自行车不是万能的,比如,上班的地点在山上,自行车跟本上不去,自然走路就是唯一的选择了。

所以,对于loadrunner脚本,能录制的部分就录制改,不能录制的就手写,但前提是我们要会写脚本。

 认识loadrunner脚本

Loadrunner自带了一个小飞机订票系统

我们先启动 Start Web server 服务,如果启动成功,桌面右下角会有一个绿色的X ,然后打开浏览器访问

http://127.0.0.1:1080/WebTours/下面是我们loadrunner录制一个登录过程

Action()
{
   
    web_url("WebTours",
        "URL=http://127.0.0.1:1080/WebTours/",

        "Resource=0",
       
"RecContentType=text/html",
        "Referer=",
        "Snapshot=t1.inf",
        "Mode=HTML",
        LAST);

lr_rendezvous("集合点");

lr_start_transaction("登陆时间");
    web_submit_form("login.pl",

        "Snapshot=t2.inf",
        ITEMDATA,
        "Name=username",
"Value=test1", ENDITEM,
        "Name=password",
"Value=123456", ENDITEM,
        "Name=login.x",
"Value=59", ENDITEM,
        "Name=login.y",
"Value=5", ENDITEM,
        LAST);
    lr_end_sub_transaction("登陆时间",LR_ABORT);

return 0;
}

上面的代码中有大括号“{}”,返回函数“ return ”,如果你有编程基础的不会说对于上面的代码一点都看不懂。只是上面的脚本没有使用我们平时用到的东西,如定义常量、变量,分支(if....else if....)、循环语句(for...)

下面我们动手写个小程序,一个乘法运算,求员工工资的总合。

#define COUNT 100
#define SALARY 4000

Action()
{
    int total;
    total = COUNT * SALARY;
    lr_output_message("100人合计薪资支出为:%d",total);

return 0 ;
}

#define COUNT 100

#define SALARY 4000  
  定义一个全局常量。

lr_output_message  
 输出语句,这个和我们所学的C 语言不一样,在C中我们会用println 来输入结果。

运行结果:

..........

Starting iteration 1.
Starting action Action.
Action.c(9): 100人合计薪资支出为:400000    ----这里将运行结果打印输出
Ending action Action.
Ending iteration 1.

..........

一个有意思的小程序  
                     
                     
                

当然了,上面的程序太鸡肋了,我只是想表达,loadrunner 也可以运行我们上学时学的那些普通的小程序。他们是一样一样的。

下面看个比较有意思的小程序,通过随即数和分支(选择)语句switch来完成

Action()
{
    int randomnumber;  
    randomnumber = rand() % 3+1;

switch (randomnumber) {
   
    case 1:
       
{
            lr_rendezvous("访问百度集合点");

web_url("www.baidu.com",
        "URL=http://www.baidu.com/",
                "Resource=0",
                    "RecContentType=text/html",

                    "Referer=",

                   
"Snapshot=t12.inf",
                   
"Mode=HTML",
                    EXTRARES,
                    "Url=http://s1.bdstatic.com/r/www/img/i-1.0.0.png",
ENDITEM,
                   
"Url=/favicon.ico", "Referer=", ENDITEM,
                    "Url=http://s1.bdstatic.com/r/www/img/bg-1.0.0.gif",
ENDITEM,
                    LAST);

return 0;

}

case 2:
        {
            lr_rendezvous("访问谷歌集合点");

web_url("www.google.com.hk",
                    "URL=http://www.google.com.hk/",
                   
"Resource=0",
                   
"RecContentType=text/html",
                    "Referer=",

                   
"Snapshot=t10.inf",
                   
"Mode=HTML",
                    EXTRARES,
                    "Url=http://ssl.gstatic.com/gb/images/b_8d5afc09.png",
ENDITEM,
                   
"Url=/images/srpr/logo3w.png", ENDITEM,
                    "Url=/extern_chrome/749e1ce3c3e5f171.js",
ENDITEM,
                   
"Url=/images/swxa.gif", ENDITEM,
                   
"Url=/favicon.ico", "Referer=", ENDITEM,
                    "Url=http://ssl.gstatic.com/gb/js/sem_0e1289051da7e9e3697c2025d9490acd.js",
ENDITEM,
                    "Url=http://www.google.com/textinputassistant/tia.png",
ENDITEM,
                    LAST);

return 0;

}
    case 3:
        {
            lr_rendezvous("访问有道集合点");

web_url("www.youdao.com",
                    "URL=http://www.youdao.com/",
                   
"Resource=0",
                   
"RecContentType=text/html",
                    "Referer=",

                   
"Snapshot=t7.inf",
                   
"Mode=HTML",
                    EXTRARES,
                    "Url=http://shared.ydstatic.com/oxo/p/pic.gif",
ENDITEM,
                    "Url=http://shared.ydstatic.com/oxo/p/logo.png?1",
ENDITEM,
                    "Url=http://shared.ydstatic.com/oxo/p/nv_line.gif",
ENDITEM,
                    "Url=http://shared.ydstatic.com/r/2.0/p/pic.gif",
ENDITEM,
                    LAST);

return 0;
        }
        
    }
   
}

上面的程序,我分别录制了百度、谷歌、有道访问三个网的首页的代码,我想在运行脚本时,随机的去访问其中一个网站,如何做呢?我们通过随机函数,随机出1~3之间的整数,根据随机来的结果,然后执行switch语句中的代码。

下面来看我的结果

为了查看脚本结果更清晰,我在每一段脚本前面加了一个集合点“lr_rendezvous”函数。

Starting iteration 1.
Starting action Action.
Action.c(57): Rendezvous 访问有道集合点
Action.c(59): Downloading resource "http://shared.ydstatic.com/oxo/p/pic.gif"
(specified by argument number 9)     
[MsgId: MMSG-26577]
Action.c(59): Downloading resource "http://shared.ydstatic.com/oxo/p/logo.png?1"
(specified by argument number 11)     
[MsgId: MMSG-26577]
Action.c(59): Downloading resource "http://shared.ydstatic.com/oxo/p/nv_line.gif"
(specified by argument number 13)     
[MsgId: MMSG-26577]
Action.c(59): Downloading resource "http://shared.ydstatic.com/r/2.0/p/pic.gif"
(specified by argument number 15)     
[MsgId: MMSG-26577]
Action.c(59): Found resource "http://shared.ydstatic.com/dao/search/outweb/js/yd.js?201207131"
in HTML "http://www.youdao.com/"      [MsgId: MMSG-26659]
Action.c(59): Found resource "http://shared.ydstatic.com/dao/search/outweb/js/nav.js?201207131"
in HTML "http://www.youdao.com/"      [MsgId: MMSG-26659]
Action.c(59): Found resource "http://shared.ydstatic.com/dao/search/outweb/js/suggest.js?201207131"
in HTML "http://www.youdao.com/"      [MsgId: MMSG-26659]
Action.c(59): web_url("www.youdao.com")
was successful, 30006 body bytes, 3347 header bytes, 39 chunking overhead
bytes      [MsgId: MMSG-26385]
Ending action Action.
Ending iteration 1.

通过脚本读取文件  
                     
                     
                     
     

为了增加语言的强大,高级语言不可以把一个程序的实现从头到尾写到文件里,这样可读性和维护很差,也无法实现团队发,肯定会相互调用接口函数库等。当然,读取文件也是常用的操作,下面我们来看一个读取文件的例子。

我们事先准备一个文件test.txt ,里面随便你输入些什么内容吧!

Action()
{

int count,total=0;
    char buffer [50];
    long file_stream;
    char * filename = "C:\\test.txt"; 
//读取文件的存放位置

//判断是否可以读取文件
    if((file_stream
=fopen(filename,"r"))==NULL)  
    {
        lr_error_message("不能打开%s文件!",filename);

return -1;
    }

while(!feof(file_stream))
    {
       
count=fread(buffer,sizeof(char),50,file_stream);  //从文件中读取50个字符
        total=total+count;   //字符个数计数
        if(total>=50)
        {
            fclose(file_stream);  //关闭文件
            lr_output_message("文件的前50字符:%s",buffer);
            break;  //退出循环
        }

}
    return 0;
}

上面的代码中我加了注释,这里没必须再做解释。

下面来看我的运行结果

Starting iteration 1.
Starting action Action.
Action.c(24): 文件的前50字符:01234567890123456789012345678901234567890123456789
Ending action Action.
Ending iteration 1.

loadrunner难么? 对于有编程基础的一点都不都。我们所要做的就是熟悉loadrunner的常用函数罢了。

LoadRunner脚本编写之一的更多相关文章

  1. LoadRunner脚本编写(转)

    性能测试工程师要懂代码么?答案是必须的.好多测试员认为在loadrunner中编写脚本很难很牛X ,主要是大多测试人员并未做过开发工作,大学的那点程序基础也忘记的差不多了.还有非计算机专业出身的测试员 ...

  2. LoadRunner脚本编写

    性能測试project师要懂代码么?答案是必须的.好多測试员觉得在loadrunner中编写脚本非常难非常牛X ,主要是大多測试人员并未做过开发工作,大学的那点程序基础也忘记的几乎相同了. 还有非计算 ...

  3. LoadRunner脚本编写之三(事务函数)

    LoadRunner脚本编写之三(事务函数) 关于脚本的这块,前两篇都在讲C语言,其实,要整理点实用的东西挺难,在应用中多对录制的脚本分析,但对于新手学脚本确实无从下手. 先贴一个脚本: 完整代码: ...

  4. LoadRunner脚本编写之二

    LoadRunner脚本编写之二 编程基本语法必须要记牢.程序的思想也很重要. 下面来回顾一下嵌套循环例子. Action() {     int  i,j;   //生命两个变量     for ( ...

  5. LoadRunner脚本编写(5)-- 检查点,关联等函数

    LoadRunner脚本编写(5)-- 检查点,关联等函数 http://www.51testing.com/?34866/action_viewspace_itemid_70224.html来继续翻 ...

  6. LoadRunner脚本编写(6)— 数据类型转换和字符串操作

    LoadRunner脚本编写(6)— 数据类型转换和字符串操作 一,数据类型转换 没有使用过C编程的LoadRunner脚本编写者会发现在数据类型转化方面比较困难.下面介绍这方面的知识. 1. 相似函 ...

  7. loadrunner脚本编写经验

    最近写了不少loadrunner脚本,记录一下心得:1 loadrunner脚本基本可以认为就是c语言代码(loadrunner支持不同语言的脚本,默认生成的是用c语言写的脚本)2 loadrunne ...

  8. loadrunner脚本编写http协议

  9. Loadrunner Webservice接口性能测试脚本编写优化总结

    本文主要介绍使用Loadrunner Webservice接口性能测试脚本编写及优化总结. 1.Webservice协议脚本编写流程 下面介绍使用Loadrunner 11调用Webservice接口 ...

随机推荐

  1. 建立一个可以不停地接收客户端新的连接,但不能处理复杂的业务的C/S网络程序

    在Windows平台上主要有两个版本的Socket Api函数:WinSock 1.1和WinSock 2.2 , 2.2版本默认兼容1.1版本,1.1 winsock.h wsock32.lib w ...

  2. zoomeye使用

    简介 ZoomEye是一款针对网络空间的搜索引擎,收录了互联网空间中的设备.网站及其使用的服务或组件等信息. ZoomEye 拥有两大探测引擎:Xmap 和 Wmap,分别针对网络空间中的设备及网站, ...

  3. R树-javascript代码实现过程分析(插入操作)

    R Tree 第一步,创建R树类. 构建一个RTree生成器.用以创建tree对象. 例子:var tree = new RTree(12) var RTree = function(width){ ...

  4. 分布式 一致性Paxos算法(转载)

    比较通俗易懂,可以入门,转载地址是http://www.cnblogs.com/linbingdong/p/6253479.html Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有 ...

  5. linux系统常用命令(一)

    管理 在UNIX/linux系统中,一切皆为文件:若非文件,则为进程.首先认识文件系统: linux文件系统 /var - 经常变化的(variable)文件,诸如日志或数据库等 /usr - 包含绝 ...

  6. UNIX下socket通信 - UDP通信

    一.UNIX下socket通信: socket套接字是一种可以进行网络通信的内核对象,它是一个唯一的标示符,一般称它为socket描述符. 注意:UDP通信需要客户端先发送消息,服务端先进行等待客户端 ...

  7. cookbook 10.1生成随机密码

    任务: 随机地创造出新密码.比如,有时需要给新的用户账号分配新的密码. 解决方案: from random import choice import string def GenPasswd(leng ...

  8. android启动模拟器命令

    参考资料:http://blog.csdn.net/sanjinxiong/article/details/6758222 启动模拟器 首先通过android list avd 查看建好的虚拟设备: ...

  9. Spring——多种方式实现依赖注入

    在Spring的XML配置中,只有一种声明bean的方式:使用<bean>元素并指定class属性.Spring会从这里获取必要的信息来创建bean. 但是,在XML中声明DI时,会有多种 ...

  10. Luogu P5564 [Celeste-B]Say Goodbye (多项式、FFT、Burnside引理、组合计数)

    题目链接 https://www.luogu.org/problem/P5564 题解 这题最重要的一步是读明白题. 为了方便起见下面设环长可以是\(1\), 最后统计答案时去掉即可. 实际上就相当于 ...