2016-12-15 65 views
0

我想創建一個客戶端用於主要測試異步服務器的響應。我創建了一個函數,基本上等待來自服務器的下一個響應,如果在調用此函數時提供了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的

+1

完整的堆棧跟蹤! –

+0

' while(not self.response):pass'看起來好像你想要一個鎖或一個隊列來「等待」另一個線程給你一個迴應 –

回答

0

你必須在你的代碼的兩個語句看起來很相似:

message = json.loads(self.messagesList[len(self.messagesList)-1]) 

,然後進一步下跌:

 message = self.messagesList[len(self.messagesList)-1] 

第一將設置message到JSON對象(可能dict),其中第二個分配message爲一個字符串,我假設這是不INTE nded和你的錯誤的原因。

+0

謝謝,我從字面上查看了幾十次,並以某種方式這永遠不會彈出給我。 – Ted