web-dev-qa-db-ja.com

pytestフィクスチャ外部スコープからの名前の再定義[pylint]

私はpytestを学んでいて、コードをpylintでリントします。しかし、pylintはまだ以下について不満を述べています。
W0621: Redefining name %r from outer scope (line %s)

pytestの次の例の場合:

# test_wallet.py

@pytest.fixture
def my_wallet():
    '''Returns a Wallet instance with a zero balance'''
    return Wallet()

@pytest.mark.parametrize("earned,spent,expected", [
    (30, 10, 20),
    (20, 2, 18),
])
def test_transactions(my_wallet, earned, spent, expected):
    my_wallet.add_cash(earned)
    my_wallet.spend_cash(spent)
    assert my_wallet.balance == expected

名前my_walletを外部スコープから再定義しています。

フィクスチャ名に_プレフィックスを追加する回避策が見つかりました:_my_wallet

フィクスチャを関数と同じファイルに保持する場合のベストプラクティスは何ですか?

  1. すべての器具の前に_
  2. このpylintチェックを無効にしますか?
  3. より良い提案?
24
oglop

テストファイルでそのルールを無効にしました。

# pylint: disable=redefined-outer-name
# ^^^ this
import pytest

@pytest.fixture
def my_wallet():
    '''Returns a Wallet instance with a zero balance'''
    return Wallet()

@pytest.mark.parametrize("earned,spent,expected", [
    (30, 10, 20),
    (20, 2, 18),
])
def test_transactions(my_wallet, earned, spent, expected):
    my_wallet.add_cash(earned)
    my_wallet.spend_cash(spent)
    assert my_wallet.balance == expected
16
Garrett Bates

_@pytest.fixture_の pytest docs は次のように言います:

フィクスチャが定義されているのと同じモジュールでフィクスチャが使用されている場合、フィクスチャの関数名は、フィクスチャを要求する関数argによって隠されます。これを解決する1つの方法は、装飾された関数に_fixture_<fixturename>_という名前を付けてから、@pytest.fixture(name='<fixturename>')を使用することです。

したがって、このソリューションは、pytestの作成者がフィクスチャ関数のややわかりやすい名前を提案することを除いて、オプション1と同様です。

ドキュメントの説明は、フィクスチャを_conftest.py_に移動して、フィクスチャを使用するテストコードと同じモジュール内にないようにする別のソリューションを示唆しています。この場所は、テストモジュール間でフィクスチャを共有する場合にも役立ちます。

17
hallidave

通常は無効になっています( 12 )。

いくつかの問題を修正しようとした pylint-pytest プラグインがあります。しかし、エラーW0621はまだ修正されておらず、プラグインは破棄されているようです(最後の更新は2013年でした)。

4
phd