pytest中fixture和yield_fixture之间的区别

时间:2017-08-17 11:36:15

标签: python python-2.7 pytest fixtures

我正在通过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")

2 个答案:

答案 0 :(得分:11)

唯一的区别在于可读性。我认为(虽然我并非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,但已弃用   不应在新代码中使用。

答案 1 :(得分:0)

addfinalizer在产量上有两个主要区别:

  1. 可以注册多个终结器功能。
  2. 无论灯具设置如何,总会调用终结器         代码引发异常。方便地正确关闭所有         灯具创建的资源,即使其中之一失败了         创建/获取

来自the pytest docs