2016-10-05 29 views
0

我在我的測試套件中看到一個問題,一切正常,直到我超時。如果由於超時而導致測試失敗,tearDown函數永遠不會被調用,從而使反應堆不清潔,從而導致其餘測試失敗。我認爲應該在超時後調用tearDown,有人知道爲什麼會發生這種情況嗎?tearDown在扭曲試驗超時後未被調用?

回答

1

無論測試結果如何,您都應該調用tearDown()。從the documentationtearDown()

這就是所謂即使測試方法引發異常

然而,有一個陷阱。從相同的文檔:

只有在setUp()成功時纔會調用此方法,無論測試方法的結果如何。

所以,它聽起來就像你也許開始反應器setUp(),當它超時,這是防止您的tearDown()運行 - 的想法是,無論你試圖在setUp()到「設置」中成功設置,所以你不想試圖撕毀它。但是,除非您提供方法的代碼以及任何相關測試的代碼,否則很難確定診斷。

+0

有什麼方法可以判斷setUp是否失敗?它看起來正在成功完成並繼續進行測試。然後它在測試和tearDown失敗永遠不會被稱爲 – ppao

+0

超時是否引發異常?如果是這樣,你可以嘗試捕獲該異常。但是如果沒有看到方法就很難說。你可以在你的問題中添加你的'setUp'方法的代碼嗎? – elethan

1

這很奇怪,因爲在我的盒子裏,即使發生超時,拆卸也會執行。除非您使用--unclean-warnings標誌,否則測試應停止運行,如果反應器不處於清潔狀態。測試運動員在超時後停止嗎?你正在運行什麼版本的Python和Twisted?作爲一個方面說明,如果您需要針對特定​​測試功能運行獨特的拆卸,則有一個非常方便的addCleanup()回調。如果您需要取消回調,LoopingCall或callLater函數,以便反應堆不處於髒狀態,它就派上用場了。 addCleanup返回Deferred,因此您可以鏈接執行adhoc拆卸的回調。如果班級拆解不適合你,這可能是一個很好的選擇。

PS

我已經習慣了寫「很乖」扭曲的代碼,我甚至不記得怎麼進入不潔淨的反應器狀態:d我發誓,我不是吹牛。你能否給我提供一個你正在做什麼的簡要總結,以便我可以在我的最後測試它?

0

我發現了這個問題,我會把它放在這裏,以防將來對其他人有幫助。

我正在返回一個已經被調用的延遲測試(如in,deferred.callback已被調用),但它仍然有一個未完成的回調鏈。從我在這裏的試驗代碼https://github.com/twisted/twisted/blob/twisted-16.5.0/src/twisted/trial/_asynctest.py#L92中可以看到,發生這種情況時反應堆會發生碰撞,這就解釋了爲什麼tearDown不會被調用。對我來說,解決方案是從有問題的測試中返回延遲,這些測試沒有長時間存在的回調鏈(回調函數本身不會返回延遲)。