在测试中嘲笑睡眠
mocking sleep in a test
我有一个要测试的函数,它最终会调用另一个函数,其中有一些 time.sleep 函数。我不想让我的测试休眠。所以,我的问题是,是模拟测试函数更好,还是包装我对函数的调用以使用补丁进行测试?
示例 1
@patch('time.sleep')
def test_some_function(mock_time):
data = some_sleepy_function()
assert data == expected_data
示例 2:
def test_some_function():
@patch('time.sleep')
def run_function(mock_sleep):
return some_sleepy_function()
assert run_function() == expected_data
为了模拟像 time.sleep
这样简单的东西,我会使用 py.test 的 monkeypatch
:
def test_some_function(monkeypatch):
monkeypatch.setattr(time, 'sleep', lambda s: None)
data = some_sleepy_function()
assert data == expected_data
如果您将测试分组在 class 中:
class Test:
def test_some_function(self, monkeypatch):
monkeypatch.setattr(time, 'sleep', lambda s: None)
data = some_sleepy_function()
assert data == expected_data
请注意,这仅对 "standard" pytest classes 有效(不适用于 unittest.TestCase
subclasses)。
在我看来,将 mock.patch
作为装饰器与 pytest 一起使用是令人困惑的,因为 py.test 的固定装置作为参数传递给测试函数。
我有一个要测试的函数,它最终会调用另一个函数,其中有一些 time.sleep 函数。我不想让我的测试休眠。所以,我的问题是,是模拟测试函数更好,还是包装我对函数的调用以使用补丁进行测试?
示例 1
@patch('time.sleep')
def test_some_function(mock_time):
data = some_sleepy_function()
assert data == expected_data
示例 2:
def test_some_function():
@patch('time.sleep')
def run_function(mock_sleep):
return some_sleepy_function()
assert run_function() == expected_data
为了模拟像 time.sleep
这样简单的东西,我会使用 py.test 的 monkeypatch
:
def test_some_function(monkeypatch):
monkeypatch.setattr(time, 'sleep', lambda s: None)
data = some_sleepy_function()
assert data == expected_data
如果您将测试分组在 class 中:
class Test:
def test_some_function(self, monkeypatch):
monkeypatch.setattr(time, 'sleep', lambda s: None)
data = some_sleepy_function()
assert data == expected_data
请注意,这仅对 "standard" pytest classes 有效(不适用于 unittest.TestCase
subclasses)。
在我看来,将 mock.patch
作为装饰器与 pytest 一起使用是令人困惑的,因为 py.test 的固定装置作为参数传递给测试函数。