0

我正在爲一個複雜項目運行一個大的單元測試存儲庫。 這個項目有一些事情,不要有大的測試數量以及玩:單元測試的臨時對象池?

  1. 緩存(memoization的)導致的對象不是測試
  2. 在模塊級的複雜對象是單身,並可能收集之間被釋放數據時使用

我對每個測試(或至少每個測試套件)有自己的「蟒蛇 - 對象池」,並能夠釋放它後感興趣。

排序一個python-垃圾收集,問題解決方法的。

我想象一個python自包含的臨時性和可丟棄解釋器,它可以爲我運行某些代碼,之後我可以調用「interpreter.free()」並確保它不泄漏。此

一個艱難的解決方案,我發現是通過子用鼻子或實現這個每個我需要一個解釋消耗將運行一個測試時間。因此每個測試都會變成「fork_and_run(條件)」,並且在原始進程中沒有內存泄漏。

還看見鼻子單一的過程每個測試和sequantially運行測試 - 儘管人們提到它有時會凍結中途 - 那麼好玩..

是否有一個簡單的解決方案?

P.S. 我不感興趣,通過大量的其他民族的代碼去,並試圖讓所有的緩存/對象/項目是可以完全清除內存管理對象。

P.P.S 我們的PROD代碼也爲每項工作創造了一個新的流程,這非常舒適,因爲我們不必喋喋不休地「永遠生存」和其他可怕的故事。

回答

0

TL; DR 模塊重裝招我試過在本地工作,用不同的Python版本的機器上使用時,打破了......

我最終採取我在寫代碼的任何和所有的緩存(?!)並將它們添加到全局緩存列表 - 然後在測試之間清除它們。 不幸的是,如果任何人使用緩存/手動緩存機制並錯過了這一點,測試將開始在內存中再次增長...

對於初學者,我寫了一個循環,通過sys.modules字典和重新加載(循環兩次)我的代碼的所有模塊。這個工作得 - 所有引用被釋放正確,但似乎它不能在多個原因的生產/嚴重的代碼中使用:

  1. 舊版本的Python重載和繼承元類被重新定義的類時打破(我仍然不要明白這是怎麼打破的)。
  2. 單元測試生存重裝,有時有不好的情況下,以老班 - 特別是如果該類使用另一個類的實例。想想super(class_name,self),其中self是先前定義的類,現在class_name是重新定義的同名名稱類。