Pytest 补丁在特定条件下休眠

Pytest Patching Sleep On Certain Condition

我正在使用 Pytest 和 Python 3.6 编写测试。我的测试使用一个名为 online 的 ENV var,我用它来确定测试是否会命中真正的 Web 服务,或者它是否只是回放。

我想在所有测试都没有在线测试时修补睡眠。当测试处于在线模式时,不要打补丁。有没有办法在pytest上做到这一点?我最初的想法是使用一个使用 env var 来进行 monkeypatch 或不进行 monkeypatch 的装置。

我不知道该怎么做?

最简单的方法是使用 autouse fixture。标准方法是使用 mock.patch 模拟函数:

from unittest import mock
import pytest

@pytest.fixture(autouse=True)
def patch_sleep():
    if "ONLINE" in os.environ and os.environ["ONLINE"] == "1":
        with mock.patch("time.sleep"):
            yield
    else:
        yield

在这种情况下,函数将在每次测试中打补丁,并在每次测试后恢复补丁。如果你使用 autouse=True,fixture 将在所有测试中自动调用,否则你必须在测试中引用它。

如果您知道您的环境在测试期间不能改变,您可以使用在测试会话中只调用一次的会话范围的固定装置:

@pytest.fixture(autouse=True, scope="session")
def patch_sleep():
   ...

在这种情况下,time.sleep 将在所有测试之前打补丁 运行,并在所有测试完成后恢复补丁。

如果不想使用unittest.patch,可以使用pytest-mock插件,它提供了mocker fixture:

@pytest.fixture(autouse=True)
def patch_sleep(mocker):
    if "ONLINE" in os.environ and os.environ["ONLINE"] == "1":
        mocker.patch("time.sleep")
        yield
    else:
        yield

您也可以使用 monkeypatch,尽管这不是修补函数的常用方法:

@pytest.fixture(autouse=True)
def patch_sleep(monkeypatch):
    def dont_sleep(sec):
        pass

    if "ONLINE" in os.environ and os.environ["ONLINE"] == "1":
        monkeypatch.setattr(time, "sleep", dont_sleep)
        yield
    else:
        yield