Маркировка тестов в pytest — это мощный инструмент для категоризации и управления выполнением тестов. Маркеры позволяют аннотировать тестовые функции и классы, чтобы затем легко фильтровать и выполнять определенные подмножества тестов.
Как применять маркеры:
Для того чтобы пометить тест определенным маркером, достаточно добавить декоратор @pytest.mark.NAME_OF_MARKER
непосредственно перед тестовой функцией.
@pytest.mark.slow
def test_example():
...
Если тест относится к нескольким категориям или необходимо применить несколько маркеров, можно добавить несколько декораторов:
@pytest.mark.slow
@pytest.mark.regression
def test_example():
...
Некоторые маркеры могут принимать аргументы, что позволяет уточнить поведение или передать дополнительную информацию. Встроенный маркер skipif
— хороший пример:
import sys
@pytest.mark.skipif(sys.version_info < (3, 8), reason="Requires Python 3.8 or higher")
def test_example():
...
В данном примере тест будет пропущен, если версия Python ниже 3.8.
Маркер parametrize
позволяет выполнять одну и ту же тестовую функцию несколько раз с различными аргументами:
@pytest.mark.parametrize("input_value, expected_output", [(1, 2), (3, 4), (5, 6)])
def test_example(input_value, expected_output):
assert some_function(input_value) == expected_output
Можно также применять маркеры к тестовым классам, в этом случае маркер будет применен ко всем тестовым методам этого класса:
@pytest.mark.slow
class TestExample:
def test_method_one(self):
...
def test_method_two(self):
...
В pytest есть возможность создания пользовательских маркеров, что позволяет адаптировать процесс тестирования под конкретные требования проекта. Эти маркеры могут использоваться для категоризации тестов, добавления дополнительной метаинформации или управления специфичными условиями выполнения.
Для начала, необходимо зарегистрировать новый маркер в конфигурационном файле pytest (обычно это pytest.ini):
[pytest]
markers =
custom_marker: Description of custom marker.
Теперь маркер custom_marker
можно использовать в тестовых функциях:
@pytest.mark.custom_marker
def test_with_custom_marker():
...
Хотя большинство пользовательских маркеров просто помечают тест, иногда может потребоваться передать дополнительные данные. Вы можете передать данные, используя маркер как функцию:
@pytest.mark.custom_marker("special_arg")
def test_with_argument():
...
Затем можно получить доступ к этим данным внутри теста через request:
def test_with_argument(request):
marker = request.node.get_closest_marker("custom_marker")
if marker:
arg = marker.args[0]
# Теперь можно использовать `arg` внутри теста.
Чтобы избежать ошибок в использовании маркеров (например, опечаток), можно включить строгую валидацию маркеров. Добавьте следующую строку в pytest.ini:
[pytest]
addopts = --strict-markers
Теперь, если вы попробуете использовать не зарегистрированный маркер, pytest выдаст ошибку.
Одним из наиболее полезных применений маркеров в pytest является возможность запускать определенные группы тестов на основе этих маркеров. Это позволяет легко настроить выполнение тестов в зависимости от потребностей вашего CI/CD процесса, выполнить только быстрые тесты или тесты для конкретной функциональной области.
Допустим, у вас есть маркер @pytest.mark.slow
, который вы используете для маркировки медленных тестов. Если вы хотите выполнить только медленные тесты, используйте следующую команду:
pytest -m slow
Аргумент -m
позволяет выбрать тесты с определенным маркером для выполнения.
Если, наоборот, вы хотите выполнить все тесты, кроме медленных, используйте следующую команду:
pytest -m "not slow"
Вы можете комбинировать маркеры с использованием логических операторов and
, or
и not
:
pytest -m "slow and regression"
Эта команда выполнит тесты, помеченные как slow
и regression
.
Если вы забыли, какие маркеры используются в вашем проекте, или хотите проверить их описания, вы можете получить список всех маркеров:
pytest --markers
Маркировка тестов в pytest предоставляет простой и эффективный способ категоризировать, организовывать и управлять выполнением тестов. Благодаря гибкости маркеров и возможности создавать собственные, тестировщики могут настраивать процесс тестирования в соответствии с нуждами и требованиями своего проекта.
Содержание: