pytest中fixture和yield_fixture之间的区别

问题描述 投票:10回答:2

我正在通过pytest灯具,以下看起来非常相似,最新的作品非常相似。

是的,yield_fixure的可读性更好,但有人可以让我知道究竟有什么区别。

我应该使用哪种情况,如下所述?

@pytest.fixture()
def open_browser(request):
    print("Browser opened")

    def close_browser():
        print("browser closed")

    request.addfinalizer(close_browser)

    return "browser object"

@pytest.yield_fixture()
def open_browser():
    print("Browser opened")
    yield "browser object"
    print("browser closed")


def test_google_search(open_browser):
    print(open_browser)
    print("test_google_search")
python python-2.7 pytest fixtures
2个回答
12
投票

唯一的区别在于可读性。我认为(虽然我不是100%肯定)基础行为是相同的(即yield语句作为终结器运行后的清理)。我总是喜欢使用屈服夹具进行清理,因为它更具可读性。

如果你使用pytest <3.0,你仍然需要使用pytest.yield_fixture来获得这种行为。但是如果你能够使用pytest 3.0+,那么pytest.yield_fixture已被弃用,你可以使用pytest.fixture来获得相同的yield_fixture行为。

这是the explanatory docs

从pytest-3.0开始,使用普通夹具装饰器的夹具可以使用yield语句来提供夹具值并执行拆卸代码,就像之前版本中的yield_fixture一样。

仍然支持将函数标记为yield_fixture,但已弃用,不应在新代码中使用。


0
投票

addfinalizer与收益率有两个关键差异:

  1. 可以注册多个终结器功能。
  2. 无论夹具设置代码是否引发异常,都将始终调用终结器。即使其中一个资源无法创建/获取,也可以正确关闭夹具创建的所有资源

来自the pytest docs

© www.soinside.com 2019 - 2024. All rights reserved.