在单元测试中模拟 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
可能的相关问题:
- Mocking method in class called through Multiprocessing.Process
- How should I unit test multithreaded code?
编辑:
This package实际上提供了这个功能。不幸的是,它在 pypi 上既不可用也不积极维护。
我想测试 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
可能的相关问题:
- Mocking method in class called through Multiprocessing.Process
- How should I unit test multithreaded code?
编辑:
This package实际上提供了这个功能。不幸的是,它在 pypi 上既不可用也不积极维护。