使用夹具vs传递方法作为参数

时间:2019-08-30 08:52:15

标签: python pytest


我只是在学习Python和Pytest,并遇到了Fixtures。请原谅基本问题,但我有点想知道在Python中使用固定装置有什么优势,因为您已经可以将方法作为参数传递,例如:

def method1():
    return 'hello world'

def method2(methodToRun):
    result = methodToRun()
    return result

method2(method1)

@pytest.fixture对象作为参数传递的好处是什么?

2 个答案:

答案 0 :(得分:4)

一个区别是固定装置传递调用函数的结果,而不传递函数本身。尽管您为什么要使用pytest.fixture而不是仅仅手动调用它,但这并不能回答您的问题,因此我只列出了几件事。

一个原因是全局可用性。在conftest.py中编写固定装置后,只需引用其名称并避免重复即可将其用于整个测试套件中。

万一夹具返回一个可变对象,pytest还会为您处理新的调用,因此您可以确保使用同一夹具的其他测试不会改变彼此之间的行为。如果pytest在默认情况下未执行此操作,则您必须手动执行操作。

一个很大的问题是pytest的插件系统使用固定装置来使其功能可用。因此,如果您是网络开发人员,并且希望拥有用于测试的模拟服务器,则只需安装pytest-localserver,然后将httpserverhttpsserversmtpserver参数添加到您的测试功能将从您刚安装的库中注入灯具。这是令人难以置信的方便和直观,特别是与其他语言的注入机制相比。

最重要的是,有一种方法可以在测试服中包括依赖项,这很有用,pytest选择了一种将魔术自身绑定到功能签名的夹具机制。因此,尽管它实际上与手动插入参数没有什么不同,但是pytest通过它增加的生活质量使它值得。

答案 1 :(得分:2)

固定是一种集中测试变量,避免冗余的方法。如果您对“依赖注入”的概念感到满意,那么这基本上是相同的优点,即python会自动将参数与可用的固定装置绑定在一起,因此您只需询问所需内容即可更快地构建测试。

此外,夹具还使您能够轻松地一次参数化所有测试。如果您想手动执行,则可以避免一些麻烦的代码。 (有关详细信息,请参见文档:https://docs.pytest.org/en/latest/fixture.html#parametrizing-fixtures

一些参考文献: