问题一:
WINSOCKET协议录制脚本时,应用服务器动态端口问题。
现象:发现在访问应用服务器的公共端口后,服务器返回了一个动态端口,导致脚本再次运行时出现错误。
解决:关联。1、使用函数lrs_save_searched_string。将访问公用端口后应用服务器返回的动态端口进行关联。然后再下次连接时,将脚本中录制的固定的端口改为新建的参数即可。
2、可以在树形脚本中,找到要关联的端口,点击右键,选择“create Parameter”,指定参数名,使用参数的 socket、要参数化的Buffer、左右边界即可。系统生成的函数为:lrs_save_searched_string( "socket0", LRS_LAST_RECEIVED, "Parameter1", "LB/BIN=PORT=", "RB/BIN=))", 1, 0, -1 );
如果不指定左右边界,就会生成lrs_save_param函数。
3、lrs_save_param也可以,不过端口必须指定长度,对于返回的端口长度确定的可以使用。
如:lrs_save_param("socket0", LRS_LAST_RECEIVED, "oracleport", 57, 4);
问题二:使用lrs_save_param时,如何计算偏移量。
解决:1、在data.ws中,选择要计算偏移量的BUFFER,按F7,会出现EBCDIC Translation表,每行第一个字符的偏移量是本行最前面显示的数字,后面的依次累加就可以得到。
2、在树形脚本中,找到要计算偏移量的端口,右键,点击“go to offset”。
问题三:端口参数化后打印出来,不是对应的端口,而是作为字符打印出来了。
解决:使用lr_message_output函数,当时尝试了N次,都不成功,将参数打印出来,发现捕捉的不是端口号,最后才发现原来是参数的表示写错了。
查看:tools->general options->parameterization 里使用的是< >,而我脚本中使用的是{ }。所以我打出来的是“{parameter}”,而不是我想要的“1878”
问题四:协议选择问题
现象:开始初步确定系统是三层结构,使用WINSOCKET协议录制脚本。发现在访问数据库的1251端口后,服务器返回了一个动态端口,导致脚本再次运行时出现错误。
分析:其实这里面有个错误,如果是标准的三层结构,录制的脚本是不会直接访问1251端口的,所以客户端应该有直接访问数据库的部分,此时不应该采取单个WINSOCKET协议,但由于没有经验,所以就努力地解决动态端口的问题。
后来解决了动态端口问题后,重新回放脚本,发现一些BUFFER发送了几百字节,但接收回来的为0,并且是很多连续的Mismatch,发送的和接收的相关很大。
如:vuser_init.c(84): lrs_receive(socket1, buf31)
vuser_init.c(84): Mismatch (expected 290 bytes, 0 bytes actually received)
查找附近的脚本,发现接收的buffer中很多都会出现:“ORA-01403: 未找到数据”的错误。
最后结论:可以协议选择不正确。后面采取了winsocket+oracle(2-tier)协议解决。并且也没有了返回动态端口的问题。
问题五:SOCKET关闭问题
现象:在录制并回放脚本时并没有错误,但在controller迭代多次回放时出现,报错:找不到socket.
分析:在脚本中create socket0是写在INIT脚本中,而close socket0是写在ACTION脚本中,而INIT脚本只执行一次,在第一次运行时ACTION中已经关闭了此socket,再次迭代时,就会报错了。
解决:将close socket0放在END脚本中,在整个迭代过程中此 socket一起保持,不关闭