首页 文章

链多个夹具pytest / unittest hybrid

提问于
浏览
2

我正在使用代码库,该代码库主要使用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

    你要标记它:

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

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

  • 1

    您希望在哪里使用这种灯具?

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

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

    以下是autouse灯具在其他示波器中的工作原理:autouse灯具服从scope = keyword-argument:如果autouse灯具有scope ='session',它将只运行一次,无论它在何处定义 . scope ='class'表示每个类都会运行一次,等等 . 如果在测试模块中定义了autouse fixture,它的所有测试函数都会自动使用它 . 如果在conftest.py文件中定义了autouse fixture,那么其目录下所有测试模块中的所有测试都将调用fixture . 最后,请谨慎使用:如果您在插件中定义了autouse fixture,则会在安装插件的所有项目中为所有测试调用它 . 如果固定装置仅在某些设置存在的情况下工作,则此功能非常有用e . G . 在ini文件中 . 这样的全局夹具应该总是快速确定它是否应该做任何工作并避免昂贵的进口或计算 .

    [改编评论回答]

相关问题