pytest:使用“会话”作用域夹具和默认作用域夹具

时间:2019-09-14 23:09:02

标签: python scope pytest fixtures

我正在构建pytest测试套件,测试正在构建的软件包。测试应验证有关pkg的某些信息,例如较小的功能检查,较小的健全性检查等。某些检查在安装前和安装后进行(示例代码):


测试文件:

import pytest

class PreInstallTests(object):
    def test_foo(self, bar):
        assert bar > 2

class PostInstallTests(object):
    def test_goo(self, baz):
        assert baz < 3

    def test_hoo(self, baz):
        assert baz > 1

比赛文件:

import pytest
@pytest.fixture
def tmp_dir():
    os.mkdir('tmp')
    yield
    shutil.rmtree('tmp')

@pytest.fixture
def bar(tmp_dir):
    yield 3

@pytest.fixture
def baz(install, tmp_dir):
    yield 2

@pytest.fixture(scope='session')
def install():
    # installs the pkg... (takes a lot of time)

从这里可以看到,我有2个安装后测试,每个测试都使用称为baz的夹具,该夹具使用install夹具。我只想要一个安装,并且所有安装后测试都使用相同的安装(虽然不理想,但是测试很少,而且我不想在当前的重新安装上浪费很多时间)。

使用“ scope”会话参数可以解决我的问题,但是这将禁止我使用其他任何固定装置,例如“ tmp_dir”(它代表我需要的固定装置,并且必须保持默认范围...)

我如何才能完成所有测试的一个安装,而仍然使用我想保留其默认范围的其他固定装置?

我曾想过将install设为自动使用的灯具,但实际上我需要在其他当前默认作用域的灯具之后调用它,并且应该保持这种状态 < / p>

2 个答案:

答案 0 :(得分:0)

我唯一想到的解决方案是使用一个标志来控制是否已经运行了安装代码,然后将灯具保持在默认范围内。


import pytest

installed = False

@pytest.fixture()
def install():
    global installed
    if not installed:
        print('installing')
        installed = True

答案 1 :(得分:0)

ScopeMismatch on using session scoped fixture with pytest-mozwebqa plugin for py.test

中所述

使用会话范围的 tmpdir_factory 安装和删除 tmp_dir,使用内置的 tmpdir,因为 pytest 3.x。