链多个夹具pytest / unittest hybrid

时间:2017-08-22 18:13:26

标签: python pytest python-unittest fixtures

我正在使用代码库,该代码库主要使用unittest编写。测试使用pytest运行。我试图通过参数化其中一些来简化测试。为了实现这一目标,我试图学习如何使用pytest fixture并重构一些现有的基于unittest的测试。目前的测试在conftest.py中有一个全局夹具:

@pytest.fixture(autouse=True)
def register_cleanup():
    yield True
    print("cleaning up database")

现在我想添加一个特定于我的测试模块的灯具,类似于

@pytest.fixture()
def foo_fixture():
    print("setup fixture")
    yield
    print("tear down fixture")


class Foo(unittest.TestCase):
    def setUp(self):
        print('unittest setUp()')

    def test(self):
        print('test')

但是,此模块fixture中的print()语句永远不会执行。作为一个中间步骤,我保持基于unittest的结构并添加它。是否有可能按照我想要的方式工作,或者我需要完全废弃unittest并直接进入pytest。

2 个答案:

答案 0 :(得分:1)

您想要标记它:

@pytest.mark.usefixtures("foo_fixture")
class Foo(unittest.TestCase):
    ...

注意:您可能有多个conftest.py。将更具体的夹具放入此测试子目录conftest.py

答案 1 :(得分:0)

您希望使用此灯具在哪里?

你想在这里打开autouse=True吗?通常,只有当它们是测试的参数时才执行fixture,并且它们比作用域假设更少的通用清理机制。通过为此灯具打开autouse,您将基本上为当前模块添加额外的设置清理步骤:

https://docs.pytest.org/en/latest/fixture.html#autouse-fixtures-xunit-setup-on-steroids

  

以下是autouse灯具在其他范围内的工作原理:

     

autouse fixtures遵守scope = keyword-argument:如果是autouse   fixture具有scope ='session'它只会运行一次,无论在哪里   它是定义的。 scope ='class'表示每个类都会运行一次,等等。   如果在测试模块中定义了autouse fixture,那么它的所有测试   功能自动使用它。如果在a中定义了autouse fixture   conftest.py文件然后在其下面的所有测试模块中的所有测试   目录将调用夹具。最后,请用它   care:如果你在插件中定义一个autouse fixture,它将被调用   对于安装插件的所有项目中的所有测试。这个可以   如果一个固定装置无论如何都能在某些情况下工作   设置e。 G。在ini文件中。这种全球性的固定装置应该永远   快速确定是否应该做任何工作,否则   昂贵的进口或计算。

[对答案进行了改编]