在单元测试中模拟 multiprocessing.Process 目标

mocking multiprocessing.Process target in unit tests

我想测试 multiprocessing.Process 是否调用了模拟方法。我知道子流程调用会分叉当前流程,并且信息只能在子流程中使用。但是,我想知道是否有一种干净的方法来测试这样的用例。

一种可能性肯定是不使用模拟,而是调用一个函数,该函数只是在某处写入文件并使用它来验证该方法是否成功 运行。但是,带有模拟的“干净”解决方案对我来说肯定更可取。

最小示例:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import multiprocessing
from unittest.mock import MagicMock

# Create mock method
mocked_target: MagicMock = MagicMock()

# Make sure that the call counter works
assert 0 == mocked_target.call_count
mocked_target()
assert 1 == mocked_target.call_count

# Call the method via multiprocessing
process: multiprocessing.Process = multiprocessing.Process(target=mocked_target)
process.start()
process.join()
assert 2 == mocked_target.call_count  # Does not work, call counter is still 1

可能的相关问题:

编辑:

This package实际上提供了这个功能。不幸的是,它在 pypi 上既不可用也不积极维护。

如前所述,https://github.com/elritsch/python-sharedmock 做得很好。