51Testing软件测试论坛

标题: 一个参数取值多个范围时,如何做参数化?(已解决,感谢xueying1123和skyzhu两位) [打印本页]

作者: lxlye    时间: 2010-8-6 11:07
标题: 一个参数取值多个范围时,如何做参数化?(已解决,感谢xueying1123和skyzhu两位)
脚本中一个参数x,它的取值范围有多个,如200~400、2000~4000、-400~-200、……,要求在这些范围内随即取一个值,参数化时应该如何实现?

在补充一下,另一个参数y,如果x取200~400,y就取300~500;x取-400~-200,y取-600~-300;x取2000~4000,y取3000~6000;……以此类推(x和y的取值都没有规律,前面只是举个例子),x每取一个范围,y也要在一个与它对应的范围内取值,这样做x和Y的参数化又该如何做呢?

[ 本帖最后由 lxlye 于 2010-8-10 14:14 编辑 ]
作者: skyzhu    时间: 2010-8-6 11:16
反正都数字,最简单的办法就是Excel里全拖出来
作者: cncnily    时间: 2010-8-6 11:17
Excel里全拖出来,类型random
作者: lxlye    时间: 2010-8-6 11:24
和我想的一样,但感觉太笨了 哪位高手有更好的办法?
作者: lxlye    时间: 2010-8-6 11:32
不是为难大家,确实是遇到这样的问题,期待高手们的帮助。不胜感激!
作者: skyzhu    时间: 2010-8-6 11:40
其他办法也不一定好,最多就是先以一个参数来随机参数名,然后根据随机到的参数名去找对应的参数,其中每个对应的参数都是一个随机数类型的参数
作者: lxlye    时间: 2010-8-6 11:50
谢谢楼上老兄了,实在不行就只能这样了。
作者: xueying1123    时间: 2010-8-6 11:51
楼主试试这个脚本,看看是不是这个效果
作者: qzj_test    时间: 2010-8-6 12:00
支持随机数
作者: skyzhu    时间: 2010-8-6 13:17
lr_output_message("%s",lr_eval_string(lr_eval_string("{aaaa}")));

aaaa中参数的内容是其他随机数参数的名称
如  
{aaa1}
{aaa2}
{aaa3}
作者: lxlye    时间: 2010-8-6 13:46
原帖由 xueying1123 于 2010-8-6 11:51 发表
楼主试试这个脚本,看看是不是这个效果

非常感谢,完美解决!学习了!加了好友,以后还请多多关照!
作者: xueying1123    时间: 2010-8-6 14:09
太客气了,共同学习
作者: lxlye    时间: 2010-8-6 16:43
忘了random number只支持0以上的数
作者: xueying1123    时间: 2010-8-6 16:50
可以随机0一下的数,参数化时在Number format处前面加负号,如图

--------------replay log-----------------
Action.c(8): 选取了第3组范围中的数据
Action.c(26): x is -276;y is -547
作者: xueying1123    时间: 2010-8-6 17:06
还可以用rand()这个函数
------------------------------------------------
比如生成-300到400的数据
lr_output_message("%d",(rand()%7000)/9-300);
作者: lxlye    时间: 2010-8-6 17:11
标题: 回复 14# 的帖子
恩 主要是有跨正负整数的范围 如-200~200
作者: lxlye    时间: 2010-8-6 17:13
看样子只能分开来做参数化了
作者: xueying1123    时间: 2010-8-6 17:16
Action()
{
        int i;
        int x;
        int y;

        i=atoi(lr_eval_string("{GroupCount}"));
        lr_output_message("选取了第%d组范围中的数据",i);

        switch(i)
        {
        case 1:
                x=atoi(lr_eval_string("{xGroup1}"));
                y=atoi(lr_eval_string("{yGroup1}"));
                break;
        case 2:
                x=atoi(lr_eval_string("{xGroup2}"));
                y=atoi(lr_eval_string("{yGroup2}"));
                break;
        case 3://全负数
                x=atoi(lr_eval_string("{xGroup3}"));
                y=atoi(lr_eval_string("{yGroup3}"));
                break;
        case 4://正负数x取-300~400,y取-500~200
                x=(rand()%7000)/9-300;
                y=(rand()%7000)/9-500;
        }

    lr_output_message("x is %d;y is %d",x,y);


        return 0;
}
作者: lxlye    时间: 2010-8-6 17:27
恩 明白了
作者: skyzhu    时间: 2010-8-6 18:05
一句话就行,不用case ,支持多段,否则多了代码都复制傻了。。。。
用参数值来做参数名,维护也方便,另外可以配合唯一数来控制每段的分布数量
正负交错的,设置2个参数就行了,1个负数到-1,1个从0开始
i=atoi (lr_eval_string(lr_eval_string("{aaaa}")));
aaaa的参数值就是
{Group1}
{Group2}
{Group3}
作者: msnshow    时间: 2010-8-6 21:14
其实就是一个条件判断嘛,另外最简单的方法,就是做几个相同的action,取不同的参数值,让action随机运行就行了

LR本来就支持随机,没有必要自己写随机函数之类的
作者: lxlye    时间: 2010-8-9 09:21
原帖由 skyzhu 于 2010-8-6 18:05 发表
一句话就行,不用case ,支持多段,否则多了代码都复制傻了。。。。
用参数值来做参数名,维护也方便,另外可以配合唯一数来控制每段的分布数量
正负交错的,设置2个参数就行了,1个负数到-1,1个从0开始
i=atoi  ...


这个方法我想过,但我要做的参数化包括两个参数,且是相互影响的。比如x和y,x取值范围300~500,那么y对应的就是400~600,而x如果取600~800,那么y对应的要取700~900,x和y的取值范围都是多个且药相互对应。所以还是需要case。或者skyzhu,你有其他更简单的方法?
作者: skyzhu    时间: 2010-8-9 10:00
标题: 回复 22# 的帖子
稍微变化一下就行了
x=atoi (lr_eval_string(lr_eval_string("{aaaa}")));
y=atoi (lr_eval_string(lr_eval_string("{bbbb}")));
aaaa设置随机,bbbb设置与aaaa同行
aaaa的参数值就是
{Group1a}  300~500
{Group2a}  600~800
{Group3a}
bbbb的参数值就是
{Group1b}  400~600
{Group2b}  700~900
{Group3b}
作者: ryugun    时间: 2010-8-9 11:16
学习了。。很受用
作者: lxlye    时间: 2010-8-9 11:32
标题: 回复 23# 的帖子
恩 也可以,还有个问题,比如用你上面的方法,x和y我把它们转换成参数后添加到脚本中,这时脚本中有多个地方需要这两个参数,又该怎么做才能每次脚本中用到这两个参数都取一次新的值呢?

[ 本帖最后由 lxlye 于 2010-8-9 11:37 编辑 ]
作者: skyzhu    时间: 2010-8-9 13:19
标题: 回复 25# 的帖子
这是LR基本功能
参数设置   update value on :    each occurence
作者: lxlye    时间: 2010-8-9 13:38
标题: 回复 26# 的帖子
楼上能不能给个完整的脚本?我这里怎么就不能随机取值呢?
作者: skyzhu    时间: 2010-8-9 14:10
原帖由 lxlye 于 2010-8-9 13:38 发表
楼上能不能给个完整的脚本?我这里怎么就不能随机取值呢?



还好最近不忙,否则也没空弄了,看附件吧,每次都不一样的
如果x 1-50,那y 51-100
      101-150,那y 151-200
      201-250,那y 251-300
作者: lxlye    时间: 2010-8-9 15:25
标题: 回复 28# 的帖子
恩 辛苦了 我也是这样实现的,可是现在我不知道怎么将参数化出来的值引到以后的脚本中。从而达到参数化的作用。而且引用进去后,每次使用都是随机的值。
我是用lr_save_int将x和y的值转换成参数,用到以后的脚本中,可这样后面脚本多个地方用的是固定不变的数。
比较菜,也许不是个问题,可现在确实不知道怎么弄,请指点!
作者: skyzhu    时间: 2010-8-10 09:34
lr_save 要在每个使用的地方之前都调用一次
否则你读的不就都是同一个临时参数里的内容了,临时参数和变量没什么区别,不会自己变
作者: lxlye    时间: 2010-8-10 09:37
   那就麻烦了!
作者: lxlye    时间: 2010-8-10 09:52
有没有其他办法?我直接获得随机值然后用到以后的脚本中。
作者: lxlye    时间: 2010-8-10 10:59
原帖由 xueying1123 于 2010-8-6 17:16 发表
Action()
{
        int i;
        int x;
        int y;

        i=atoi(lr_eval_string("{GroupCount}"));
        lr_output_message("选取了第%d组范围中的数据",i);

        switch(i)
        {
        case 1:
                x=atoi(lr_eval_string("{xGroup1}")) ...

用这个脚本怎么才能在以后脚本中用到此参数的所有地方都取随机的而不是固定的一个值呢?
作者: skyzhu    时间: 2010-8-10 11:53
都是要重复调用的,这是你用这么复杂的随机数的代价
每个地方都先调用一次算简单的了,或者你可以自己写C的dll,然后用自定义function参数
作者: lxlye    时间: 2010-8-10 12:42
标题: 回复 34# 的帖子
恩 谢谢!就这样吧!
作者: xueying1123    时间: 2010-8-10 13:50
如skyzhu所说,要达到每次引用都随机取值的目的,是需要重复调用;

----------------------------------
void getXY()
{

        int i,x,y;
                   
        i=atoi(lr_eval_string("{GroupCount}"));//Update Value on "each occurrence"
        lr_output_message("选取了第%d组范围中的数据",i);

        switch(i)
        {
        case 1:
                x=atoi(lr_eval_string("{xGroup1}"));//Update Value on "each occurrence"
                y=atoi(lr_eval_string("{yGroup1}"));//Update Value on "each occurrence"
                break;
        case 2:
                x=atoi(lr_eval_string("{xGroup2}"));//Update Value on "each occurrence"
                y=atoi(lr_eval_string("{yGroup2}"));//Update Value on "each occurrence"
                break;
        case 3://全负数
                x=atoi(lr_eval_string("{xGroup3}"));//Update Value on "each occurrence"
                y=atoi(lr_eval_string("{yGroup3}"));//Update Value on "each occurrence"
                break;
        case 4://正负数x取-300~400,y取-500~200
                x=(rand()%7000)/9-300;
                y=(rand()%7000)/9-500;
        }

        lr_save_int(x,"x");
        lr_save_int(y,"y");
       
}



Action()
{
       
        getXY();
        lr_output_message("第一次调用:x is %s;y is %s",lr_eval_string("{x}"),lr_eval_string("{y}"));

        getXY();
        lr_output_message("第二次调用:x is %s;y is %s",lr_eval_string("{x}"),lr_eval_string("{y}"));

        getXY();
        lr_output_message("第三次调用:x is %s;y is %s",lr_eval_string("{x}"),lr_eval_string("{y}"));

        getXY();
        lr_output_message("第四次调用:x is %s;y is %s",lr_eval_string("{x}"),lr_eval_string("{y}"));

        return 0;
}
作者: lxlye    时间: 2010-8-10 13:58
标题: 回复 36# 的帖子
我需要用到这些参数的地方太多了,重复调用的话麻烦死了。
不管怎么样,谢谢两位了。
作者: felix87    时间: 2010-8-12 13:48
不错,学习思路
作者: yanjy    时间: 2010-8-17 15:16
不错,收藏了
作者: 大漠飞鹰    时间: 2010-11-7 10:04
设置两个参数,一个参数采用随机,另一个参数采用和参数一同行取值。




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