1

自動使用フィクスチャが 1 つあるテスト モジュールがあります。

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 に答える