我想創建一個客戶端用於主要測試異步服務器的響應。我創建了一個函數,基本上等待來自服務器的下一個響應,如果在調用此函數時提供了requestId,它將使用提供的requestId查找下一個響應。下面是函數:意外的類型錯誤python
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,從而使每個響應都是唯一的。
在我的測試情況下,我通過使用生成一個隨機的requestId:
def genRequestId(self):
x = random.randint(10000000, 99999999)
print x
reqId = str(x)+"-97a2-11e6-9346-fde5d2234523"
return reqId
,我遇到的是,有時(似乎是隨機的)的問題,當我在我的測試用例一個叫平,我得到這個錯誤:
message = self.getNextResponse(requestId = requestId)
TypeError: string indices must be integers, not str
我感到相當這個錯誤困惑,請求ID,我產生內平應該是一個字符串,並以任何方式我不是在它裏面引用。我試圖刪除參數的參考像這樣:
message = self.getNextResponse(requestId)
但我仍然收到此錯誤。這個錯誤在getNextResponse函數裏面並沒有更深入的地方,這讓我相信當我嘗試調用它時,它來自ping函數內部。任何幫助將不勝感激!
編輯:以下是錯誤
回溯(最近通話最後一個): 文件 「ctetest./RegressionTest/WebsocketTest\test_18_RecTimer.py」,線路385,在test009_recTimer_Start_withAudio 響應= client.endSession(的sessionId =的sessionId,的requestId = requestId_2)
文件 「ctetest./RegressionTest/WebsocketTest../.././CTESetupClass\WebsocketCl ient.py」,線路528,在endSession 消息= self.getNextResponse(的requestId) 文件「ctetest./RegressionTest/WebsocketTest../.././CTESetupClass\W ebsocket C1 。PY」 49行,在包裝 提高RET 類型錯誤:字符串索引必須是整數,而不是str的
完整的堆棧跟蹤! –
' while(not self.response):pass'看起來好像你想要一個鎖或一個隊列來「等待」另一個線程給你一個迴應 –