51Testing软件测试论坛

标题: !!!请问loadrunner如何是测试异步通信的模块的 [打印本页]

作者: jcyrss    时间: 2005-2-1 17:20
标题: !!!请问loadrunner如何是测试异步通信的模块的
假设被测对象是一个接收外部实体发送的认证请求,经过业务逻辑的处理,返回认证结果。这里消息的收发是异步的:发送请求后无需等待响应,可以继续发送下一个请求。消息的请求和响应的匹配由消息体中的字段标志。

用loadrunner模拟外部实体发送的认证请求,vuser录制的脚本可能类似如下代码

lrs_send("socket0", "buf0", LrsLastArg);
lrs_receive("socket0", "buf1", LrsLastArg);

我们先假设将套接口设置成非阻塞的,但是这样lrs_receive函数可能就会将其它请求的响应给接收了,
在运行的时候可能会出现各个vuser接收了不属于自己发送请求对应的响应的现象。

怎么办?我觉得一种解决方法是用户自己将异步消息的收发封装成同步接口,提供动态库,供winrunner调用

不知哪位大侠有更好的方法?
作者: computercat    时间: 2005-2-2 13:27
需要好多网络知识才能看懂楼主你这段文字,关注!
作者: sunshinelius    时间: 2005-2-2 14:11
楼主,拜托有点职业精神好不好。
首先要说明的是,多个vuser的创建的socket套接字是不同的,也是创建在不同端口上的,server端就是靠端口号和套接字来识别client端的不同请求的,要不天下大乱了?你机子上开两个IE,server端就不能识别了吗?其实和loadrunner已经没有什么关系了,编过socket程序的人都能知道这个机理的。
另外,
-----------------------
我们先假设将套接口设置成非阻塞的,但是这样lrs_receive函数可能就会将其它请求的响应给接收了,
-----------------------------------
这和阻塞非阻塞有什么关系啊。
可以做个试验,loadrunner关于socket的连接都是阻塞的。
个人讲,很难理解你要说什么,做什么。
作者: sunshinelius    时间: 2005-2-2 14:36
测试人员应该首先了解被测系统和相关基本知识。信口开河可能是我们测试人员的通病,我们在对软件进行评价的时候,开发人员说不定暗自在笑呢。
作者: jcyrss    时间: 2005-2-3 09:45
正是“多个vuser的创建的socket套接字是不同的,也是创建在不同端口上的”这个原因,导致了我提出以上问题。

确实是我没有说清楚
我说的是一个通信实体通过一个sock和被测对象进行连接,发起大量的异步请求。举个具体的例子,radiusClient实体(如宽带接入服务器)向radiusServer发起大量的认证计费请求,client实体就是通过同一个端口发送的请求,至于接收响应消息和发送请求消息的会话匹配可以通过在消息体中添加会话号字段来实现。

我就是觉得loadruner可能是通过不同vuser请求端口的不同来保证接收到发送请求消息对应的正确响应的。比如你举的多个http客户端浏览web服务的例子。这就和我想测试的系统的通信模型有很大的不同。想请教一下大家有什么好的方法。

另外2楼说“loadrunner关于socket的连接都是阻塞的”,这点我有些怀疑,参考loadrunner关于lrs_receive函数的说明
“The lrs_receive function reads the incoming data from a datagram or stream socket. If no incoming data is available at the socket, lrs_receive waits for data to arrive unless the socket is non-blocking. ”
从“unless the socket is non-blocking. ”这就句话,可以看出loadrunner可以在vuser的脚本中使用非阻塞的socket。

我是刚接触loadrunner的,很多关于loadrunner的问题要向大家请教,我多年的工作让我认识到不懂就要问,没觉得如果问的问题比较
肤浅就是信口开河,至于某些开发人员是否会笑,那更是无暇顾及的了。。
作者: sunshinelius    时间: 2005-2-3 11:00
不管上层radius协议还是http协议,下层都是靠socket来支持实现的。你问的问题是基于socket的,至于上层千变万化的协议不用考虑。
如果radius client端通过一个端口向servr发送请求消息,那它只会创建一条socket连接通路,整个程序中只可能运行一条socket初始化语句。
但多个vuser是多个线程,每个线程都初始化了一个socket,一条初始化socket语句创建一个socket连接,这个没错吧。
另外
-----------------------------------
The lrs_receive function reads the incoming data from a datagram or stream socket. If no incoming data is available at the socket, lrs_receive waits for data to arrive unless the socket is non-blocking
----------------------------------
这一句话怎么能断定loadrunner使用非阻塞的socket?前面已经说得很清楚,socket直到等到接收到数据才返回(这是阻塞调用),unless the socket is non-blocking是“除非这个socket本身就是非阻塞的”。这句话已经说得很明白了,lr_receive_socket本身是阻塞机制实现的,除非底层的socket是异步的。可以做个试验嘛,你录制一个socket脚本,试试连接断掉的情况下,send和receive操作会不会失败。

另外,楼主,我觉得我们讨论的问题已经不是loadrunner的问题了,是软件,网络的一些基本概念和知识。
我回帖时言辞有些偏激,这个向你道歉。但问题是必须要说明清楚的。
作者: sunshinelius    时间: 2005-2-3 11:12
radius下层使用同一个socket,但在应用层来识别不同请求。而不同的socket就不存在这个问题了,server端会识别不同的socket。
当多个vuser并发连接server时,可以查看server端口监听情况,会发现有多个loadrunner pc上有多个socket通过不同端口连接上来。
这是个做个试验就能解决的问题
作者: jcyrss    时间: 2005-2-3 12:48
对,
我原来就是觉得loadrunner的多个vuser都会创建和服务的socket连接,每个连接上传输单个用户的请求响应。这个是符合web服务的性能测试的模型的。

但是如果对radiusServer这种只接收一个或少数几个radiusClient的单个连接,而在单个连接上有大量针对不同用户的请求和响应,这个要使用loadrunner这个工具来进行测试,应该怎么做?敬请各位大侠指教,不胜感激

另外,我不是说loadrunner使用非阻塞的socket,而是说使用阻塞和非阻塞的socket应该都是可以的。未必loadrunner只能使用阻塞的socket。
作者: ggp203    时间: 2007-4-24 18:24
标题: 同样问题
异步通讯,也碰到同样问题,客户端向服务端发出服务请求, 不等服务器返回结果,又去发送别的请求或处理数据,服务器返回刚才请求的结果时,通过回调函数实现。

这样的系统,loadrunner响应时间怎么算?




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