【问题标题】:How to test a method whose sole purpose is to calculate its sleep duration and sleep it如何测试一种方法,其唯一目的是计算其睡眠持续时间并使其睡眠
【发布时间】:2020-01-10 11:25:05
【问题描述】:

我应该如何测试这样的方法? (无需等待睡眠时间)

                  #    A method in the Time class    #
"""Sleeps until the minute count on the digital clock is divisible by 5."""
@staticmethod
def sleepUntilMinuteDivisibleBy5():
    seconds_left = Time.calculateSecondsLeft()
    minutes_left = Time.calculateMinutesLeft()
    sleep(minutes_left * 60 + seconds_left)

如果我不在乎必须等待持续时间,我会这样做

from unittest import TestCase, main
from Time import Time   # This is my time class
from datetime import datetime

class TestTime(TestCase):

    def test_sleepUntilMinuteDivisibleBy5(self):

        Time.sleepUntilMinuteDivisibleBy5()  # Sleep until the minutes is divisble by 5

        assert (datetime.now().time().minute % 5) == 0  # Check the minutes is divisible by 5

【问题讨论】:

  • 你创造了一些“模拟”时间的方法。
  • 或者,或者,让你的函数是“纯粹的”,这样就不需要与现实世界交互。让来电者处理。同样的原因直接打印到标准输出通常是一个蹩脚的想法。
  • @MateenUlhaq 这是一个很好的观点,我不这样做的原因是因为我需要“睡眠持续时间直到分钟可以被 5 整除”很多次,所以它为它创建一个方法是有意义的,以避免sleep(Time.getTimeUntilMinuteDivisibleBy5()) 而是使用Time.sleepUntilMinuteDivisibleBy5()(为了便于阅读)——想象一下前者与后者相比有很多地方。
  • 假设您不关心您的测试运行缓慢,您能否展示您将用于测试的代码?

标签: python-3.x unit-testing testing python-unittest


【解决方案1】:

您可以使用unittest.mock.patch 模拟time.sleep 方法。然后它会立即执行。

例如

Time.py:

from time import sleep


class Time:
    @staticmethod
    def sleepUntilMinuteDivisibleBy5():
        seconds_left = Time.calculateSecondsLeft()
        minutes_left = Time.calculateMinutesLeft()
        sleep(minutes_left * 60 + seconds_left)

    @staticmethod
    def calculateMinutesLeft():
        return 1

    @staticmethod
    def calculateSecondsLeft():
        return 40

test_Time.py:

import unittest
from unittest.mock import patch
from Time import Time
from datetime import datetime


class TestTime(unittest.TestCase):
    @patch('Time.sleep', return_value=None)
    def test_sleepUntilMinuteDivisibleBy5(self, mock_sleep):
        Time.sleepUntilMinuteDivisibleBy5()
        mock_sleep.assert_called_with(100)


if __name__ == '__main__':
    unittest.main()

100% 覆盖率的单元测试结果:

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
Name                                      Stmts   Miss  Cover   Missing
-----------------------------------------------------------------------
src/stackoverflow/59680752/Time.py           10      0   100%
src/stackoverflow/59680752/test_Time.py      10      0   100%
-----------------------------------------------------------------------
TOTAL                                        20      0   100%

【讨论】:

    猜你喜欢
    • 2020-09-24
    • 2022-01-12
    • 2013-12-11
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多