[英]Python Code Coverage and Multiprocessing
我將工作服與coverage.py結合使用來跟蹤我的測試腳本的 python 代碼覆蓋率。 我使用以下命令:
coverage run --parallel-mode --source=mysource --omit=*/stuff/idont/need.py ./mysource/tests/run_all_tests.py
coverage combine
coveralls --verbose
除了multiprocessing之外,這工作得很好。 不跟蹤工作池或子進程執行的代碼。
是否有可能同時跟蹤多處理代碼? 我缺少任何特定選項嗎? 也許在每次產生新進程時向多處理庫添加包裝器以開始覆蓋?
編輯:
我(和 jonrsharpe,也 :-) 找到了multiprocessing 的猴子補丁。
然而,這對我不起作用,我的Tracis-CI構建幾乎在開始后就被殺死了。 我在我的本地機器上檢查了這個問題,顯然將補丁添加到多處理破壞了我的 memory。使用此修復程序進行的 memory 的測試需要超過 16GB 的內存。
編輯2 :
monkey-patch 在經過小的修改后確實有效:刪除config_file
解析( config_file=os.environ['COVERAGE_PROCESS_START']
)達到了目的。 這解決了 memory 臃腫的問題。因此,相應的行簡單地變成:
cov = coverage(data_suffix=True)
Coverage 4.0包含一個命令行選項--concurrency=multiprocessing
來處理這個問題。 您必須在之后使用coverage combine
。 例如,如果您的測試位於regression_tests.py
,那么您只需在命令行執行此操作:
coverage run --concurrency=multiprocessing regression_tests.py
coverage combine
我花了一些時間試圖確保覆蓋率適用於multiprocessing.Pool
,但它從未奏效。
我終於做了一個讓它起作用的修復 - 如果有人指導我,如果我做錯了什么會很高興。
https://gist.github.com/andreycizov/ee59806a3ac6955c127e511c5e84d2b6
即使使用concurrency=multiprocessing
,分叉進程丟失覆蓋率數據的可能原因之一是multiprocessing.Pool
關閉的方式。 例如, with
語句導致terminate()
調用(參見此處的__exit__
)。 因此,池工作人員沒有時間保存覆蓋率數據。 我不得不使用close()
、定時join()
(在線程中)、 terminate
序列而不是with
來保存覆蓋結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.