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
我正在使用 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