我对pytest风格的单元测试还比较陌生,并且我想了解有关pytest固定装置的更多信息。我没有将范围参数传递给灯具,因此我知道范围是“函数”。这三种简单灯具的功能是否有所不同?为什么会偏爱一种方法?
@pytest.fixture()
@patch('a.b.c.structlog.get_logger')
def fixture_classQ(mock_log):
handler = MagicMock(spec=WidgetHandler)
return ClassQ(handler)
@pytest.fixture()
def fixture_classQ():
with patch('a.b.c.structlog.get_logger'):
handler = MagicMock(spec=WidgetHandler)
return ClassQ(handler)
@pytest.yield_fixture()
def fixture_classQ():
with patch('a.b.c.structlog.get_logger'):
handler = MagicMock(spec=WidgetHandler)
yield ClassQ(handler)
灯具的简单使用示例:
def test_classQ_str(fixture_classQ):
assert str(fixture_classQ) == "This is ClassQ"
谢谢。
答案 0 :(得分:0)
从第一个开始,这将创建一个纯数据夹具。该模拟(误导性的imo)仅在fixture函数期间有效,因为它使用return
。
为了大致了解发生了什么:
第二个在行为上与第一个相同,除了它使用mock
的上下文管理器形式而不是装饰器。我个人不喜欢装饰器形式,但是那只是我:D
(首先,我继续使用pytest.yield_fixture
是pytest.fixture
的不推荐使用的别名-您可以只使用@pytest.fixture
)
第三个功能有所不同!补丁在测试过程中是有效的,因为它在固定期间已“屈服”。这是一种整体创建安装和拆卸夹具的方法。这大概是这里的执行情况
next(...)
yield
,然后“暂停”。您可以将其视为一种例行程序__enter__
中的mock
被称为激活补丁yield
的值用作灯具的值next(...)
以耗尽固定装置
__exit__
的with语句,撤消补丁程序最好的答案是这取决于。由于1和2在功能上等效,因此取决于个人喜好。如果需要在整个测试过程中激活补丁,请选择3.。而且不要使用pytest.yield_fixture
,只需使用pytest.fixture
。