Как помечать тестовые функции атрибутами
С помощью хелпера pytest.mark можно легко задавать метаданные для тестовых функций. Полный список встроенных маркеров можно найти в справочнике API. Также можно вывести все маркеры (включая встроенные и пользовательские) через CLI — pytest --markers.
Вот некоторые из встроенных маркеров:
usefixtures — использовать фикстуры в тестовой функции или классе
filterwarnings — фильтровать определённые предупреждения (warnings) тестовой функции
skip — всегда пропускать тестовую функцию
skipif — пропускать тестовую функцию, если выполняется условие
xfail — выдавать результат «ожидаемое падение» (“expected failure”), если выполняется условие
parametrize — выполнять несколько запусков одной и той же тестовой функции.
Легко создавать пользовательские маркеры или применять маркеры ко всему тестовому классу или модулю. Эти маркеры могут использоваться плагинами и также обычно используются для выбора тестов в командной строке опцией -m.
Примеры, которые также служат документацией, см. в Working with custom markers.
Note
Метки (marks) можно применять только к тестам; на фикстуры они не влияют.
Регистрация маркеров
Можно зарегистрировать пользовательские маркеры в конфигурационном файле так:
toml
[pytest]
markers = [
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
"serial",
]
ini
[pytest]
markers =
slow: marks tests as slow (deselect with '-m "not slow"')
serial
Обратите внимание, что всё после : в имени маркера — необязательное описание.
Альтернативно можно регистрировать новые маркеры программно в хуке pytest_configure:
def pytest_configure(config):
config.addinivalue_line(
"markers", "env(name): mark test to run only on named environment"
)
Зарегистрированные маркеры появляются в тексте справки pytest и не вызывают предупреждений (см. следующий раздел). Рекомендуется, чтобы сторонние плагины всегда регистрировали свои маркеры.
Выдача ошибок при неизвестных маркерах
Незарегистрированные маркеры, применённые декоратором @pytest.mark.name_of_the_mark, всегда будут выдавать предупреждение, чтобы избежать «тихого» неожиданного поведения из‑за опечаток. Как описано в предыдущем разделе, предупреждение для пользовательских маркеров можно отключить, зарегистрировав их в конфигурационном файле или через пользовательский хук pytest_configure.
Когда включена опция конфигурации strict_markers, любые неизвестные маркеры, применённые декоратором @pytest.mark.name_of_the_mark, приведут к ошибке. Эту проверку можно включить в проекте, задав strict_markers в конфигурации:
toml
[pytest]
addopts = ["--strict-markers"]
markers = [
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
"serial",
]
ini
[pytest]
strict_markers = true
markers =
slow: marks tests as slow (deselect with '-m "not slow"')
serial