Амортизация и удаление

На этой странице перечислены все функции pytest, которые в настоящее время устарели или были удалены в прошлых основных выпусках. Цель состоит в том, чтобы дать пользователям четкое обоснование, почему та или иная функция была удалена, и какие альтернативы следует использовать вместо нее.

Утраченные функции

Ниже приведен полный список всех функций pytest, которые считаются устаревшими. Использование этих функций приведет к появлению PytestWarning или подклассов, которые можно отфильтровать с помощью standard warning filters.

Поддержка тестов, написанных для носа

Не рекомендуется, начиная с версии 7.2.

Поддержка запуска тестов, написанных для nose, теперь устарела.

nose уже несколько лет находится только в режиме обслуживания, и поддержка плагина не является тривиальной, так как она распространяется на всю кодовую базу (см. issue #9886 для более подробной информации).

установка/снятие

Одна вещь, которая может застать пользователей врасплох, заключается в том, что простые методы setup и teardown не являются родными для pytest, они фактически являются частью поддержки nose.

class Test:
    def setup(self):
        self.resource = make_resource()

    def teardown(self):
        self.resource.close()

    def test_foo(self):
        ...

    def test_bar(self):
        ...

Встроенная поддержка pytest использует setup_method и teardown_method (см. Настройка/исправление на уровне методов и функций), поэтому вышеприведенное должно быть изменено на:

class Test:
    def setup_method(self):
        self.resource = make_resource()

    def teardown_method(self):
        self.resource.close()

    def test_foo(self):
        ...

    def test_bar(self):
        ...

Это легко сделать во всей кодовой базе, выполнив простое нахождение/замену.

@with_setup

Код с использованием @with_setup, например, такой:

from nose.tools import with_setup


def setup_some_resource():
    ...


def teardown_some_resource():
    ...


@with_setup(setup_some_resource, teardown_some_resource)
def test_foo():
    ...

Также необходимо перенести на поддерживаемый стиль pytest. Один из способов сделать это - использовать фикстуру:

import pytest


def setup_some_resource():
    ...


def teardown_some_resource():
    ...


@pytest.fixture
def some_resource():
    setup_some_resource()
    yield
    teardown_some_resource()


def test_foo(some_resource):
    ...

Коллектор pytest.Instance

Removed in version 7.0.

Тип коллектора pytest.Instance был удален.

Ранее методы тестирования Python собирались как Class -> Instance -> Function. Теперь Class собирает тестовые методы напрямую.

Большинство подключаемых модулей, которые ссылаются на Instance, делают это для того, чтобы игнорировать или пропустить его, используя проверку, такую как if isinstance(node, Instance): return. Такие плагины должны просто удалить рассмотрение Instance на pytest>=7. Однако, чтобы сохранить работоспособность таких приложений, в pytest.Instance и _pytest.python.Instance был введен фиктивный тип, при импорте которого выдается предупреждение об устаревании. Это будет удалено в pytest 8.

Аргумент fspath для конструкторов узлов заменен на pathlib.Path

Не рекомендуется, начиная с версии 7.0.

Чтобы поддержать переход от py.path.local к pathlib, аргумент fspath в конструкторах Node, таких как pytest.Function.from_parent() и pytest.Class.from_parent(), теперь устарел.

Плагины, которые конструируют узлы, должны передавать аргумент path типа pathlib.Path вместо аргумента fspath.

Плагинам, реализующим пользовательские предметы и коллекторы, рекомендуется заменить параметры fspath (py.path.local) на параметры path (pathlib.Path), и по возможности отказаться от любого другого использования библиотеки py.

Если возможно, плагины с пользовательскими элементами должны использовать cooperative constructors, чтобы избежать жесткого кодирования аргументов, которые они передают только суперклассу.

Примечание

Название аргументов и атрибутов Node (новым атрибутом является path) является противоположным ситуации для крючков, outlined below (старым аргументом является path).

Это досадный артефакт, вызванный историческими причинами, который должен быть устранен в будущих версиях, поскольку мы постепенно избавляемся от зависимости py (см. issue #9283 для более подробного обсуждения).

Из-за продолжающейся миграции методов типа reportinfo(), которые по-прежнему должны возвращать объект py.path.local, узлы по-прежнему имеют атрибуты fspath (py.path.local) и path (pathlib.Path), независимо от того, какой аргумент был использован в конструкторе. Мы планируем отказаться от атрибута fspath в одном из будущих выпусков.

Настройка спецификаций крючков/имплантов с помощью маркеров

До появления pluggy, библиотеки плагинов pytest, которая была собственным пакетом и имела четкий API, pytest просто использовал pytest.mark для настройки хуков.

Декораторы pytest.hookimpl() и pytest.hookspec() доступны уже много лет и должны использоваться вместо них.

@pytest.mark.tryfirst
def pytest_runtest_call():
    ...


# or
def pytest_runtest_call():
    ...


pytest_runtest_call.tryfirst = True

следует изменить на:

@pytest.hookimpl(tryfirst=True)
def pytest_runtest_call():
    ...

Изменены атрибуты hookimpl:

  • tryfirst

  • trylast

  • optionalhook

  • hookwrapper

Изменены атрибуты hookwrapper:

  • firstresult

  • historic

py.path.local аргументы для крючков заменены на pathlib.Path

Не рекомендуется, начиная с версии 7.0.

Для поддержки перехода от py.path.local к pathlib следующие хуки теперь получают дополнительные аргументы:

Сопутствующие пути на основе py.path.local были устаревшими: плагины, которые вручную вызывают эти хуки, должны передавать только новые аргументы pathlib.Path, а пользователи должны изменить свои реализации хуков, чтобы использовать новые аргументы pathlib.Path.

Примечание

Название аргументов и атрибутов Node, outlined above (новый атрибут - path) является противоположной ситуацией для крючков (старый аргумент - path).

Это досадный артефакт, вызванный историческими причинами, который должен быть устранен в будущих версиях, поскольку мы постепенно избавляемся от зависимости py (см. issue #9283 для более подробного обсуждения).

Прямое конструирование внутренних классов

Не рекомендуется, начиная с версии 7.0.

Прямое построение следующих классов теперь устарело:

  • _pytest.mark.structures.Mark

  • _pytest.mark.structures.MarkDecorator

  • _pytest.mark.structures.MarkGenerator

  • _pytest.python.Metafunc

  • _pytest.runner.CallInfo

  • _pytest._code.ExceptionInfo

  • _pytest.config.argparsing.Parser

  • _pytest.config.argparsing.OptionGroup

  • _pytest.pytester.HookRecorder

Эти конструкторы всегда считались приватными, но теперь выдают предупреждение об устаревании, которое может стать жесткой ошибкой в pytest 8.

Передача msg= в pytest.skip, pytest.fail или pytest.exit

Не рекомендуется, начиная с версии 7.0.

Передача аргумента ключевого слова msg в функции pytest.skip(), pytest.fail() или pytest.exit() теперь устарела, и вместо него следует использовать reason. Это изменение сделано для обеспечения согласованности между этими функциями и маркерами @pytest.mark.skip и @pytest.mark.xfail, которые уже принимают аргумент reason.

def test_fail_example():
    # old
    pytest.fail(msg="foo")
    # new
    pytest.fail(reason="bar")


def test_skip_example():
    # old
    pytest.skip(msg="foo")
    # new
    pytest.skip(reason="bar")


def test_exit_example():
    # old
    pytest.exit(msg="foo")
    # new
    pytest.exit(reason="bar")

Реализация крючка pytest_cmdline_preparse

Не рекомендуется, начиная с версии 7.0.

Реализация хука pytest_cmdline_preparse была официально устаревшей. Вместо этого используйте хук pytest_load_initial_conftests.

def pytest_cmdline_preparse(config: Config, args: List[str]) -> None:
    ...


# becomes:


def pytest_load_initial_conftests(
    early_config: Config, parser: Parser, args: List[str]
) -> None:
    ...

Алмазное наследование между pytest.Collector и pytest.Item

Не рекомендуется, начиная с версии 7.0.

Определение пользовательского типа узла pytest, который является одновременно pytest.Item и pytest.Collector (например, pytest.File), теперь выдает предупреждение. Это никогда разумно не поддерживалось и вызывало трудноотлаживаемые ошибки.

Некоторые плагины, обеспечивающие линтинг/анализ кода, используют это в качестве хака. Вместо этого следует использовать отдельный узел коллектора, который собирает элемент. Смотрите пример Работа с непитоновскими тестами, а также example pr fixing inheritance.

Конструкторы пользовательских подклассов pytest.Node должны принимать **kwargs

Не рекомендуется, начиная с версии 7.0.

Если пользовательские подклассы узлов типа pytest.Item переопределяют метод __init__, они должны принимать **kwargs. Таким образом,

class CustomItem(pytest.Item):
    def __init__(self, name, parent, additional_arg):
        super().__init__(name, parent)
        self.additional_arg = additional_arg

должны быть превращены:

class CustomItem(pytest.Item):
    def __init__(self, *, additional_arg, **kwargs):
        super().__init__(**kwargs)
        self.additional_arg = additional_arg

чтобы избежать жесткого кодирования аргументов, которые pytest может передать суперклассу. Смотрите Работа с непитоновскими тестами для полного примера.

Для случаев без конфликтов предупреждение об устаревании не выдается. Для случаев с конфликтами (например, pytest.File теперь принимает path вместо fspath, как outlined above), предупреждение об устаревании теперь выдается.

Обратная совместимость в Parser.addoption

Не рекомендуется, начиная с версии 2.4.

Некоторые поведения Parser.addoption теперь планируется удалить в pytest 8 (deprecated начиная с pytest 2.4.0):

  • parser.addoption(..., help=".. %default ..") - используйте вместо этого %(default)s.

  • parser.addoption(..., type="int/string/float/complex") - используйте вместо этого type=int и т.д.

Использование pytest.warns(None)

Не рекомендуется, начиная с версии 7.0.

pytest.warns(None) теперь устарел, поскольку часто использовался неправильно. Правильным его использованием была проверка того, что код выдает хотя бы одно предупреждение любого типа - например, pytest.warns() или pytest.warns(Warning).

Примеры см. в разделе Дополнительные случаи использования предупреждений в тестах.

Возвращение значения не None в тестовых функциях

Не рекомендуется, начиная с версии 7.2.

Если тестовая функция возвращает не None, то теперь выдается pytest.PytestReturnNotNoneWarning.

Это предотвращает распространенную ошибку среди новичков, которые ожидают, что возвращение bool приведет, например, к прохождению или провалу теста:

@pytest.mark.parametrize(
    ["a", "b", "result"],
    [
        [1, 2, 5],
        [2, 3, 8],
        [5, 3, 18],
    ],
)
def test_foo(a, b, result):
    return foo(a, b) == result

Учитывая, что pytest игнорирует возвращаемое значение, может показаться удивительным, что он никогда не потерпит неудачу.

Правильным решением является замена return на assert:

@pytest.mark.parametrize(
    ["a", "b", "result"],
    [
        [1, 2, 5],
        [2, 3, 8],
        [5, 3, 18],
    ],
)
def test_foo(a, b, result):
    assert foo(a, b) == result

Опция командной строки --strict

Не рекомендуется, начиная с версии 6.2.

Опция командной строки --strict была упразднена в пользу --strict-markers, которая лучше передает то, что делает эта опция.

Мы планируем, возможно, в будущем снова ввести --strict и сделать его всеобъемлющим флагом для всех опций, связанных со строгостью (--strict-markers и --strict-config на данный момент, в будущем могут быть введены другие).

Функция/декоратор yield_fixture

Не рекомендуется, начиная с версии 6.2.

pytest.yield_fixture является устаревшим псевдонимом для pytest.fixture().

Так было очень долгое время, поэтому можно смело искать/заменять.

Удаленные функции

Как указано в нашей политике Политика обратной совместимости, устаревшие функции удаляются только в основных релизах после истечения соответствующего периода устаревания.

Модуль pytest.collect

Не рекомендуется, начиная с версии 6.0.

Removed in version 7.0.

Модуль pytest.collect больше не является частью публичного API, все его имена теперь следует импортировать из pytest напрямую.

Крючок pytest_warning_captured

Не рекомендуется, начиная с версии 6.0.

Removed in version 7.0.

Этот хук имеет параметр item, который не может быть сериализован с помощью pytest-xdist.

Вместо этого используйте хук pytest_warning_recorded, который заменяет параметр item параметром nodeid.

Функция pytest._fillfuncargs

Не рекомендуется, начиная с версии 6.0.

Removed in version 7.0.

Эта функция была сохранена для обратной совместимости со старым плагином.

Его функциональность не предназначена для прямого использования, но если вы должны заменить его, используйте function._request._fillfixtures() вместо него, хотя обратите внимание, что это не публичный API и может сломаться в будущем.

--no-print-logs опция командной строки

Не рекомендуется, начиная с версии 5.4.

Removed in version 6.0.

Опция --no-print-logs и настройка ini log_print удалены. Если вы их использовали, пожалуйста, используйте --show-capture вместо них.

В --show-capture командной строки была добавлена опция pytest 3.5.0, которая позволяет указать, как отображать захваченный вывод при неудачных тестах: no, stdout, stderr, log или all (по умолчанию).

Журнал результатов (--result-log)

Не рекомендуется, начиная с версии 4.0.

Removed in version 6.0.

Опция --result-log создает поток тестовых отчетов, которые могут быть проанализированы во время выполнения, но она использует пользовательский формат, который требует от пользователей реализации собственного анализатора.

Плагин pytest-reportlog предоставляет опцию --report-log, более стандартную и расширяемую альтернативу, создающую один объект JSON на строку, и должен охватывать те же случаи использования. Пожалуйста, попробуйте его и оставьте отзыв.

Плагин pytest-reportlog может быть даже объединен с ядром в какой-то момент, в зависимости от планов на плагины и количества пользователей, использующих его.

pytest_collect_directory крючок

Removed in version 6.0.

Хук pytest_collect_directory не работал должным образом в течение многих лет (он вызывался, но результаты игнорировались). Пользователи могут рассмотреть возможность использования pytest_collection_modifyitems вместо него.

TerminalReporter.writer

Removed in version 6.0.

Атрибут TerminalReporter.writer был устаревшим и больше не должен использоваться. Он был непреднамеренно раскрыт как часть публичного API этого плагина и слишком сильно связывает его с py.io.TerminalWriter.

Плагины, которые использовали TerminalReporter.writer напрямую, должны вместо этого использовать методы TerminalReporter, которые обеспечивают ту же функциональность.

junit_family значение по умолчанию меняется на «xunit2»

Изменено в версии 6.0.

Значение по умолчанию опции junit_family в pytest 6.0 изменится на xunit2, которая является обновлением старого формата xunit1 и поддерживается по умолчанию в современных инструментах, манипулирующих этим типом файлов (например, Jenkins, Azure Pipelines и т.д.).

Пользователям рекомендуется попробовать новый формат xunit2 и проверить, поддерживает ли его инструментарий, потребляющий XML-файл JUnit.

Чтобы использовать новый формат, обновите pytest.ini:

[pytest]
junit_family=xunit2

Если вы обнаружили, что ваш инструментарий не поддерживает новый формат, и хотите продолжать использовать устаревшую версию, установите вместо этого параметра значение legacy:

[pytest]
junit_family=legacy

Используя legacy, вы сохраните формат legacy/xunit1 при обновлении до pytest 6.0, где по умолчанию будет использоваться формат xunit2.

Чтобы сообщить пользователям об этом переходе, pytest будет выдавать предупреждение в случае, если опция --junitxml задана в командной строке, но junit_family не настроена явно в pytest.ini.

Сервисы, поддерживающие формат xunit2:

Конструкция узла изменена на Node.from_parent

Изменено в версии 6.0.

Для построения узлов теперь должен использоваться именованный конструктор from_parent. Это ограничение в поверхности api предназначено для того, чтобы обеспечить более качественный/простой рефакторинг дерева коллекций.

Это означает, что вместо MyItem(name="foo", parent=collector, obj=42) теперь нужно вызывать MyItem.from_parent(collector, name="foo").

Плагины, которые хотят поддерживать старые версии pytest и подавить предупреждение, могут использовать hasattr для проверки существования from_parent в этой версии:

def pytest_pycollect_makeitem(collector, name, obj):
    if hasattr(MyItem, "from_parent"):
        item = MyItem.from_parent(collector, name="foo")
        item.obj = 42
        return item
    else:
        return MyItem(name="foo", parent=collector, obj=42)

Обратите внимание, что from_parent следует вызывать только с ключевыми аргументами для параметров.

pytest.fixture аргументы являются только ключевыми словами

Removed in version 6.0.

Передача аргументов в pytest.fixture() как позиционных аргументов была удалена - вместо этого передавайте их по ключевому слову.

funcargnames псевдоним для fixturenames

Removed in version 6.0.

Классы FixtureRequest, Metafunc и Function отслеживают имена связанных с ними приспособлений с помощью меткого атрибута fixturenames.

До pytest 2.3 этот атрибут назывался funcargnames, и с тех пор мы сохранили его в качестве псевдонима. Наконец-то пришло время его удалить, так как он часто путает в тех местах, где мы или авторы плагинов должны различать имена приспособлений и имена, поставляемые не приспособлениями, такими как pytest.mark.parametrize.

pytest.config глобальный

Removed in version 5.0.

Глобальный объект pytest.config устарел. Вместо этого используйте request.config (через приспособление request) или, если вы являетесь автором плагина, используйте хук pytest_configure(config). Обратите внимание, что многие хуки также могут получить доступ к объекту config косвенно, например, через session.config или item.config.

"message" параметр pytest.raises

Removed in version 5.0.

Частой ошибкой является мнение, что этот параметр будет соответствовать сообщению об исключении, в то время как на самом деле он служит только для предоставления пользовательского сообщения в случае, если проверка pytest.raises не прошла. Чтобы предотвратить эту ошибку, и поскольку считается, что этот параметр мало используется, pytest на данный момент деприватизирует его без предоставления альтернативы.

Если у вас есть обоснованный вариант использования этого параметра, учтите, что для получения тех же результатов вы можете просто вызвать pytest.fail вручную в конце оператора with.

Например:

with pytest.raises(TimeoutError, message="Client got unexpected message"):
    wait_for(websocket.recv(), 0.5)

Становится:

with pytest.raises(TimeoutError):
    wait_for(websocket.recv(), 0.5)
    pytest.fail("Client got unexpected message")

Если у вас все еще есть сомнения по поводу этого обесценивания и будущего удаления, пожалуйста, прокомментируйте issue #3974.

raises / warns со строкой в качестве второго аргумента

Removed in version 5.0.

Вместо них используйте форму контекстного менеджера. При необходимости вызывайте exec напрямую.

Пример:

pytest.raises(ZeroDivisionError, "1 / 0")
pytest.raises(SyntaxError, "a $ b")

pytest.warns(DeprecationWarning, "my_function()")
pytest.warns(SyntaxWarning, "assert(1, 2)")

Становится:

with pytest.raises(ZeroDivisionError):
    1 / 0
with pytest.raises(SyntaxError):
    exec("a $ b")  # exec is required for invalid syntax

with pytest.warns(DeprecationWarning):
    my_function()
with pytest.warns(SyntaxWarning):
    exec("assert(1, 2)")  # exec is used to avoid a top-level warning

Использование Class в пользовательских коллекторах

Removed in version 4.0.

Использование объектов с именем "Class" в качестве способа настройки типа узлов, которые собираются в подклассах Collector, было устаревшим. Вместо этого пользователи должны использовать pytest_pycollect_makeitem для настройки типов узлов во время сбора.

Эта проблема должна затрагивать только продвинутые плагины, которые создают новые типы коллекций, поэтому если вы видите это предупреждение, пожалуйста, свяжитесь с авторами, чтобы они могли изменить код.

метки в pytest.mark.parametrize

Removed in version 4.0.

Применение меток к значениям вызова pytest.mark.parametrize теперь устарело. Например:

@pytest.mark.parametrize(
    "a, b",
    [
        (3, 9),
        pytest.mark.xfail(reason="flaky")(6, 36),
        (10, 100),
        (20, 200),
        (40, 400),
        (50, 500),
    ],
)
def test_foo(a, b):
    ...

Этот код применяет метку pytest.mark.xfail(reason="flaky") к значению (6, 36) приведенного выше вызова параметризации.

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

Чтобы обновить код, используйте pytest.param:

@pytest.mark.parametrize(
    "a, b",
    [
        (3, 9),
        pytest.param(6, 36, marks=pytest.mark.xfail(reason="flaky")),
        (10, 100),
        (20, 200),
        (40, 400),
        (50, 500),
    ],
)
def test_foo(a, b):
    ...

pytest_funcarg__ префикс

Removed in version 4.0.

В самых ранних версиях pytest фикстуры могли быть определены с помощью префикса pytest_funcarg__:

def pytest_funcarg__data():
    return SomeData()

Переключитесь на декоратор @pytest.fixture:

@pytest.fixture
def data():
    return SomeData()

[pytest] раздел в файлах setup.cfg

Removed in version 4.0.

Секции [pytest] в файлах setup.cfg теперь должны называться [tool:pytest], чтобы избежать конфликтов с другими командами distutils.

Metafunc.addcall

Removed in version 4.0.

Metafunc.addcall был предшественником нынешнего параметризованного механизма. Вместо него пользователям следует использовать pytest.Metafunc.parametrize().

Пример:

def pytest_generate_tests(metafunc):
    metafunc.addcall({"i": 1}, id="1")
    metafunc.addcall({"i": 2}, id="2")

Становится:

def pytest_generate_tests(metafunc):
    metafunc.parametrize("i", [1, 2], ids=["1", "2"])

cached_setup

Removed in version 4.0.

request.cached_setup был предшественником механизма установки/снятия, доступного для приспособлений.

Пример:

@pytest.fixture
def db_session():
    return request.cached_setup(
        setup=Session.create, teardown=lambda session: session.close(), scope="module"
    )

Его следует обновить, чтобы использовать стандартные механизмы крепления:

@pytest.fixture(scope="module")
def db_session():
    session = Session.create()
    yield session
    session.close()

Для получения дополнительной информации вы можете обратиться к funcarg comparison section in the docs.

pytest_plugins в файлах conftest не верхнего уровня

Removed in version 4.0.

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

Config.warn и Node.warn.

Removed in version 4.0.

Эти методы были частью внутренней системы предупреждений pytest, но с 3.8 pytest использует встроенную систему предупреждений для своих собственных предупреждений, поэтому эти две функции теперь устарели.

Config.warn следует заменить вызовами стандартного warnings.warn, например:

config.warn("C1", "some warning")

Становится:

warnings.warn(pytest.PytestWarning("some warning"))

Node.warn теперь поддерживает две подписи:

  • node.warn(PytestWarning("some message")): теперь является рекомендованным способом вызова этой функции. Экземпляр предупреждения должен быть PytestWarning или его подклассом.

  • node.warn("CI", "some message"): эта форма кода/сообщения была удалена и должна быть преобразована в форму экземпляра предупреждения, приведенную выше.

свойство записи_xml_

Removed in version 4.0.

Фикстура record_xml_property теперь устарела в пользу более общей record_property, которая может использоваться другими потребителями (например, pytest-html) для получения пользовательской информации о выполнении теста.

Это просто вопрос переименования приспособления, поскольку API одинаково:

def test_foo(record_xml_property):
    ...

Изменить на:

def test_foo(record_property):
    ...

Передача строки командной строки в pytest.main()

Removed in version 4.0.

Передача строки командной строки в pytest.main() устарела:

pytest.main("-v -s")

Вместо этого передайте список:

pytest.main(["-v", "-s"])

Передавая строку, пользователи ожидают, что pytest будет интерпретировать эту командную строку, используя правила оболочки, с которыми они работают (например, bash или Powershell), но это очень трудно/невозможно сделать переносимым способом.

Вызов светильников напрямую

Removed in version 4.0.

Вызов функции приспособления напрямую, в отличие от запроса их в тестовой функции, является устаревшим.

Например:

@pytest.fixture
def cell():
    return ...


@pytest.fixture
def full_cell():
    cell = cell()
    cell.make_full()
    return cell

Это сильно запутывает новых пользователей, которые часто будут вызывать функции приспособления и запрашивать их у тестовых функций взаимозаменяемо, что нарушает модель разрешения приспособления.

В этих случаях просто запросите функцию непосредственно в зависимом приспособлении:

@pytest.fixture
def cell():
    return ...


@pytest.fixture
def full_cell(cell):
    cell.make_full()
    return cell

В качестве альтернативы, если функция приспособления вызывается несколько раз внутри теста (что затрудняет применение приведенного выше шаблона) или если вы хотите внести минимальные изменения в код, вы можете создать приспособление, которое вызывает исходную функцию вместе с параметром name:

def cell():
    return ...


@pytest.fixture(name="cell")
def cell_fixture():
    return cell()

yield тесты

Removed in version 4.0.

pytest поддерживал тесты в стиле yield, где тестовая функция на самом деле yield функции и значения, которые затем превращаются в соответствующие методы тестирования. Пример:

def check(x, y):
    assert x ** x == y


def test_squared():
    yield check, 2, 4
    yield check, 3, 9

Это приведет к созданию двух реальных тестовых функций.

Эта форма тестовой функции не поддерживает исправления должным образом, и пользователям следует перейти на pytest.mark.parametrize:

@pytest.mark.parametrize("x, y", [(2, 4), (3, 9)])
def test_squared(x, y):
    assert x ** x == y

Внутренние классы, доступ к которым осуществляется через Node

Removed in version 4.0.

Доступ к экземплярам Module, Function, Class, Instance, File и Item через Node теперь выдает это предупреждение:

usage of Function.Module is deprecated, please use pytest.Module instead

Пользователи должны просто import pytest и обращаться к этим объектам с помощью модуля pytest.

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

Node.get_marker

Removed in version 4.0.

Как часть большого Реконструкция и итерация маркеров, _pytest.nodes.Node.get_marker удаляется. Советы по обновлению кода см. в the documentation.

somefunction.markname

Removed in version 4.0.

В рамках большого Реконструкция и итерация маркеров мы уже отказались от использования MarkInfo единственным правильным способом получения маркеров элемента является node.iter_markers(name).

pytest_namespace

Removed in version 4.0.

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

Пример использования:

class MySymbol:
    ...


def pytest_namespace():
    return {"my_symbol": MySymbol()}

Авторы плагинов, полагающиеся на этот хук, должны вместо этого требовать, чтобы пользователи теперь импортировали модули плагина напрямую (с соответствующим публичным API).

В качестве временной меры авторы плагинов все еще могут внедрять свои имена в пространство имен pytest, обычно во время pytest_configure:

import pytest


def pytest_configure():
    pytest.my_symbol = MySymbol()
Вернуться на верх