51Testing软件测试论坛

标题: 关于LoadRunner中参数值的引用 [打印本页]

作者: xingcyx    时间: 2007-5-29 12:15
标题: 关于LoadRunner中参数值的引用
昨天在研究脚本的时候偶然遇到一个问题,今天正好有了点时间,就拿来再研究一下。
问题是这样的:我想用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里,这几个函数对参数值的引用方式不同吧,不知道我这样想是否正确,希望大家批评指正!
作者: xingcyx    时间: 2007-5-29 17:51
居然没人关注,顶一下。
今天下午又和Zee讨论了一下,还是没有完全解答这个疑惑,希望高手来解答。
作者: Zee    时间: 2007-5-29 18:25
sdlkfj3 sdlkfj3 sdlkfj3
我跟你说了,你把C的变量和LR的变量理解错了。
你不相信。
你不用lr_eval_string取出值来是不能直接用a这个参数来调用的。
我用web_submit_data按你说的方式来调用了,是错误的。
你原来直接引用参数化的值是因为那是LR的变量。
比如{NewParam}你直接用这个引用是没有问题的。
作者: rickyzhu    时间: 2007-5-29 18:26
顶一下。
作者: rickyzhu    时间: 2007-5-29 18:38
学习了,Zee老大对此颇有造纸啊。
作者: berg    时间: 2007-5-29 21:44
学习
作者: 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_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;
}
作者: xingcyx    时间: 2007-5-30 10:48
嗯,楼上的意见正是我想说的。我今天又试了一下,有了新的结论,在这里提出来请大家继续指教:

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

不过,问题还没有结束,在tuxedo协议中,用 lrt_strcpy函数则没有这个问题存在,例如:lrt_strcpy(sendBuf1, sendBuf);则可以成功地将sendBuf中的参数值赋值给sendBuf1。目前怀疑是该函数在内部已经进行过转换,但并不肯定,尚待证实。
作者: Zee    时间: 2007-5-30 11:20
原帖由 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 编辑 ]
作者: ppent    时间: 2007-5-30 11:27
看到大家讨论这么激烈,我也来说说我肤浅的认识,说得不对的请指正。
我们知道,在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 编辑 ]
作者: ppent    时间: 2007-5-30 11:32
原帖由 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 编辑 ]
作者: xingcyx    时间: 2007-5-30 11:41
再次针对以上问题进行试验,我在lrt_strcpy(sendBuf1, sendBuf);语句的前后各加了一句调试信息:lr_output_message("sendBuf:%s",sendBuf);
和lr_output_message("sendBuf1:%s",sendBuf1);
打印出来的结果截然不同,前者的输出显示没有传入参数值,而后者则成功传入参数。这表明确实是lrt_strcpy这个函数在搞鬼。
至此,这个问题可以圆满结束了!

能得到这个结论,我感到特别高兴,也很激动。在这里,我想对朋友们对我的支持表示感谢!
感谢CCTV!感谢MTV!感谢51testing,感谢Zee同学,以及感谢所有帮助支持过我的朋友们,谢谢你们!^_^
作者: Zee    时间: 2007-5-30 11:44
原帖由 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.
作者: Zee    时间: 2007-5-30 12:00
原帖由 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
作者: ppent    时间: 2007-5-30 12:05
标题: 回复 #14 Zee 的帖子
我知道这个规律,但为什么是这样的,C语言也是这么实现的?
作者: Zee    时间: 2007-5-30 13:44
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




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2