簡體   English   中英

Python 代碼覆蓋和多處理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM