51Testing软件测试论坛

标题: 用winsok录制的C/S脚本如何实现输入的参数化 [打印本页]

作者: weiwei555    时间: 2007-5-29 10:19
标题: 用winsok录制的C/S脚本如何实现输入的参数化
总共有buf数为从buf 0到buf 21,输入数据回车后会在buf 4中开始记录,并且在后面的每个buf中都有由该输入数据产生的相关数据。
请问这种情况该如何设置参数啊?是否所有出现和该输入数据相关的都要参数化么,但是如果输入的数据不同的化由其得到的后续数据也都不一样,但是在我录制的时候必须得输入一个实际的数据(然后在产生的脚本中对其参数化)。那么如果要对其参数化的话具体该如何做呢?


我有试过只对脚本里的第一次记录该输入的数据进行参数化(在参数化属性里设置了3个数据),但是在运行后在详细的日志里只显示调用了第一行的数据,后面的2个数据根本没有使用到
作者: weiwei555    时间: 2007-5-29 17:09
还是没有找到解决办法
大家有遇到类似问题的吗?给点意见啊
作者: ppent    时间: 2007-5-29 18:20
没什么好说的,就是关联+参数化啊。
作者: guxingyun    时间: 2007-5-30 09:36
标题: 回复 #2 weiwei555 的帖子
不知你的buf0到buf21中有没有recv,我认为recv中的内容不用参数化。不知你的buf是否包含了send和recv。可以再将情况说得明白些吗?
作者: weiwei555    时间: 2007-5-30 10:33
标题: 回复 #4 guxingyun 的帖子
录制脚本的data.ws如下
;WSRData 2 1

send  buf0 444
        "POST http://132.201.69.80:6080/BISWeb/Servicelet HTTP/1.1\r\n"
        "User-Agent: Jakarta Commons-HttpClient/2.0.1\r\n"
        "Host: 132.201.69.80:6080\r\n"
        "Proxy-Connection: Keep-Alive\r\n"
        "Content-Length: 260\r\n"
        "\r\n"
        "<adapter><header><protocol value=\"$protocol\"/><trx value=\"resplan\"/><r"
        "eqid value=\"1180107250078\"/><profile><instance value=\"$instance\"/><sou"
        "rce value=\"$source\"/><userid value=\"MF5258\"/><password value=\"$passwo"
        "rd\"/><ip value=\"$ip\"/></profile></header></adapter>"

recv  buf1 4851
        "HTTP/1.1 200 OK\r\n"
        "Server: WebSphere Application Server/5.1\r\n"
        "Content-Type: text/html; charset=ISO-8859-1\r\n"
        "Content-Language: en\r\n"
        "Transfer-Encoding: chunked\r\n"
        "\r\n"
        "124a\r\n"
        "<?xml version=\"1.0\"?>\n"
        "<adapter>\n"
        "<header><protocol VALUE=\"$protocol\"/><trx VALUE=\"resplan\"/><reqid VALU"
        "E=\"1180107250078\"/><profile><instance VALUE=\"$instance\"/><source VALUE"
        "=\"$source\"/><userid VALUE=\"MF5258\"/><password VALUE=\"$password\"/><ip"
        " VALUE=\"$ip\"/></profile><msgid VALUE=\"041rP87$9999999999respla\"/></hea"
        "der>\n"
其余的都类似这个,
send  buf2 441
         录制的脚本       

recv  buf3 4985
         录制的脚本
。。。

然后在antion中就是一组组的lrs_receive和对应的 lrs_send。。。。
作者: guxingyun    时间: 2007-5-30 11:25
标题: 回复 #1 weiwei555 的帖子
我对其中的这句话有点不理解“我有试过只对脚本里的第一次记录该输入的数据进行参数化(在参数化属性里设置了3个数据),但是在运行后在详细的日志里只显示调用了第一行的数据,后面的2个数据根本没有使用到”这3个数据是什么意思,是3次输入吗,让脚本自运行3次来实现这3条数据的调用吗?查看一下你的消息信箱。
作者: weiwei555    时间: 2007-5-30 13:34
标题: 回复 #6 guxingyun 的帖子
这句话要表达的意思就是:我在程序输入数据后,会从buf 4开始记录这个输入的数据,但是在后面的所有的send和receive的buf都会有这个输入数据或由它查找到的相关数据,但是我只在buf 4里对它进行了参数化、
作者: guxingyun    时间: 2007-5-30 13:56
标题: 回复 #7 weiwei555 的帖子
也就是说从4输入数据后,之后5-21的send和rece都是一气呵成的,也就是说用户没有作其他的操作?我认为参数化的重点放在send上,只要是send中涉及到的在步骤4中的输入数据,都是要参数化的。
作者: weiwei555    时间: 2007-5-30 14:20
标题: 回复 #8 guxingyun 的帖子
恩,就是你说的意思,打个简单的比喻吧,相当如你在学校里用一个信息管理系统,在系统里输入学号查询,然后会出现该学生的所有相关信息,(当然该学号在服务器端也有对应的关键字数据),查询到的信息当然会因为学号的不同而不同,我学LR才不到一个月。到处都摸不着头绪,很麻烦
作者: weiwei555    时间: 2007-5-30 14:34
标题: 回复 #8 guxingyun 的帖子
如果只参数化send中的话,那么运行时receive的数据应该会有些和输入的数据所要求的receive值对不上了么
作者: rickyzhu    时间: 2007-5-30 14:50
关注这个问题,我之前也遇到类似的问题,没有解决。
作者: guxingyun    时间: 2007-5-30 14:52
标题: 回复 #10 weiwei555 的帖子
好的,那么先确定一下你要实现的目标是什么,输入不同的数据(send)收到不同的reve信息,这个recv信息你是要保存起来呢还是要验证接收到的数据是否正确?你录制的这段代码是一个功能项还是几个功能项?一般一个功能项录制一个脚本.
其二,recv的值是根据send的值而确定的,虽然在脚本回放的过程中脚本中的recv的值第一次录制时的固定的数据,但实际上服务器发送过来的数据是与send对应的,至于如何保存这时的recv中的数据我暂时还不知道,看看执行日志中是否有相关信息.
作者: weiwei555    时间: 2007-5-30 14:52
主要是运行时并没有循环执行脚本,我参数表里设置了2个数,可是总是只会取第一个数。
作者: weiwei555    时间: 2007-5-30 15:04
标题: 回复 #12 guxingyun 的帖子
1、目的:输入不同的数据得到与其对应的receive结果(receive结果因输入的不同而不同),输入数据回车后,会有大约10多个进行数据处理的操作(当然都是程序在后台自行处理的),在所有数据处理完成后会给出最后结果(我们的程序是弹出一个对话框给出结果),测试从输入数据到弹出结果所耗费的时间

录制的时候当然只会输入一个数据,但是为了测试的更准确性,所以要模拟很多的输入数据来测试该反应时间

2、不需要百存该receive的数据。我有查看详细的日志,我按你的方法只参数化了send里的数据,没有考虑receive里的数据,我在参数表有2个数据9991172301和9991112307,设置的是首先取9991172301这个数据,但是在日志里的buf13和buf15的,所以也不知道其返回结果到底正确不正确,但是运行过程中没有报任何的错误
except receive里还是出现了9991112307这个值。
作者: hanghong_good    时间: 2007-5-30 15:19
好,,支持问题1`
作者: guxingyun    时间: 2007-5-30 15:59
标题: 回复 #13 和 #14 weiwei555 的帖子
关于#13" 主要是运行时并没有循环执行脚本,我参数表里设置了2个数,可是总是只会取第一个数。"有点疑问,第一,没有循环执行脚本,也就是说你这次的操作脚本只执行了一次,也就是Runtime Setting里的Pacing设置的是1;第二,参数表里设置了2个数,那么对于出现参数取值的设置是什么,也就是右键菜单下的参数的属性设置是什么样的,应该是sequential,each interation,这样的设置可以保证在这个循环中的取值是一样的。
关于#14,简单验证结果是否正确可以在正常的情况下使用9991172301看一下结果,然后再运行脚本看一下结果,两个比较一下就可以了。运行脚本的前提是保证#13的运行时设置是正确的。

[ 本帖最后由 guxingyun 于 2007-5-30 16:25 编辑 ]
作者: weiwei555    时间: 2007-5-30 16:06
标题: 回复 #16 guxingyun 的帖子
好,我设置的是unique,update value=once
谢谢你啊guxingyun。。。这么热心sdlkfj2

[ 本帖最后由 weiwei555 于 2007-5-30 16:08 编辑 ]
作者: weiwei555    时间: 2007-5-30 16:15
按你的建议现在可以了,可是循环在执行第二次的时候报错
Starting iteration 2.
Starting action Action.
Action.c(14): lrs_create_socket(socket0, TCP, ...)
Action.c(14): callBind: socket: socket0 (264), local host: (null), local port: 0
Action.c(14): Error : socket0 - Invalid argument. Error code : 10022.

action中的脚本如下:
#include "lrs.h"

Action()
{
   
    lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=192.168.0.56:9080",  LrsLastArg);
    lrs_send("socket0", "buf0", LrsLastArg);
    lrs_receive("socket0", "buf1", LrsLastArg);
    lrs_send("socket0", "buf2", LrsLastArg);
。。。
}

查看了以前的帖子,据说是参数设置有问题,再检查检查

[ 本帖最后由 weiwei555 于 2007-5-30 16:18 编辑 ]
作者: guxingyun    时间: 2007-5-30 16:15
标题: 回复 #14 weiwei555 的帖子
脚本在录制时使用的数值是多少,应该不是9991172301吧?是9991112307吗?那样的话#14楼提到的“except receive里还是出现了9991112307这个值。”会好理解一些。
作者: guxingyun    时间: 2007-5-30 16:19
标题: 回复 #18 weiwei555 的帖子
报错指出socket是无效的,应该是在Action的结尾没有关闭的原因,在return 0;;语句之前添加lrs_close_socket("socket0"); 然后再试一下。
还有#16楼的设置方式应该不会出错才对,unique ,once。

[ 本帖最后由 guxingyun 于 2007-5-30 16:26 编辑 ]
作者: weiwei555    时间: 2007-5-30 16:21
标题: 回复 #19 guxingyun 的帖子
恩,录制的时候输入的是9991112307,在参数表里数据的顺序是9991172301,然后是9991112307;脚本被编辑了很多次了,自己都糊涂了,我重新录制下
作者: guxingyun    时间: 2007-5-30 16:24
标题: 回复 #21 weiwei555 的帖子
这样子就好理解了,因为录制时使用的是9991112307,而回放时第一次的取值是9991172301,录制和回放的值不同,所以except receive里出现9991112307这个值是提示两次(录制和回放)的差异。
作者: weiwei555    时间: 2007-5-30 16:48
恩,就是你说的那样。
但是循环还是不能进行下去,第一次能顺利运行,但是第二次总是报错Action.c(37): Error : socket2 - Invalid argument. Error code : 10022.

我把参数表里的2个数据改成一样的还是会出现这个错误,为什么总是只能顺利执行一次。搞不懂


忘了说了,我这只是在demo状态下的测试。

我online测试的时候,录制的在线脚本,没有参数化,就是直接用录制的脚本run,如果连续run(就是运行结束后马上有点run开始运行)的话可以多次顺利运行(但也最多只能运行3-4次),如果不连续run的话,会出现找不到locahhost的10052错误(但是第一次总是能顺利运行完成)。不知道是程序问题还是LR问题,LR我是录制完就run,没有该任何参数

[ 本帖最后由 weiwei555 于 2007-5-30 16:57 编辑 ]
作者: guxingyun    时间: 2007-5-30 16:58
了解,可以采取这样的方式,既然你的脚本现在的操错是在buf4时才输入数据,那么现在将lrs_create_socket放在初始化vuser_init里,将lrs_close_socket放在vuser_end里,然后再次运行迭代试一下。如果迭代可以成功,再细说我对 socket2 - Invalid argument. Error code : 10022.的理解。
作者: weiwei555    时间: 2007-5-30 17:13
标题: 回复 #24 guxingyun 的帖子
高手啊,按你说的把lrs_create_socket放在init里面运行成功了。谢谢谢谢

只是这个录制的脚本总共创建了4个socket(0,1,2,3),但是只有0,1有close socket;socket2和3均只有创建socket而没有close,但是运行还是成功了,没有任何错误。

再次谢谢你的热心的帮促。没有你这些问题是不能解决的,我已经查了几天资料了,但是都停滞不前。谢谢你啊guxingyun
作者: guxingyun    时间: 2007-5-30 17:21
不是高手,只是我这段时间也在学习作这方面的测试,所以遇到过类似的问题。c/s的通信方式也不是很理解呢,如果理解的再深入一下的话,还会有更深刻的认识的。可以请教开发人员,脚本还是可以继续优化的。继续学习中....
作者: weiwei555    时间: 2007-5-30 17:23
sdlkfj7 把参数表的数据设成2个一样的可以运行成功,没有任何错误

但是如果设成2个不同的数据,第一个运行成功没有任何错误,第二个会报出Action.c(53): Error : socket2 - Software caused connection abort. Error code : 10053.
Action()
{
    lr_think_time(63);
    lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=192.168.0.54:9080",  LrsLastArg);
    lrs_send("socket0", "buf0", LrsLastArg);
    lrs_receive("socket0", "buf1", LrsLastArg);
    lrs_send("socket0", "buf2", LrsLastArg);
    lrs_receive("socket0", "buf3", LrsLastArg);
    lr_think_time(24);
    lrs_create_socket("socket1", "TCP", "RemoteHost=192.168.0.54:9080",  LrsLastArg);

lr_start_transaction("pop");
    lrs_send("socket1", "buf4", LrsLastArg);
    lrs_receive("socket1", "buf5", LrsLastArg);
    lrs_close_socket("socket0");

这行是录制时存放lrs_create_socket("socket2", "TCP", "LocalHost=0", "RemoteHost=192.168.0.54:9080",  LrsLastArg)的,现在被切到init里了,报错会出现在下面的某行里,但是好像不会出现在buf 6, buf 7,这2行

    lrs_send("socket2", "buf6", LrsLastArg);
    lrs_receive("socket2", "buf7", LrsLastArg);
    lrs_send("socket2", "buf8", LrsLastArg);
    lrs_receive("socket2", "buf9", LrsLastArg);
    lrs_send("socket2", "buf10", LrsLastArg);
    lrs_receive("socket2", "buf11", LrsLastArg);
    lrs_send("socket2", "buf12", LrsLastArg);
    lrs_receive("socket2", "buf13", LrsLastArg);

注:如果输入的数据不同,录制时产生的socket数也不尽相同,不知该错误和这有关系没

[ 本帖最后由 weiwei555 于 2007-5-30 17:34 编辑 ]
作者: guxingyun    时间: 2007-5-30 17:36
标题: 回复 #27 weiwei555 的帖子
把lrs_create_socket("socket2", "TCP", "LocalHost=0", "RemoteHost=192.168.0.54:9080",  LrsLastArg)及之前的都移到初始化里面,暂时先将lr_start_transaction("pop");屏蔽掉,等脚本可以正常运行后再添加事务之类的。还有socket1实现的是什么?
作者: weiwei555    时间: 2007-5-30 18:05
好,我去改一下。socket 0,1,2,3的内容都是一样的,。

要是把socket 0,1也移到init里的话会报not exist socket 0,1的错误。所以我把他移会录制时的地方了;但是移回后又报出了Action.c(36): Error : socket2 - Invalid argument. Error code : 10022.这个错

socket是实现什么的我也看不懂,录制时做的操作就是:输入帐号密码登陆,进入程序后数据数据回车,然后等着弹出结果对话框,录制完毕。

但是由于输入数据的不同需要创建的socket数也不尽相同,是否不能实现参数化的性能测试啊?

[ 本帖最后由 weiwei555 于 2007-5-30 19:08 编辑 ]
作者: guxingyun    时间: 2007-5-30 19:45
就使用你之前录制的那段代码 然后现在开始进行一些小小的修改
我看了一下 socket0和socket2应该是要做相同的工作 可以将与socket0相关的语句屏蔽掉 socket2的位置暂时保持不便
问一下“socket是实现什么的我也看不懂,录制时做的操作就是:输入帐号密码登陆,进入程序后数据数据回车,然后等着弹出结果对话框,录制完毕。”之中“数据数据”的意思是这个操作是在一个对话框中填入,点击一下确定或查询按钮就会出结果了是吗?

[ 本帖最后由 guxingyun 于 2007-5-30 20:18 编辑 ]
作者: weiwei555    时间: 2007-5-31 08:56
数据数据应该数输入数据,打错了。
就是你说理解的意思,输入数据回车就相当如开始进行查询操作了。

好像不能屏蔽的吧,如果屏蔽了的话会报no exist socket 0或1的错误(第一次可以顺利执行,第二次会报错。参数表的第一个数据是我录制时输入的数据,第二个是新加的);因为输入数据的不同(数据的格式都是一样的)会创建不同数量的socket,所以可能不能用参数化对其执行循环测试,但是如果参数表的值是相同的话,就可以顺利的执行而没有任何错误

[ 本帖最后由 weiwei555 于 2007-5-31 09:16 编辑 ]
作者: guxingyun    时间: 2007-5-31 09:23
看一下于脚本里socket2有关的send和recv的内容,请教一下开发人员这里的通讯流程是怎样的。看一下操作手册里关于socket录制时的设置,有一个服务器到客户端或客户端到服务器的选择的,各录制一份,看看data.ws中的内容,不知你们的通讯协议是什么格式的,你录一下看看吧,和开发人员沟通一下。

[ 本帖最后由 guxingyun 于 2007-5-31 09:47 编辑 ]
作者: hjjlearning    时间: 2008-4-3 18:06
真是好文章啊,正好遇到这个问题

我是创建了几个socket
就关闭几个socket

好像就可以正常运行了




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