6

クラス skipif デコレータで pytest フィクスチャ (scope=module) を使用しようとしていますが、フィクスチャが定義されていないというエラーが表示されます。これは可能ですか?

conftest.py には、CurrentTarget オブジェクトを返す「ターゲット」と呼ばれるモジュール スコープを持つフィクスチャがあります。CurrentTarget オブジェクトには関数 isCommandSupported があります。test_mytest.py には、多数のテスト関数を含むクラス Test_MyTestClass があります。フィクスチャ target.isCommandSupported の場合に基づいて Test_MyTestClass のすべてのテストをスキップしたいので、次のように Skipif で Test_MyTestClass を装飾します。

@pytest.mark.skipif(not target.isCommandSupprted('commandA), reason=command not supported')
class Test_MyTestClass:
...

次のエラーが表示されます: NameError: name 'target' が定義されていません

私が試してみると:

@pytest.mark.skipif(not pytest.config.getvalue('tgt').isCommandSupprted('commandA), reason=command not supported')
class Test_MyTestClass:
...

次のエラーが表示されます: AttributeError: 'function' object has no attribute 'isCommandSupprted'

4

2 に答える 2

7

最初のケースでエラーが発生する理由は、pytest がフィクスチャを挿入するため、関数パラメーターを介してテスト関数で使用できるようになるためです。より高いスコープにインポートされることはありません。

AttributeError が発生する理由は、フィクスチャが関数であり、最初 (またはそれぞれ) の使用時に評価されるためです。だから、それをやり遂げたとき、pytest.configそれはまだ機能です。これは、他の回答が失敗するのと同じ理由です。インポートすると、結果ではなく、フィクスチャ関数がインポートされます。

やりたいことを直接行う方法はありませんが、追加のフィクスチャで回避できます。

@pytest.fixture(scope='module')
def check_unsupported(target):
  if not target.isCommandSupported('commandA'):
    pytest.skip('command not supported')

@pytest.mark.usefixtures('check_unsupported')
def test_one():
  pass

def test_two(check_unsupported):
  pass
于 2018-04-18T00:43:03.407 に答える
1

target次のように conftest からインポートできます。

from conftest import target

pytest.mark.skipif次に、例で意図したとおりに使用できます。

@pytest.mark.skipif(not target.isCommandSupported('commandA'), reason='command not supported')
def Test_MyTestClass:

pytest.mark.skipif複数のテストで同じロジックを繰り返す必要があり、コピーと貼り付けを避けたい場合は、単純なデコレーターが役立ちます。

check_unsupported = pytest.mark.skipif(not target.isCommandSupported('commandA'),
                                       reason='command not supported')

@check_unsupported
def test_one():
    pass

@check_unsupported
def test_two():
    pass
于 2016-09-01T18:42:36.387 に答える