51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3533|回复: 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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

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
回复 支持 反对

使用道具 举报

该用户从未签到

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

回复 #14 Zee 的帖子

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

使用道具 举报

该用户从未签到

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
回复 支持 反对

使用道具 举报

该用户从未签到

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.
回复 支持 反对

使用道具 举报

该用户从未签到

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同学,以及感谢所有帮助支持过我的朋友们,谢谢你们!^_^
回复 支持 反对

使用道具 举报

该用户从未签到

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 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

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 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

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 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

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。目前怀疑是该函数在内部已经进行过转换,但并不肯定,尚待证实。
回复 支持 反对

使用道具 举报

  • 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;
    }
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    本版积分规则

    关闭

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

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

    GMT+8, 2024-11-15 14:37 , Processed in 0.082524 second(s), 28 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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