夹具初始化后的pytest setup_class()

时间:2015-07-17 20:44:07

标签: python python-2.7 pytest

我正在尝试使用pytest,并且遇到了一些不明显的行为。我有会话范围夹具并像这样使用它:

@pytest.mark.usefixtures("myfixt")
class TestWithMyFixt(object):
    @classmethod
    def setup_class(cls):
        ...

当我运行测试时,我看到setup_class()在fixture myfixt()调用之前出现。这种行为背后的目的是什么?对我来说,它应该在夹具初始化后运行,因为它使用夹具。如何在会话夹具初始化后使用setup_class()

提前致谢!

3 个答案:

答案 0 :(得分:1)

我在寻找类似问题时发现了这个问题,这就是我想出来的。

  1. 您可以使用不同的scope创建灯具。可能的范围是sessionmoduleclassfunction
  2. 可以将Fixture定义为类中的方法。
  3. 灯具可以有autouse=True旗帜。
  4. 如果我们将这些结合起来,我们会得到这个不使用setup_class的好方法(在py.test中,setup_class被认为是过时的方法):

    class TestWithMyFixt(object):
        @pytest.fixture(autouse=True, scope='class')
        def _prepare(self, myfixt):
            ...
    

    通过这样的实现,_prepare将在类中的第一次测试之前启动一次,并且将在类中的最后一次测试之后完成。 在_prepare灯具启动时,myfixt已作为_prepare的依赖项应用。

答案 1 :(得分:0)

查看usefixtures背后的代码,看起来夹具由FixtureManager [1]处理,它适用于每个实例级别。通过使用usefixtures标记类,它似乎表示测试框架中示波器中包含的每个可调用项应该使用那些灯具,但是它不适用于那时的灯具。相反,它等待调用callable,此时它会检查所有管理器是否应该执行任何更新(包括FixtureManager)并适当地应用这些部分。我相信这意味着对于你班级中的每个测试,它将重新应用夹具,以便每个测试从一个共同的基点开始,这将是比相反的更好的行为。

因此,调用setup_class是因为这是最早的操作顺序。听起来你应该将你的setup_class逻辑放入你的灯具中,这将导致在灯具实现时调用它。

[1] - https://github.com/pytest-dev/pytest/blob/master/_pytest/python.py#L1628

答案 2 :(得分:0)

我知道这是一个旧帖子,但答案很简单,也许对其他人有用。

您必须在当前的 super(...).setUpClass 中调用 setUpClass 方法。

setUpClass 在测试方法之前调用一次并执行所有操作。当您调用 super(...).setUpClass 时,它会应用固定装置。

注意 1:我对代码做了一些小改动以变得更漂亮。

注意2:这个方法应该叫setUpClass,它是必须的。

class TestWithMyFixt(APITestCase):
    fixture = ["myfixt"]
    
    @classmethod
    def setUpClass(cls):
        super(TestWithMyFixt, cls).setUpClass()
        ...

这是我的看法,但也许这种行为的目的是让开发人员选择何时加载夹具。