1

我有一个测试模块有一个 autouse 夹具

import pytest

@pytest.fixture(autouse=True):
def set_env_config(monkeypatch):
    palladium_config =   os.path.join(os.path.dirname(os.path.dirname(os.getcwd())), 'config.py')
    monkeypatch.setenv('PALLADIUM_CONFIG', palladium_config)
    from A import B

并且在此测试模块中的每个后续测试中都需要 B 类,但是对于任何测试都无法实现此导入。

另一方面,我只修补环境变量

@pytest.fixture(autouse=True):
def set_env_config(monkeypatch):
    palladium_config =   os.path.join(os.path.dirname(os.path.dirname(os.getcwd())), 'config.py')
    monkeypatch.setenv('PALLADIUM_CONFIG', palladium_config)

并在每个测试用例中导入 B 类,它成功了。

这是为什么 ?为什么我不能在 autouse 夹具中导入类

多谢

4

1 回答 1

0

我猜你期待以下内容:

@pytest.fixture(autouse=True)
def do_an_import():
    from A import B

def test_foo():
    assert B.do_my_thing() == 'foo'

这不起作用,同时执行以下操作可以满足您的要求:

def test_foo():
    from A import B
    assert B.do_my_thing() == 'foo'

不幸的是,在夹具(第一个示例)中进行导入会将 B 添加到该夹具函数的命名空间中,而不是测试函数的命名空间中。

同样,出于同样的原因,这也行不通:

@pytest.fixture
def not_an_autouse_fixture():
    from A import B

def test_foo(not_an_autouse_fixture):
    assert B.do_my_thing() == 'foo'

B正在被导入到与测试的命名空间不同的夹具的命名空间中。你可以改为:

@pytest.fixture
def Cls():
    from A import B
    return B

def test_foo(Cls):
    assert Cls.do_my_thing() == 'foo'

或者您可以在模块的顶层导入它,例如:

from A import B

def test_foo(B):
    assert B.do_my_thing() == 'foo'
于 2015-09-16T19:17:22.217 回答