夹具初始化后的 pytest setup_class()

DuX*_*N0N 5 python pytest python-2.7

我正在试验 pytest 并且被一些不明显的行为困住了。我有会话范围夹具并像这样使用它:

@pytest.mark.usefixtures("myfixt")
class TestWithMyFixt(object):
    @classmethod
    def setup_class(cls):
        ...
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

Mar*_*oft 6

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

  1. 您可以使用不同的scope. 可能的范围是sessionmoduleclassfunction
  2. Fixture 可以定义为类中的方法。
  3. 夹具可以有autouse=True标志。

如果我们将这些结合起来,我们将得到这个setup_class根本不使用的好方法(在 中py.testsetup_class被认为是过时的方法):

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

通过这样的实现,_prepare将在班级内的第一次测试之前启动一次,并在班级内的最后一次测试后完成。_prepare在启动固定装置时,已经myfixt作为 的依赖项应用_prepare


Ned*_*son 0

查看 usefixtures 背后的代码,可以看出这些装置是由 FixtureManager [1] 处理的,它在每个实例级别上工作。通过使用 usefixtures 标记一个类,它似乎向测试框架表示范围内包含的每个可调用对象都应该使用这些固定装置,但它不会在该点应用这些固定装置。相反,它等待可调用对象被调用,此时它会检查所有管理器是否应该执行任何更新(包括 FixtureManager)并适当地应用这些片段。我相信这意味着对于您班级中的每个测试,它将重新应用固定装置,以便每个测试从一个公共基点开始,这将是比相反更好的行为。

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

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