Маркировка тестов в pytest

Pytest в Python: маркировка тестов

Маркировка тестов в 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 предоставляет простой и эффективный способ категоризировать, организовывать и управлять выполнением тестов. Благодаря гибкости маркеров и возможности создавать собственные, тестировщики могут настраивать процесс тестирования в соответствии с нуждами и требованиями своего проекта.

Содержание: