【问题标题】:Chain multiple fixtures pytest/unittest hybrid链多个夹具 pytest/unittest 混合
【发布时间】:2018-01-31 03:18:40
【问题描述】:

我正在使用一个主要使用 unittest 编写的代码库。测试使用 pytest 运行。我试图通过参数化其中一些来简化测试。为了实现这个目标,我正在尝试学习如何使用 pytest 固定装置并重构一些现有的基于单元测试的测试。当前的测试在 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')

但是,此模块夹具中的 print() 语句永远不会执行。作为中间步骤,我将保留基于单元测试的结构并添加到它。是否可以按照我想要的方式进行这项工作,或者我是否需要完全放弃 unittest 并直接转到 pytest。

【问题讨论】:

  • 您希望在哪里使用这个夹具?你也想在这里打开autouse=True 吗?一般来说,fixture 仅在它们是测试的参数时才会执行,并且与作用域假设相比,它们不是通用的清理机制
  • @Cireo 你的意思是我应该像register_cleanup()一样将autouse=True添加到foo_fixture()吗?
  • @Cireo 随意发布这个作为答案。

标签: python pytest python-unittest fixtures


【解决方案1】:

你会想要标记它:

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

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

【讨论】:

  • 谢谢。我在浏览文档时一定错过了必要的细节。
  • 不幸的是,所有的测试都在一个目录中。在我重构时,我会考虑更好地组织它们。
【解决方案2】:

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

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

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

这是 autouse 固定装置在其他范围内的工作方式:

autouse 装置遵循 scope= 关键字参数:如果一个 autouse 夹具有 scope='session' 它只会运行一次,无论在哪里 它被定义。 scope='class' 意味着它将在每个类中运行一次,等等。 如果在测试模块中定义了 autouse 夹具,则它的所有测试 功能自动使用它。如果一个 autouse 夹具定义在一个 conftest.py 文件,然后在其下面的所有测试模块中的所有测试 目录将调用夹具。最后,请使用它 care:如果你在插件中定义了一个 autouse 固定装置,它将被调用 对于安装插件的所有项目中的所有测试。这个可以 如果夹具仅在某些情况下才起作用,则很有用 e. 设置G。在ini文件中。这样的全局夹具应始终 快速确定它是否应该做任何工作,否则避免 昂贵的导入或计算。

[将评论改编成答案]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2021-08-11
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    相关资源
    最近更新 更多