LoadRunner脚本编写之二

编程基本语法必须要记牢。程序的思想也很重要。

下面来回顾一下嵌套循环例子。

Action()
{
    int 
i,j;   //生命两个变量
    for (i=1;i<=5;i++)   //第一重循环,循环5次
    {
        if (i==3)   
            break;   //当i等于3时,跳出本重循环
        else
             lr_output_message("i=%d",i);  //否则,输入i的值

for (j=1;j<=5;j++)  //第二重循环,循环5次
        {
            if (j==2)  
                break;   //当j等于2时,跳出本重循环
            else
            
lr_output_message("j=%d",j); 
//否则,输入j的值
        }
    }
}

上面的代码中我加了注释,这里就不用再解释。

运行结果:

Starting iteration 1.
Starting action Action.
Action.c(9): i=1
Action.c(16): j=1
Action.c(9): i=2
Action.c(16): j=1
Ending action Action.
Ending iteration 1.

函数
                     
                     
                     
              

函数,通常 一小段C语言程序仅有一个main()函数组成。然而,在实际编写应用程序中,需要开发人员编写大量的用户自定交函数,不仅要在程序中定义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用,与用户自定义函数相对应的是函数库,C语言集成开发环境(IDE)提供,我们只要调用就是行了。就就所谓前人种树,后人乘凉,不然看似一个简单的东西,寻其源头来做,都是一个相当复杂的过程。

void SsyHello()  //打招呼函数
{
    lr_output_message("hello
%s",lr_get_host_name());
}

int GetBigger(int x,int y)  //得到最大值函数
{
    if (x>y) {
        return x;
    }
    else{
        return y;
    }

}

Action(){
    int x=10,y=20, result;   //声明变量

SsyHello();  //无形参,无返回值函数
    result = GetBigger(x,y);
   
lr_output_message("GetBigger(%d,%d)=%d",x,y,result);  //带形参,带返回值函数

return 0;
}

上面的程序加注解了,简单来说就是前面定义了两个函数SsyHello() 和 GetBigger(),主函数Action()对前面两个函数进行调用。

运行结果:

Starting iteration 1.
Starting action Action.
Action.c(4): hello 2011-20120624YO
Action.c(23): GetBigger(10,20)=20
Ending action Action.
Ending iteration 1.

动态存储方式与静态存储方式
                     
                     
  

我们在定义变量时,根据定义的位置不同,分为全局变量与局部变量。我出生在一个叫“舞阳”的小县城,在这个县城中也有人名“舞阳”,前一个作用于整个县城,后一个只作用于他个人。那么从变量值的存在生存期角度,又可分为静态存储方式和动态存储方式两类。

静态存储方式:是指在程序运行期间分配固定的存储空间方式。

动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式。

用户存储空间可分三部分:

1、程序区

2、静态存储区

3、动态存储区

全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序运行完毕就释放,在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放。

  动态存储区存放以下数据

(1)函数形式参数

(2)自动变量(未加static声明的局部变量)

(3)函数调用时的现场保护和返回地址

上面这些数据,在函数开始调用时分配动态空间,函数结果时释放这些空间。

在C语言中,每个变量和函数有两个属性:数据类型和数据的存储类别

* 自动(auto)变量

函数中的局部变量,如不专门的声明为static存储类别,都是动态地分配存储空间的。

* 静态(static)声明局部变量

有时希望函数中的局部变量的值在函数调用结束后不消失而保留,这时就应该指定局部变量为“静态局部变量”,用static关键字。

*  寄存器(register)变量

为了提高效率,C语言允许把局部变量的值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register变量。

static int c;

int prime(register int number)   //判断是否为素数
{
    register int flag=1;
    auto int n;
    for (n=2;n<number/2 &&
flag==1;n++) {
        if (number % n==0) flag=0;
    return(flag);   
       
    }
}

demo(int a)    //static、auto变量的演示函数
{
    auto int b=0;
    int d;
    static c=3;
   
b=b+1;
    c=c+1;
    lr_output_message("demo()函数中的d=%d",d);
    lr_output_message("demo()函数中的static c=%d",c);
    return a+b+c;

}
Action(){
    int a=2,i;   //变量声明

for (i=0;i<3;i++) {
        lr_output_message("demo()函数部分第%d运行情况如下:",i+1);
        lr_output_message("函数demo运行结果为:%d",demo(a));
       
lr_output_message("-------------------\n\r");
    }

//判断13是否为素数,并输出提示信息
    if (prime(13)==0)
        lr_output_message("13不是素数!");
    else
        lr_output_message("13是素数!");

lr_output_message("c=%d",c);  //输入变理的值

return 0;
}

素数:指大于1的自然数,除了1和它本身不能被其它数整除的数。prime()函数部分主要用来判断传入的数是否是素数。

demo()函数用来做static和auto类型的变量演示。Action()函数用于调用与输入结果。

运行结果

Starting iteration 1.
Starting action Action.
Action.c(31): demo()函数部分第1运行情况如下:
Action.c(22): demo()函数中的d=51446257
Action.c(23): demo()函数中的static c=4
Action.c(32): 函数demo运行结果为:7
Action.c(33): -------------------

Action.c(31): demo()函数部分第2运行情况如下:
Action.c(22): demo()函数中的d=51446257
Action.c(23): demo()函数中的static c=5
Action.c(32): 函数demo运行结果为:8
Action.c(33): -------------------

Action.c(31): demo()函数部分第3运行情况如下:
Action.c(22): demo()函数中的d=51446257
Action.c(23): demo()函数中的static c=6
Action.c(32): 函数demo运行结果为:9
Action.c(33): -------------------

Action.c(40): 13是素数!
Action.c(42): c=0
Ending action Action.
Ending iteration 1.

指针
                     
                     
                     
                    

指针是C语言中广泛使用的一种数据类型,指针可以使我们的程序变得非常灵活,但也让不少程序员头痛,一不小心就会使程序出错。

指针一般指向一个函数或一个变量。在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的变量或函数的值。

有一本很厚小说,为了便于读者找到某一段内容,我们会给某一段内容起一个小标题并标注上页数。这样找起来就非常方便了。那在内存中,小标题页数就相当于内存单元的指针,具体的小说内容就是内存单元的内容。

Action(){
    int score[5]={100,98,78,55};   //一维数组
    int *p=score;         //一维数组指针
    int
sixnum[2][3]={{1,2,3},{4,5,6}};  //二维数组
    int (*p1)[3];        //二维数组指针
    int i,j;      //定义两个变量

for (i=0;i<=4;i++) {
       
lr_output_message("score[%d]=%d",i,score[i]);  //以下标形式标识数组
       
lr_output_message("*(p++)=%d",*(p++));   //以指针方式输出数组
    }
   
lr_output_message("--------------------------");

p=score;
    for (i=0;i<=4;i++) {
        lr_output_message("score[%d]=%d",i,score[i]);  //以下标形式标识数组
       
lr_output_message("*(p+%d)=%d",*(p+i));   //以指针方式输出数组
    }
   
lr_output_message("--------------------------");

p1=sixnum;
    for (i=0;i<=1;i++) {
        for (j=0;j<=2;j++) {
             lr_output_message("sixnum[%d][%d]=%d",i,j,sixnum[i][j]);   //以下标形式标识数组
            
lr_output_message("*(*(p1+%d)+%d)=%d",*(*(p1+i)+j));  //以指针方式输出数组
        }

}
   
    return 0;
}

运行结果

Starting iteration 1.
Starting action Action.
Action.c(11): score[0]=100
Action.c(12): *(p++)=100
Action.c(11): score[1]=98
Action.c(12): *(p++)=98
Action.c(11): score[2]=78
Action.c(12): *(p++)=78
Action.c(11): score[3]=55
Action.c(12): *(p++)=55
Action.c(11): score[4]=0
Action.c(12): *(p++)=0
Action.c(14): --------------------------
Action.c(18): score[0]=100
Action.c(19): *(p+100)=0
Action.c(18): score[1]=98
Action.c(19): *(p+98)=0
Action.c(18): score[2]=78
Action.c(19): *(p+78)=0
Action.c(18): score[3]=55
Action.c(19): *(p+55)=0
Action.c(18): score[4]=0
Action.c(19): *(p+0)=0
Action.c(21): --------------------------
Action.c(26): sixnum[0][0]=1
Action.c(27): *(*(p1+1)+0)=54385392
Action.c(26): sixnum[0][1]=2
Action.c(27): *(*(p1+2)+0)=54385392
Action.c(26): sixnum[0][2]=3
Action.c(27): *(*(p1+3)+0)=54385392
Action.c(26): sixnum[1][0]=4
Action.c(27): *(*(p1+4)+0)=54385392
Action.c(26): sixnum[1][1]=5
Action.c(27): *(*(p1+5)+0)=54385392
Action.c(26): sixnum[1][2]=6
Action.c(27): *(*(p1+6)+0)=54385392
Ending action Action.
Ending iteration 1.

本章节算做对C语言一些概念性知识的回味道吧。后面再写关于loadrunner脚本编写的内容要根据实际意义一些脚本进行分析

时间: 2024-08-13 15:05:58

LoadRunner脚本编写之二的相关文章

LoadRunner脚本编写(转)

性能测试工程师要懂代码么?答案是必须的.好多测试员认为在loadrunner中编写脚本很难很牛X ,主要是大多测试人员并未做过开发工作,大学的那点程序基础也忘记的差不多了.还有非计算机专业出身的测试员,所以对代码望都比较望而生畏. 好多人认为loadrunner只支持C语言(包括我之前也一直这么认为),因为loadrunner默认的脚本是C语言的,其实它支持目前所有主流的语言,如:Java User.VB User.VB script User .Javascript User.Mmicroso

LoadRunner脚本编写

一.脚本编写 案例一 Action() { //请求1 web_custom_request("WebTours", //可以自定义 "URL=http://127.0.0.1:1080/WebTours/", //Get请求的地址 "Method=GET", //方式GET "Resource=0", //说明URL是否是一个资源,0代表不是资源,1代表是资源 "RecContentType=text/html&q

loadrunner脚本编写经验

最近写了不少loadrunner脚本,记录一下心得:1 loadrunner脚本基本可以认为就是c语言代码(loadrunner支持不同语言的脚本,默认生成的是用c语言写的脚本)2 loadrunner自己实现了一个c编译器及对应的ide(也就是vugen),所以有一些地方跟我们常用的开发习惯不一样.loadrunner内置编译编译器怀疑是在gcc基础上改的,因为一些语法特性跟gcc比较像.3 loadrunner的c编译器实现了不少标准库函数,但不提供对应的头文件.所以使用到库函数(如mall

loadrunner - 脚本编写

### web_url ### 只支持 GET 请求 ### 一.General 1.Step:名称 2.URL:需要访问的 url 地址 3.Record mode:HTML / HTTP 二.Resource 1.Referer:来源请求,防盗链:即访问请求是从哪个请求链接过来的 例: web_url("web_url", "URL=https://api.douban.com/v2/book/search?q=python", "TargetFram

loadrunner脚本编写http协议

LoadRunner学习---脚本编写(4)(比较重要)

今天接着来翻译http://www.wilsonmar.com/中关于LoadRunner脚本编写部分,下面该翻译脚本编写中一些比较重要的部分了. Web用户Action 在VuGen中,脚本产生的默认模式是基于HTML的--“描述用户的动作的脚本”直接与用户的动作是对应的: * web_url是浏览器地址栏的URL. * web_link是点击在<a href= ...>和<a>之间的文本超链接. * web_image是点击HTML的<img href= link. *

loadrunner简单使用——HTTP,WebService,Socket压力测试脚本编写

先说明一下,本人是开发,对测试不是特别熟悉,但因工作的需要,也做过一些性能测试方面的东西.比较久之前很简单的用过,最近又用到了,熟悉一下.现做一个总结. 使用loadrunner进行压力测试主要分两步,第一步是编写脚本(比较重点),第二步执行测试(配置都是在界面上点点就行了,当然我只的是比较简单的,能满足日常需要的),第三步分析结果(这一步比较高深,但是对于我来说能看懂简单的性能指标就OK了).所以这里就说一下脚本的编写,给未来再用到做参考. 1.HTTP的GET请求 这里以访问百度为例,地址h

Loadrunner:脚本编写通用模板(Http协议类型)

1. 背景 对于 Http协议,Loadrunner 脚本可以使用通用模板反复粘贴,只需要修改其中的 URL 和 传参,就可以完成一整个业务 2. Get 类型的接口 web_custom_request( // 名称,最好用英文 "Hello", // 接口的 URL,建议 appboss 地址设置成变量,方便切换环境 "URL={appboss}/app/shopBuy/detail?tokenId={tokenId}", // 提交方式 "Metho

Loadrunner脚本编程(4)-数据类型操作和字符串操作

http://www.360doc.com/content/10/0806/13/1698198_44078277.shtml 一,数据类型转换 没有使用过C编程的LoadRunner脚本编写者会发现在数据类型转化方面比较困难.下面介绍这方面的知识. 1.  相似函数的输出在不同的位置 象很多C函数一样,使用atoi函数的结果即为返回值 如intResult = atoi( charY ); 而:itoa的返回结果为第二个参数. itoa( intX, charY, 10); 第一个参数是需要转