2014-03-04 528 views
1

我在寫一個可以異步觸發某些事件的應用程序。測試看起來像這樣:設置所有內容,休眠一段時間,檢查事件是否已觸發。嘲笑「睡眠」

但是由於等待測試需要相當長的時間才能運行 - 我在等待大約10秒的每次測試。我覺得我的測試很慢 - 還有其他地方我可以加快速度,但這種睡眠似乎是加速它的最明顯的地方。

什麼是消除睡眠的正確方法?有什麼辦法來欺騙日期時間或類似的東西?

該應用程序是一個基於龍捲風的web應用程序,異步事件由IOLoop觸發,所以我沒有辦法直接觸發它自己。

編輯:更多詳情。

該測試是一種集成測試,我願意嘲笑第三方代碼,但不想直接觸發自己的代碼。

該測試旨在驗證某個消息是否使用websocket發送,並在瀏覽器中正確處理。消息在客戶端連接到websocket處理程序時開始的特定超時後發送。超時值取當前連接時的datetime.now()與數據庫中的值之差。在使用硒請求頁面之前,該值被人爲設置爲datetime.now() - 5 seconds。由於加載頁面需要一些時間,並且可能在不同的機器上有點隨意,我不認爲減少5秒的時間間隔是明智的。超時後加載頁面將產生不同的結果(不應發送websocket消息)。

所以問題是強制龍捲風的IOLoop在websocket連接後的任何時候發送消息 - 如果在設置數據庫值後0.5秒內發生這種情況,還剩4.5秒等待,我想嘗試並消除那個延遲。

兩個顯而易見的地方是IOLoop本身和datetime.now()。現在的問題是,我應該哪一個猴子補丁和如何。

回答

1

我想要模擬sleep那麼你不能直接在你的應用程序的代碼中使用它。我會創建一個像System.sleep()這樣的類方法,並在您的應用程序中使用它。那麼System.sleep()就可以被嘲笑了。

+0

問題是我使用的框架執行所有的調度,我真的不知道它是如何完成的。儘管我可以用理論上替代它。 – aragaer

1

使用內置的tornado testing tools。每個測試都會得到它自己的IOLoop,並且您使用self.stopself.wait從中獲取結果,例如, (從文檔):

client = AsyncHTTPClient(self.io_loop) 
    # call self.stop on fetch completion 
    client.fetch("http://www.tornadoweb.org/", self.stop) 
    response = self.wait() 
+0

仍然值得使用'AsyncHTTPTestCase'和self.stop/self.wait,我想。看看龍捲風如何測試網絡套接字:https://github.com/facebook/tornado/blob/master/tornado/test/websocket_test.py#L62 –

+0

啊,我明白了。最快的方式做測試應該仍然是使用一個回調 - 一旦web套接字消息被髮送,有頁面設置和執行回調,在這點您能檢查結果。 –

+0

可以。但是消息被解僱的時間呢?它計劃在一定的時間間隔後發送,這就是客戶端等待的原因。 – aragaer