我有一些代码使用multiprocessing.Pool来分叉worker并并行执行任务。我试图找到正确方法来运行此代码的单元测试。
注意我不尝试并行测试串行代码测试用例,我知道像nose支持的软件包。
如果我编写一个测试所述并行代码的测试函数,并尝试使用nose运行测试: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:Windows 7 64位上的Python 2.7.10 amd64
答案 0 :(得分:3)
看起来像(见http://7fttallrussian.blogspot.com/2014/04/fix-for-bug-with-unittest-and.html)
在所有Pythons中都存在一个错误,直到2.7.6(即到目前为止所有2.x, 2014年4月17日),在Windows上使用unittest和多处理模块时出现了错误。 ...它已在新的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
免责声明:我自己(至少尚未)尝试过这些解决方案。我遇到了他们,这个问题,同时试图解决不同的问题。如果我尝试任何这些解决方案,我会修改这篇文章。
答案 1 :(得分:1)
我更喜欢使用python mock在单元测试中模拟多处理。因为单元测试应该独立和可重复。这就是为什么我通常会创建多处理类的模拟版本(Process
和Pool
)。只是为了确保我的测试以正确的方式执行。