mock.call_count的线程安全版本

时间:2016-09-05 13:53:25

标签: python multithreading unit-testing mocking

Mock.call_count似乎无法正常使用线程。例如:

import threading
import time
from mock import MagicMock


def f():
    time.sleep(0.1)

def test_1():
    mock = MagicMock(side_effect=f)
    nb_threads = 100000
    threads = []
    for _ in range(nb_threads):
        thread = threading.Thread(target=mock)
        threads.append(thread)
        thread.start()

    for thread in threads:
        thread.join()

    assert mock.call_count == nb_threads, mock.call_count

test_1()

此代码产生以下输出:

Traceback (most recent call last):
  File "test1.py", line 24, in <module>
    test_1()
  File "test1.py", line 21, in test_1
    assert mock.call_count == nb_threads, mock.call_count
AssertionError: 99994

有没有办法可以在代码的多线程部分中使用call_count(或类似的)?我想避免自己重写MagicMock ......

1 个答案:

答案 0 :(得分:3)

我终于通过使用链接到副作用方法和锁定的计数器来实现它。

1440px

因此,我计算import threading import time from mock import MagicMock lock_side_effect = threading.Lock() def f(): with lock_side_effect: f.call_count += 1 time.sleep(0.1) f.call_count = 0 def test_1(): mock = MagicMock(side_effect=f) nb_threads = 100000 threads = [] for _ in range(nb_threads): thread = threading.Thread(target=mock) threads.append(thread) thread.start() for thread in threads: thread.join() assert f.call_count == nb_threads, f.call_count test_1() 而不是f的来电次数,但结果与预期一致。