【问题标题】:Pytest mocked function takes too long to runPytest 模拟函数运行时间过长
【发布时间】:2022-01-21 10:26:26
【问题描述】:

我正在学习在编写单元测试时使用模拟。但是,如果我不嘲笑它们,我的测试总是会花费一些时间。考虑这个示例函数:

application.py

from time import sleep
    
def is_windows():
    # fake slow operation
    sleep(5)
    return True


def get_operating_system():
    return 'Windows' if is_windows() else 'Linux'

application_test.py

from application import get_operating_system


# 'mocker' fixture provided by pytest-mock
def test_get_operating_system(mocker):
    # Mock the slow function to return True
    mocker.patch('application.is_windows', return_value=True)
    assert get_operating_system() == 'Windows'

由于某种原因,此测试的运行时间总是超过 5 秒。如果我从is_windows() 中删除sleep(5),那么测试会在一秒钟内运行,所以看起来这个函数根本没有被嘲笑!我在这里做错了吗?任何帮助表示赞赏。谢谢。

编辑:我正在从 PyCharm 运行我的测试。

【问题讨论】:

  • 我添加了计时输出,但您的设置中发生了其他事情。你的目录是什么样的,测试是如何运行的?

标签: python-3.x pytest pytest-mock


【解决方案1】:

如果要在其中模拟某些内容,则需要导入 application

import application

def test_get_operating_system(mocker):
    # Mock the slow function to return True
    mocker.patch('application.is_windows', return_value=True)
    assert application.get_operating_system() == 'Windows'

否则,您没有使用该补丁。


edit:实际上,也许我对此很着迷。您的代码按预期模拟它。我已经在我的机器上运行它并且它工作正常。

输出

没有补丁:

1 passed in 5.03s

mocker.patch("application.is_windows", return_value=True):

1 passed in 0.02s

mocker.patch("application.is_windows", return_value=False):

1 failed in 0.10s

【讨论】:

  • 我在我的机器上试过了,仍然需要 5 秒以上!!
  • 谢谢@theherk。您必须导入模块并将模拟函数调用为 application.get_operating_system() 是正确的。尽管这个特定示例即使不以这种方式调用也可以工作,但我的实际测试代码却没有(函数的输出未被模拟)并且测试失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
相关资源
最近更新 更多