Что такое pytest.mark.parametrize?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое pytest.mark.parametrize?
pytest.mark.parametrize — это одна из самых мощных и часто используемых декораторов (decorators) в фреймворке pytest. Его основная цель — выполнение одного и того же теста с разными входными данными и ожидаемыми результатами без необходимости написания множества отдельных тестовых функций. Это фундаментальный инструмент для параметризованного тестирования (Parameterized Testing).
Основная идея и преимущества
Вместо того чтобы писать десять похожих тестов для проверки функции с десятьми различными аргументами, вы пишете один тест и "параметризуете" его, предоставляя список этих аргументов и ожидаемых результатов. Это позволяет:
- Уменьшить дублирование кода: Один тест покрывает множество сценариев.
- Улучшить читаемость и структуру: Все данные теста собраны в одном месте, часто прямо в декораторе.
- Легко добавлять новые тестовые случаи: Просто расширить список параметров.
- Получать четкий отчет: При неудачном тесте pytest точно показывает, какие именно входные данные вызвали ошибку.
Синтаксис и использование
Декоратор @pytest.mark.parametrize принимает два основных аргумента:
- Имена аргументов (как строка или список строк), которые будут переданы в тестовую функцию.
- Список значений для этих аргументов (список списков, список кортежей).
Рассмотрим классический пример: тестирование функции сложения.
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 — это не просто синтаксический сахар, а стратегический инструмент, который значительно повышает эффективность написания, поддержки и масштабирования тестового кода, делая его более чистым, выразительным и мощным.