Амортизация и удаление¶
На этой странице перечислены все функции 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
следующие хуки теперь получают дополнительные аргументы:
pytest_ignore_collect(collection_path: pathlib.Path)
как эквивалентpath
pytest_collect_file(file_path: pathlib.Path)
как эквивалентpath
pytest_pycollect_makemodule(module_path: pathlib.Path)
как эквивалентpath
pytest_report_header(start_path: pathlib.Path)
как эквивалентstartdir
pytest_report_collectionfinish(start_path: pathlib.Path)
как эквивалентstartdir
Сопутствующие пути на основе 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()