51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3536|回复: 15
打印 上一主题 下一主题

[原创] 关于LoadRunner中参数值的引用

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-5-29 12:15:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
昨天在研究脚本的时候偶然遇到一个问题,今天正好有了点时间,就拿来再研究一下。
问题是这样的:我想用strcpy函数把一个字符串赋给一个变量,再将这字符串做一个参数化,然后我想看看参数化是否成功,于是我用了lr_message函数把它打印出来。脚本代码很简单,如下所示:
  Action()
{
    char a[10];
    strcpy(a,"{a}");
    lr_message(a);
    return 0;
}
其中,{a}我已经做了参数化,参数值为11。
运行这个脚本后,发现运行日志里打印出来的a值显示为{a}。
在尝试了N遍以后,我把lr_message(a);这句代码改成lr_message(lr_eval_string(a));后问题解决,运行日志里打印出了我所期望的值11。
问题虽然解决了,但我还是很纳闷,为什么在用lr_message的时候不能直接引用参数,而我记得之前在web_url、web_submit_data等函数里都是可以直接引用参数化的值,而从来没有出现过问题。也许是在LoadRunner里,这几个函数对参数值的引用方式不同吧,不知道我这样想是否正确,希望大家批评指正!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2007-5-29 17:51:00 | 只看该作者
居然没人关注,顶一下。
今天下午又和Zee讨论了一下,还是没有完全解答这个疑惑,希望高手来解答。
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2007-5-29 18:25:10 | 只看该作者
sdlkfj3 sdlkfj3 sdlkfj3
我跟你说了,你把C的变量和LR的变量理解错了。
你不相信。
你不用lr_eval_string取出值来是不能直接用a这个参数来调用的。
我用web_submit_data按你说的方式来调用了,是错误的。
你原来直接引用参数化的值是因为那是LR的变量。
比如{NewParam}你直接用这个引用是没有问题的。
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2007-5-29 18:26:41 | 只看该作者
顶一下。
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2007-5-29 18:38:42 | 只看该作者
学习了,Zee老大对此颇有造纸啊。
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2007-5-29 21:44:04 | 只看该作者
学习
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2015-6-25 18:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    7#
    发表于 2007-5-30 09:51:35 | 只看该作者
    Action()
    {
        char a[10];
        strcpy(a,"{NewParam}");
        lr_message(lr_eval_string(a));
            if (lr_eval_string(a)[0] == 11) {
                    lr_message ("a=%d",a);
            }
            return 0;
    }
    ----------
    if (lr_eval_string(a)[0] == 1)  这么写能通过语法检查,我怎么也想不通!!是不是lr语法检查的bug?

    另外,在strcpy里先lr_eval_string一下参数也可以实现lz的需求。
    Action()
    {
        char a[10];
        strcpy(a,lr_eval_string("{NewParam}"));
        lr_message(a);
            if (lr_eval_string(a)[0] == 11) {
                    lr_message ("a=%d",a);
            }
            return 0;
    }
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8#
     楼主| 发表于 2007-5-30 10:48:32 | 只看该作者
    嗯,楼上的意见正是我想说的。我今天又试了一下,有了新的结论,在这里提出来请大家继续指教:

    昨天和Zee讨论了一个下午,结论还是没有明确。今天上午继续试验,试验结果表明Zee说的是正确的,不能直接将C语言里的变量直接当作LR变量使用,而需要做一些转换。事实上,执行strcpy(a,"{a}");后,并没有真正将参数值传给a。需要这样写:strcpy(a,lr_eval_string("{a}"));这样就没问题了。

    不过,问题还没有结束,在tuxedo协议中,用 lrt_strcpy函数则没有这个问题存在,例如:lrt_strcpy(sendBuf1, sendBuf);则可以成功地将sendBuf中的参数值赋值给sendBuf1。目前怀疑是该函数在内部已经进行过转换,但并不肯定,尚待证实。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2007-5-30 11:20:53 | 只看该作者
    原帖由 qiguojie 于 2007-5-30 09:51 发表
    Action()
    {
        char a[10];
        strcpy(a,"{NewParam}");
        lr_message(lr_eval_string(a));
            if (lr_eval_string(a)[0] == 11) {
                    lr_message ("a=%d",a);
            }
            return 0;
    }
    ----------
    if (lr_ ...

    怎么想不通?

    lr_eval_string(a)[0] == 11,你这里是拿1的ascii码跟11想比较。整型对整型。当然是通过的喽。
    你写成lr_eval_string(a)[0] == 49,这样写:
        char a[10];
        strcpy(a,"{NewParam}");
        lr_message(lr_eval_string(a));
            if (lr_eval_string(a)[0] == 49) {
                    lr_message (" 执行这里!");
            }

    看是不是执行了        lr_message (" 执行这里!");语句。

    [ 本帖最后由 Zee 于 2007-5-30 11:23 编辑 ]
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2007-5-30 11:27:01 | 只看该作者
    看到大家讨论这么激烈,我也来说说我肤浅的认识,说得不对的请指正。
    我们知道,在C语言中,对于变量来说,有地址和值两种操作。在这里我尝试用地址和值的概念来解释这个问题,但这仅仅是我的猜测,并没有真正经过验证,也许根本就是狗屁不通的臆断而已。
    在我看来,LR中的参数其实是一个指针,其存储内容其实是一个地址,而通过lr_eval_string来获取地址中的值。
    再来看看下面的代码:
    strcpy(a,"{NewParam}");        //其实是将参数指向的地址赋值给了变量a
    lr_message(a);        //输出a变量中的地址
    lr_message(lr_eval_string(a));  //这才是输出a变量中地址的值
    另外.
    strcpy(a,"11111");        //直接将字符串赋值给变量
    strcpy(a,lr_eval_string("{NewParam}"));        //将参数值赋给变量


    另外看到网友qiguojie 的提问,我又试了下,结果发现一个比较奇怪的问题.
    char a[10];
    strcpy(a,"1111");
    lr_message(&a[0]);        //打印1111
    lr_message(&a[1]);        //打印111
    lr_message(&a[3]);        //打印1
    为什么会这样?不是每个下标存储一个字符吗?

    lr_message(&a[0]);        //这能打印出参数值,但怎么理解?
    lr_message(&lr_eval_string(a)[0]);        //这能打印出参数值,但怎么理解?

    [ 本帖最后由 ppent 于 2007-5-30 11:45 编辑 ]
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11#
    发表于 2007-5-30 11:32:52 | 只看该作者
    原帖由 Zee 于 2007-5-30 11:20 发表

    怎么想不通?

    lr_eval_string(a)[0] == 11,你这里是拿1的ascii码跟11想比较。整型对整型。当然是通过的喽。
    你写成lr_eval_string(a)[0] == 49,这样写:
        char a[10];
        strcpy(a,"{NewParam}"); ...


    根据我运行的结果,好像不是这样的哦。
    lr_message(&a[0]);        //打印1111
    lr_message(&a[1]);        //打印111
    lr_message(&a[3]);        //打印1

    [ 本帖最后由 ppent 于 2007-5-30 11:34 编辑 ]
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12#
     楼主| 发表于 2007-5-30 11:41:10 | 只看该作者
    再次针对以上问题进行试验,我在lrt_strcpy(sendBuf1, sendBuf);语句的前后各加了一句调试信息:lr_output_message("sendBuf:%s",sendBuf);
    和lr_output_message("sendBuf1:%s",sendBuf1);
    打印出来的结果截然不同,前者的输出显示没有传入参数值,而后者则成功传入参数。这表明确实是lrt_strcpy这个函数在搞鬼。
    至此,这个问题可以圆满结束了!

    能得到这个结论,我感到特别高兴,也很激动。在这里,我想对朋友们对我的支持表示感谢!
    感谢CCTV!感谢MTV!感谢51testing,感谢Zee同学,以及感谢所有帮助支持过我的朋友们,谢谢你们!^_^
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2007-5-30 11:44:32 | 只看该作者
    原帖由 ppent 于 2007-5-30 11:32 发表


    根据我运行的结果,好像不是这样的哦。
    lr_message(&a[0]);        //打印1111
    lr_message(&a[1]);        //打印111
    lr_message(&a[3]);        //打印1



    这里我的结果。

    Starting action Action.
    1
    执行这里!
    Ending action Action.
    Ending iteration 1.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    14#
    发表于 2007-5-30 12:00:52 | 只看该作者
    原帖由 ppent 于 2007-5-30 11:27 发表
    lr_message(&a[0]);        //打印1111
    lr_message(&a[1]);        //打印111
    lr_message(&a[3]);        //打印1

    你这里是这样的:
    lr_message(&a[0]);打印的是数组里的所有的值,我这样标一下:a.0,a.1,a.2,a.3,a.4,a.5…………一直到a.9
    lr_message(&a[1]);打印的是:a.1,a.2,a.3,a.4,a.5…………一直到a.9
    lr_message(&a[3]);打印的是:a.3,a.4,a.5…………一直到a.9
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    15#
    发表于 2007-5-30 12:05:54 | 只看该作者

    回复 #14 Zee 的帖子

    我知道这个规律,但为什么是这样的,C语言也是这么实现的?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16#
    发表于 2007-5-30 13:44:40 | 只看该作者
    C语言里不是这样的,给你一段代码看看:
                     char   *a[4]={"a","b","c","d"};
                      int   i,j=2;
                      for(i=0;i<4;i++)
                            if(i>=j)
                                printf("a[%d]=%s\n",i,a);
    打印结果是:
    a[2]=c
    a[3]=d
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-22 09:56 , Processed in 0.081951 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表