фикстуры 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.

Что было бы лучше всего, если бы я хотел сохранить фикстуры в том же файле, что и функции?

  1. Добавить перед всеми приборами _?
  2. Отключить эту pylint проверку для тестов?
  3. Лучшее предложение?

person oglop    schedule 07.09.2017    source источник


Ответы (4)


Я просто отключил это правило в своих тестовых файлах:

# 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
person Garrett Bates    schedule 04.01.2019

В документации pytest для @pytest.fixture говорится следующее:

Если прибор используется в том же модуле, в котором он определен, имя функции прибора будет затенено функцией arg, которая запрашивает прибор; один из способов решить эту проблему - назвать декорированную функцию fixture_<fixturename>, а затем использовать @pytest.fixture(name='<fixturename>').

Таким образом, это решение похоже на ваш вариант 1, за исключением того, что автор pytest предлагает немного более информативное имя для функции фикстуры. Так что замените эти две строки

@pytest.fixture
def my_wallet():

с участием:

@pytest.fixture(name="my_wallet")
def fixture_my_wallet():

Описание в документации также намекает на другое решение - переместить фикстуры в conftest.py, чтобы они не находились в том же модуле, что и тестовый код, использующий фикстуры. Это расположение также полезно для обмена приборами между тестовыми модулями.

person hallidave    schedule 13.07.2019
comment
Это должен быть правильный ответ. - person adem.sh; 16.09.2020
comment
Вот обновленная ссылка на соответствующий pytest документы - person benwshul; 15.04.2021

Обычно он отключен (1, 2).

Существует плагин pylint-pytest, который пытался исправить некоторые проблемы, но ошибка W0621 не исправлено еще.

person phd    schedule 08.09.2017
comment
Разве этот плагин не выдает ошибку во время pytest для предупреждений pylint вместо подавления предупреждений pylint в тестовом коде? - person sqd; 24.08.2018
comment
да, подключаемый модуль @insysion связан с запуском pylint как часть pytest и не имеет ничего общего с исправлением сообщений об ошибках pylint при обычном использовании приспособлений pytest. - person RasmusWL; 05.11.2018

Добавьте параметр имени для прибора и префикс fixture_ в def.

@pytest.fixture(name="my_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
person CSRedRat    schedule 14.10.2020