首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python单元测试中使用存根time.sleep()

如何在Python单元测试中使用存根time.sleep()
EN

Stack Overflow用户
提问于 2014-04-03 19:53:59
回答 4查看 23.8K关注 0票数 25

我想创建一个存根以防止time.sleep(..)休眠以改善单元测试执行时间。

我所拥有的是:

代码语言:javascript
复制
import time as orgtime

class time(orgtime):
    '''Stub for time.'''
    _sleep_speed_factor = 1.0

    @staticmethod
    def _set_sleep_speed_factor(sleep_speed_factor):
        '''Sets sleep speed.'''
        time._sleep_speed_factor = sleep_speed_factor


    @staticmethod
    def sleep(duration):
        '''Sleeps or not.'''
        print duration * time._sleep_speed_factor
        super.sleep(duration * time._sleep_speed_factor) 

但是,在上面的第二行代码(类定义)中,我得到了以下错误:

代码语言:javascript
复制
TypeError: Error when calling the metaclass bases
module.__init__() takes at most 2 arguments (3 given).

如何修复这个错误?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-04-03 21:35:34

您可以在测试中使用mock库。

代码语言:javascript
复制
import time
from mock import patch

class MyTestCase(...):


     @patch('time.sleep', return_value=None)
     def my_test(self, patched_time_sleep):
          time.sleep(666)  # Should be instant
票数 42
EN

Stack Overflow用户

发布于 2018-06-19 08:37:26

接受的答案仍然有效。然而,从Python3.3开始,unittest.mock就成为了Python标准库的正式组成部分。

代码语言:javascript
复制
import time
from unittest import TestCase
from unittest.mock import patch

class TestMyCase(TestCase):

    @patch('time.sleep', return_value=None)
    def test_my_method(self, patched_time_sleep):
        time.sleep(60)  # Should be instant

        # the mock should only be called once
        self.assertEqual(1, patched_time_sleep.call_count)
        # or 
        patched_time_sleep.assert_called_once()

    # alternative version using a context manager
    def test_my_method_alternative(self):
        with patch('time.sleep', return_value=None) as patched_time_sleep:
            time.sleep(60)  # Should be instant

        # the mock should only be called once
        self.assertEqual(1, patched_time_sleep.call_count)
        # or 
        patched_time_sleep.assert_called_once()
票数 10
EN

Stack Overflow用户

发布于 2019-02-22 22:46:22

我正在使用pytest,并使用以下fixture来修补time.sleep

代码语言:javascript
复制
import pytest


@pytest.fixture
def sleepless(monkeypatch):

    def sleep(seconds):
        pass

    monkeypatch.setattr(time, 'sleep', sleep)

然后在我需要“加速”睡眠的测试中,我只需要使用这个fixture:

代码语言:javascript
复制
import time

def test_sleep(sleepless):
    time.sleep(60)

因此,当您运行此测试时,您将看到它在更短的时间内完成:

代码语言:javascript
复制
= 1 passed in 0.02 seconds =
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22836874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档