我正在尝试创建一个客户端,用于主要异步测试服务器的响应。我创建了一个基本上等待来自服务器的下一个响应的函数,如果在调用此函数时提供了requestId,它将查找提供了requestId的下一个响应。这是功能:
def getNextResponse(self, requestId = None):
logger = logging.getLogger(__name__)
self.acknowledge += 1
logger.info("requestId ack for this response: {}".format(requestId))
while(not self.response):
pass
self.acknowledge -= 1
logger.info("requestId unset for this response: {}".format(requestId))
message = json.loads(self.messagesList[len(self.messagesList)-1])
if(requestId != None):
while(requestId != message['body']['requestId']):
self.acknowledge += 1
while(not self.response):
pass
self.acknowledge -= 1
message = self.messagesList[len(self.messagesList)-1]
self.startMonitor -= 1
return message['body']
我也有每个命令的辅助函数,可以发送到下面的引擎是ping命令的一个帮助函数:
def ping(self, sessionId = None, requestId = None, version="1.0"):
result = {
"method": "Ping"
}
if(None != version):
result['version'] = version
if(None != sessionId):
result['sessionId'] = sessionId
if(None != requestId):
result['requestId'] = requestId
logger = logging.getLogger(__name__)
logger.info("Message Sent: " + json.dumps(result, indent=4))
self.startMonitor += 1
self.ws.send(json.dumps(result))
message = self.getNextResponse(requestId = requestId)
return message
它基本上设置了一个json对象,它包含服务器所需的所有参数,然后将整个json消息发送到服务器。在发送之后,我调用getNextResponse来等待服务器的响应。 requestId默认设置为None,因此如果没有提供requestId,它将只查找服务器返回的下一个响应。由于其他异步命令可能会非常不一致,因此可以为命令提供唯一的requestId,以便来自服务器的响应也将包含此requestId,从而使每个响应都是唯一的。
在我的测试用例中,我使用:
生成一个随机requestIddef genRequestId(self):
x = random.randint(10000000, 99999999)
print x
reqId = str(x)+"-97a2-11e6-9346-fde5d2234523"
return reqId
我遇到的问题是有时(似乎是随机的),当我在我的一个测试用例中调用ping时,我收到此错误:
message = self.getNextResponse(requestId = requestId)
TypeError: string indices must be integers, not str
我对这个错误很困惑,我在ping内生成的requestId应该是一个字符串,我不会以任何方式引用它。我已经尝试删除对参数的引用,如下所示:
message = self.getNextResponse(requestId)
但我仍然收到此错误。 getNextResponse函数内部的错误没有更深入,这让我相信当我尝试调用它时它来自ping函数内部。任何帮助将不胜感激!
编辑:这是错误
追踪(最近一次通话): 在test009_recTimer_Start_withAudio中输入文件“ctetest./RegressionTest/WebsocketTest\test_18_RecTimer.py”,第385行 response = client.endSession(sessionId = sessionId,requestId = requestId_2)
文件“ctetest./RegressionTest/WebsocketTest../.././CTESetupClass\WebsocketCl ient.py“,第528行,在endSession中 message = self.getNextResponse(requestId) 文件“ctetest./RegressionTest/WebsocketTest../.././CTESetupClass\WebsocketCl 包装器中的第49行“ient.py” 提升 TypeError:字符串索引必须是整数,而不是str
答案 0 :(得分:0)
您的代码中有两个看起来非常相似的语句:
message = json.loads(self.messagesList[len(self.messagesList)-1])
然后再往下走:
message = self.messagesList[len(self.messagesList)-1]
第一个会将message
设置为一个json对象(可能是dict
),其中第二个将message
分配给一个字符串,我假设这不是意图而且是你的错误。