Python pytest:使用一个;会议“;范围固定装置以及默认范围固定装置

Python pytest:使用一个;会议“;范围固定装置以及默认范围固定装置,python,scope,pytest,fixtures,Python,Scope,Pytest,Fixtures,我正在构建一个pytest测试套件,测试我正在构建的包。测试应该验证关于pkg的一些事情,例如次要功能检查、次要健全性检查等等。有些检查是在安装前完成的,有些是在安装后完成的(示例代码): 测试文件: import pytest class PreInstallTests(object): def test_foo(self, bar): assert bar > 2 class PostInstallTests(object): def test_g

我正在构建一个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
从这里可以看到,我有两个安装后测试,每个测试都使用一个名为
baz
的夹具,该夹具使用
install
夹具。我只希望有一个安装,或者对所有安装后测试使用相同的安装(不理想,但测试是最小的,我不想在当前重新安装上浪费太多时间)

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

我怎样才能实现一次安装所有测试,并且仍然使用我的其他装置,我想让它们保留默认范围


我想让
安装成为一个自动使用的装置,但实际上我需要在当前默认范围内的其他装置之后调用它,并且应该保持这种方式

我能想到的唯一解决方案是使用一个标志来控制您是否已经运行了安装代码,然后使用默认范围保留设备


导入pytest
已安装=错误
@pytest.fixture()
def install():
全球安装
如果未安装:
打印('安装')
已安装=真

使用“scope”会话参数可以解决我的问题,但这将禁止我使用任何其他设备,例如“tmp_dir”-您的意思是,禁止在
安装中使用
tmp_dir
?除此之外(并且在
install
fixture中放置了错误的scope参数),我看不出您的代码有任何问题。您可以始终引入另一个fixture,例如会话范围的
real\u install
,并将
install
更改为smth,如
def install(tmp\u dir,real\u install):返回带有默认功能范围的real_install
。这样,安装仍将运行一次,您可以将其结果与功能范围内的装置结合起来。@hoefling供您第一次评论-是的,但实际上我有很多类似的装置。。对于你的第二个-考虑过了,但这会使我将我的很多装置更改为函数调用(例如,我有一个装置显示了pkg的路径-因此这必须是对函数的调用)@CIsForCookies,你的意思是说你想使用
tmp_dir
install
fixture中的许多功能范围装置吗?或者您只是希望在
安装
fixture之前调用它们。fixture不应该真正保存状态机。我也想到了这个,但我不打算用它,尽管它解决了我的基本问题,因为我不想去全球
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)