← Назад к вопросам

Что такое pytest.mark.parametrize?

1.2 Junior🔥 141 комментариев
#Теория тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое pytest.mark.parametrize?

pytest.mark.parametrize — это одна из самых мощных и часто используемых декораторов (decorators) в фреймворке pytest. Его основная цель — выполнение одного и того же теста с разными входными данными и ожидаемыми результатами без необходимости написания множества отдельных тестовых функций. Это фундаментальный инструмент для параметризованного тестирования (Parameterized Testing).

Основная идея и преимущества

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

  • Уменьшить дублирование кода: Один тест покрывает множество сценариев.
  • Улучшить читаемость и структуру: Все данные теста собраны в одном месте, часто прямо в декораторе.
  • Легко добавлять новые тестовые случаи: Просто расширить список параметров.
  • Получать четкий отчет: При неудачном тесте pytest точно показывает, какие именно входные данные вызвали ошибку.

Синтаксис и использование

Декоратор @pytest.mark.parametrize принимает два основных аргумента:

  1. Имена аргументов (как строка или список строк), которые будут переданы в тестовую функцию.
  2. Список значений для этих аргументов (список списков, список кортежей).

Рассмотрим классический пример: тестирование функции сложения.

import pytest

def add(a, b):
    return a + b

# Без parametrize: дублирование кода
def test_add_1():
    assert add(1, 2) == 3

def test_add_2():
    assert add(-1, 5) == 4

# С parametrize: один тест для всех случаев
@pytest.mark.parametrize("a, b, expected", [
    (1, 2, 3),
    (-1, 5, 4),
    (0, 0, 0),
    (10, -10, 0),
])
def test_parametrized_add(a, b, expected):
    result = add(a, b)
    assert result == expected

При запуске pytest фактически выполнит функцию test_parametrized_add четыре раза, каждый раз с новыми значениями a, b и expected из списка.

Ключевые особенности и приемы работы

  • Несколько наборов параметров: Вы можете применять несколько декораторов parametrize к одной функции. Pytest создаст тесты для всех возможных комбинаций параметров (декартовое произведение).
@pytest.mark.parametrize("x", [1, 2])
@pytest.mark.parametrize("y", ["a", "b"])
def test_combo(x, y):
    # Этот тест запустится 4 раза: (1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')
    print(f"Testing with x={x}, y={y}")
  • Динамическая генерация параметров: Список параметров можно генерировать программно, что полезно для сложных данных.
def generate_test_data():
    return [(i, i*2) for i in range(5)]

@pytest.mark.parametrize("input_val, expected", generate_test_data())
def test_dynamic(input_val, expected):
    assert input_val * 2 == expected
  • Использование с другими марками: parametrize можно комбинировать с другими марками pytest, например, @pytest.mark.skip или @pytest.mark.xfail.
@pytest.mark.parametrize("data", [
    pytest.param("valid_data", id="normal_case"),
    pytest.param("invalid_data", marks=pytest.mark.xfail(reason="Known bug")),
])
def test_with_special_mark(data):
    # Второй случай будет ожидаемо неудачным (xfail)
    process(data)
  • Параметризация фикстур (fixtures): Параметры можно передавать в фикстуры, что позволяет создавать динамические зависимости для тестов. Это очень мощная функциональность для управления тестовым контекстом.

  • Идентификаторы тестов (id): Вы можете задавать понятные именования для каждого набор параметров, используя аргумент id или pytest.param(). Это улучшает читаемость вывода pytest.

@pytest.mark.parametrize("a, b, expected", [
    (1, 2, 3),
    (5, 5, 10),
], ids=["small_numbers", "equal_numbers"])
def test_with_ids(a, b, expected):
    assert add(a, b) == expected

Практическое применение в QA Automation

В автоматизации тестирования parametrize незаменим для:

  • Тестирования API: Один тест для различных комбинаций входных параметров запроса (разные тела, заголовки, статусы).
  • Тестирования UI: Проверка формы с множеством допустимых и недопустимых значений полей.
  • Тестирования бизнес-логики: Проверка расчетов, валидаций, преобразований данных на всем спектре возможных входных значений.
  • Конвертации тестовых данных: Часто данные из внешних источников (CSV, JSON, базы данных) легко преобразуются в список для parametrize.

Таким образом, pytest.mark.parametrize — это не просто синтаксический сахар, а стратегический инструмент, который значительно повышает эффективность написания, поддержки и масштабирования тестового кода, делая его более чистым, выразительным и мощным.