[英]How to unit-test code that uses python-multiprocessing
我有一些代碼使用 multiprocessing.Pool 來分叉工人並並行執行任務。 我正在嘗試找到運行此代碼的單元測試的正確方法。
注意我不是要並行測試串行代碼測試用例,我知道像鼻子支持這樣的包。
如果我編寫了一個測試所述並行代碼的測試函數,並嘗試通過以下方式使用鼻子運行測試: nosetests tests/test_function.py
非並行測試正確執行但並行測試在多處理嘗試分叉時失敗,因為 main 不可導入:
File "C:\python-2.7.10.amd64\lib\multiprocessing\forking.py", line 488, in prepare
assert main_name not in sys.modules, main_name
AssertionError: __main__
assert main_name not in sys.modules, main_name
AssertionError: _assert main_name not in sys.modules, main_name
_main__AssertionError
: __main__
這只是重復,直到我終止任務。 如果我修改tests/test_function.py
以包含以下內容,我可以成功運行測試:
if __name__ == '__main__':
import nose
nose.main()
然后用python tests\\test_function.py
執行
那么,與單元測試包集成的“正確”方法是什么(不必是鼻子)?
環境:Windows 7 64 位上的 Python 2.7.10 amd64
2020 年更新:使用 python 3 和 pytest,這不是問題,建議升級!
我更喜歡使用python mock在單元測試中模擬多處理。 因為單元測試應該是獨立的和可重復的。 這就是為什么我通常會創建多處理類( Process
和Pool
)的模擬版本。 只是為了確保我的測試以正確的方式執行。
它看起來像(見http://7fttallrussian.blogspot.com/2014/04/fix-for-bug-with-unittest-and.html )
在 Windows 上使用 unittest 和 multiprocessing 模塊時,2.7.6 之前的所有 Python(即到目前為止的所有 2.x, 2014 年 4 月 17 日)都存在一個錯誤。 ...它已在新的 Pythons 3.x 中修復,但尚未向后移植到 2.x
我看到有人建議:
來自“測試中的解決方法示例”的代碼(未顯着修改):
import unittest
import sys
class TestSample(unittest.TestCase):
def test(self):
# To fix the Windows forking system it's necessary to point __main__ to
# the module we want to execute in the forked process
old_main = sys.modules["__main__"]
old_main_file = sys.modules["__main__"].__file__
sys.modules["__main__"] = sys.modules["app"]
sys.modules["__main__"].__file__ = sys.modules["app"].__file__
# do your testing here
sys.modules["__main__"] = old_main
sys.modules["__main__"].__file__ = old_main_file
免責聲明:我自己還沒有嘗試過這些解決方案中的任何一個(至少現在是這樣)。 我在嘗試解決不同的問題時遇到了他們和這個問題。 如果我嘗試任何這些解決方案,我會修改這篇文章。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.