Светильники pytest Переопределение имени из внешней области видимости [pylint]
Я изучаю Pytest, и я накладываю свой код с помощью 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
,
Что было бы лучше, если бы я хотел сохранить приборы в одном файле с функциями?
- Подготовить все приборы с
_
? - Отключить это
pylint
проверить на тесты? - Лучшее предложение?
1 ответ
Документы pytest для@pytest.fixture
скажи это:
Если прибор используется в том же модуле, в котором он определен, имя функции прибора будет затенено функцией arg, которая запрашивает прибор; один из способов решить эту проблему - назвать декорированную функцию
fixture_<fixturename>
а затем используйте@pytest.fixture(name='<fixturename>')
.
Таким образом, это решение похоже на ваш вариант 1, за исключением того, что автор pytest предлагает немного более описательное имя для функции фикстуры.
Описание в документации также намекает на другое решение, которое заключается в перемещении светильников в conftest.py
поэтому они не находятся в том же модуле, что и тестовый код, использующий фикстуры. Это расположение также полезно для совместного использования приборов между тестовыми модулями.
Я просто отключил это правило в моих тестовых файлах:
# 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
Добавьте параметр имени для прибора и префикс fixture_ в def.
@pytest.fixture(name="wallet")
def fixture_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
Существует плагин pylint-pytest, который пытается исправить некоторые проблемы. Но ошибка W0621
еще не исправлена, и плагин, похоже, заброшен (последнее обновление было в 2013 году).