2017-08-22 37 views
2

我正在使用主要使用unittest编写的代码库。测试用pytest运行。我试图通过参数化一些简化测试。为了实现这个目标,我试图学习如何使用pytest fixture并重构一些现有的基于单元测试的测试。目前的测试必须以conftest.py全球夹具:Chain multiple fixture pytest/unittest hybrid

@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()语句从不执行。作为一个中间步骤,我保持基于单元测试的结构并添加它。是否有可能以我想要的方式得到这个工作,或者我需要完全取消单元测试并直接进入pytest。

+0

哪里会想到使用这种灯具?你还想在这里打开'autouse = True'吗?一般来说,只有在它们是测试参数时才执行fixtures,而不是范围假设的通用清理机制 – Cireo

+0

@Cireo您是否应该将'autouse = True'添加到'foo_fixture()'类似于'register_cleanup ()'? –

+0

@Cireo随意发布这个答案。 –

回答

1

你会想将其标记为:

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

注意:你可能有一个以上的conftest.py。把更具体的夹具放入这个测试子目录的conftest.py

+0

谢谢。我在浏览文档时一定错过了必要的细节。 –

+0

不幸的是,所有的测试都在一个目录中。当我重构时,我会考虑更好地组织它们。 –

0

你认为这个夹具可以用在哪里?

你想在这里打开autouse=True吗?一般来说,灯具只有在它们是测试参数时才会执行,并且比范围假设更少的是通用清理机制。通过开启autouse这个灯具,你会基本上是添加一个额外的设置,清除步骤当前模块:

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

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

autouse灯具服从范围=关键字参数:如果自动化工具 夹具的范围='会话',它将只运行一次,不管它在哪里定义了 。范围='class'表示每个班级将运行一次,等等。 如果在测试模块中定义了一个自动夹具,则所有测试 函数都会自动使用它。如果在 conftest.py文件中定义了一个自动夹具,那么所有在其目录 下的测试模块中的所有测试都将调用夹具。最后,请使用 注意事项:如果您在插件中定义了一个自动夹具,则将为插件安装的所有项目中的所有测试调用 。如果只有固定装置在某些 设置的存在下工作,这可以是 e。 G。在ini文件中。这样一个全球性的夹具应该总是快速确定它是否应该做任何工作,并避免其他昂贵的进口或计算。

[进入一个答案Adaptied评论]