簡體   English   中英

如何對使用 python-multiprocessing 的代碼進行單元測試

[英]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在單元測試中模擬多處理。 因為單元測試應該是獨立的可重復的 這就是為什么我通常會創建多處理類( ProcessPool )的模擬版本。 只是為了確保我的測試以正確的方式執行。

它看起來像(見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.

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