Вы можете попробовать издеваться над своими тестами:
import multiprocessing.pool
from unittest.mock import patch
...
with patch(
'multiprocessing.pool.ApplyResult.get',
autospec=True,
wraps=multiprocessing.pool.ApplyResult.get
) as patched:
async_start = time.clock()
loop = asyncio.get_event_loop()
try:
async_data = loop.run_until_complete(main_async(total_cnt))
finally:
loop.close()
async_time = time.clock() - async_start
patched.assert_not_called()
...
pool_start = time.clock()
pool_data = main_pool(total_cnt)
pool_time = time.clock() - pool_start
patched.assert_called()
pool.ApplyResult.get
- это метод, который вызывается перед возвратом значения из pool.map (а также из apply, join), поэтому, если вы не уверены, какой именно метод из многопроцессорной обработки использует второй протестированный модуль, вы можете придерживаться пула.ApplyResult.get).
Затем объект unittest.mock.patch
: это инструмент, используемый при тестировании, и его цель - заменить какой-либо метод или объект либо в стандартной библиотеке, либо в сторонних библиотеках. Обычно он предотвращает вызов исправленного метода и просто возвращает какое-то предопределенное значение, имитирующее работу исходного метода.
Но вы можете использовать по-другому, с параметром wraps
. Если вы передадите исходный метод этому параметру, исходный метод будет вызван в процессе. Тем не менее, pool.ApplyResult.get
будет содержать исправленный объект вместо оригинального get
метода. Но оригинальный get
вызывается, когда исправленный объект обрабатывает вызов. Таким образом, вы можете получить как результат этого метода, так и некоторую дополнительную статистику, предоставляемую библиотекой unittest, например assert_called
.