具有功能范围和没有拆卸代码的夹具的好处是什么?

时间:2017-02-17 22:55:29

标签: python pytest

没有拆卸代码的(默认)功能范围夹具的优点是什么?为什么不在测试开始时调用函数?

例如,写作的好处是什么:

@pytest.fixture
def smtp():
    return smtplib.SMTP("smtp.gmail.com")

def test_ehlo(smtp):
    response, msg = smtp.ehlo()
    # ...

而不仅仅是:

def create_smtp():
    return smtplib.SMTP("smtp.gmail.com")

def test_ehlo():
    smtp = create_smtp()
    response, msg = smtp.ehlo()
    # ...

我理解为什么在我们需要拆卸代码时灯具很有用。我也理解为什么具有除功能之外的范围的灯具是有用的:我们可能想要重复使用相同的"外部"多个测试中的对象(以节省创建它所需的时间;或者甚至可能保持其状态 - 尽管这似乎相当危险,因为这会在单独的测试之间产生难以看见的耦合)。

3 个答案:

答案 0 :(得分:3)

当我开始使用它时,我遇到了类似的问题。以下是我的经历:

  • 灯具可以设置为autouse = True,即自动触发内联调用可能无法触发。这在某些情况下很有用。
  • 灯具增加了可读性,至少对我而言。查看测试的签名,可以确定哪些初始化是给定测试的先决条件。从这个意义上说,它还有助于保持测试及其初始化。

答案 1 :(得分:2)

  

没有的(默认)功能范围夹具的优点是什么   拆机代码?为什么不在开头调用函数   测试

节省垂直空间。

考虑这样的事情,每次测试你有多个夹具:

import pytest


@pytest.fixture
def value1():
  return 1

@pytest.fixture
def value2():
  return 2

@pytest.fixture
def value3():
  return 3


def test_values(value1, value2, value3):
    assert value1 == 1
    assert value2 == 2
    assert value3 == 3

如果我们按照你的方式做到这一点:

def test_values():
    v1 = value1()
    v2 = value2()
    v3 = value3()

    assert v1 == 1
    assert v2 == 2
    assert v3 == 3

这是三行额外的代码。没什么大不了的,但如果你有10个需要value1value2value3的测试呢?现在你有30个额外的垂直空间线,基本上没有理由。

显然,我们的两个示例都过于简化了(我可以完成调用和assert内联),但我认为直接看看它如何对实际代码产生影响。

答案 2 :(得分:1)

我认为功能范围固定装置最重要的优点之一是一致性。如果你的所有灯具(无论它们的范围或拆卸代码)都以完全相同的方式使用,它就更具可读性和逻辑性。

此外,如果在将来某个时候您决定更改此灯具的范围或添加一些拆卸代码,那么您将不需要更改任何测试用例,只需更改灯具的代码