2015-10-14 80 views
4

我有一些代码使用multiprocessing.Pool来分叉工作并执行并行任务。我试图找到正确的方法运行此代码的单元测试。如何对使用python-multiprocessing的代码进行单元测试

注意我是而不是试图并行测试串行代码测试用例,我知道包像鼻子支持。

如果我编写一个测试所述并行代码的测试函数,并尝试通过以下方法用鼻子运行测试:nosetests tests/test_function.py非并行测试正确执行,但多处理尝试fork时并行测试失败,因为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

那么,什么是“正确”的方式做到这一点,将与单元测试包合并执行(没有按不必是鼻子)?

ENVIRON:Python的2.7.10 AMD64在Windows 7 64位

回答

2

它看起来像(见http://7fttallrussian.blogspot.com/2014/04/fix-for-bug-with-unittest-and.html

有一个在所有蟒蛇长达2.7.6中的错误(即所有2.X到目前为止,2014年4月17日),打破使用单元测试和多Windows上的模块。 ...它固定在新的蟒蛇3.x中,但还没有被移植到2.x但

我看到有人建议:

  • 补丁多模块本身(从第一链路的博文有。于贴片的链接我目前不能发布这里两个以上的链路)
  • 或实现在测试模块的解决方法类似:an example of workaround in a test

A码(非显著修饰的)来自“的WO一个例子rkaround在测试“:

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 

免责声明:我不是由我自己尝试过任何这些解决方案(至少现在还不是)。我遇到了他们,这个问题,同时试图解决不同的问题。如果我尝试任何这些解决方案,我会修改这篇文章。

+0

链接到补丁python 2.7中提到的答案:https://hg.python.org/cpython/rev/c82588ca3a79。 (无法将它包含在答案中,因为目前我只能使用最多两个链接) – augur

0

我更喜欢嘲笑使用python mock在单元测试多处理。因为单元测试应该是独立可重复。这就是为什么通常我会创建多处理类的模拟版本(ProcessPool)。只是为了确保我的测试以正确的方式执行。

相关问题