我只是在学习Python和Pytest,并遇到了Fixtures。请原谅基本问题,但我有点想知道在Python中使用固定装置有什么优势,因为您已经可以将方法作为参数传递,例如:
def method1():
return 'hello world'
def method2(methodToRun):
result = methodToRun()
return result
method2(method1)
将@pytest.fixture
对象作为参数传递的好处是什么?
答案 0 :(得分:4)
一个区别是固定装置传递调用函数的结果,而不传递函数本身。尽管您为什么要使用pytest.fixture
而不是仅仅手动调用它,但这并不能回答您的问题,因此我只列出了几件事。
一个原因是全局可用性。在conftest.py
中编写固定装置后,只需引用其名称并避免重复即可将其用于整个测试套件中。
万一夹具返回一个可变对象,pytest
还会为您处理新的调用,因此您可以确保使用同一夹具的其他测试不会改变彼此之间的行为。如果pytest
在默认情况下未执行此操作,则您必须手动执行操作。
一个很大的问题是pytest
的插件系统使用固定装置来使其功能可用。因此,如果您是网络开发人员,并且希望拥有用于测试的模拟服务器,则只需安装pytest-localserver
,然后将httpserver
,httpsserver
和smtpserver
参数添加到您的测试功能将从您刚安装的库中注入灯具。这是令人难以置信的方便和直观,特别是与其他语言的注入机制相比。
最重要的是,有一种方法可以在测试服中包括依赖项,这很有用,pytest
选择了一种将魔术自身绑定到功能签名的夹具机制。因此,尽管它实际上与手动插入参数没有什么不同,但是pytest
通过它增加的生活质量使它值得。
答案 1 :(得分:2)
固定是一种集中测试变量,避免冗余的方法。如果您对“依赖注入”的概念感到满意,那么这基本上是相同的优点,即python会自动将参数与可用的固定装置绑定在一起,因此您只需询问所需内容即可更快地构建测试。
此外,夹具还使您能够轻松地一次参数化所有测试。如果您想手动执行,则可以避免一些麻烦的代码。 (有关详细信息,请参见文档:https://docs.pytest.org/en/latest/fixture.html#parametrizing-fixtures)
一些参考文献: