pytest
параметры тестов используются с помощью декоратора @pytest.mark.parametrize
. Этот декоратор позволяет запускать один и тот же тест несколько раз, передавая ему разные наборы параметров. Он принимает два основных аргумента:
argnames
: Строка с именами параметров, разделёнными запятыми, или список имён параметров.argvalues
: Список или кортеж значений для параметров. Каждый элемент в списке/кортеже соответствует одному набору параметров. Значения передаются в тест в соответствии с порядком имён параметров.@pytest.mark.parametrize("input,expected", [(1, 2), (3, 4), (5, 6)])
В этом примере тест будет запущен трижды, сначала с input=1
и expected=2
, затем с input=3
и expected=4
, и наконец с input=5
и expected=6
.
В pytest параметры тестов (parametrization) позволяют запускать один и тот же тестовый код с разными входными данными. Это особенно полезно для тестирования различных сценариев, граничных случаев или для обеспечения покрытия кода с разными наборами значений.
Основной способ параметризации в pytest – использование декоратора @pytest.mark.parametrize
.
Синтаксис:
@pytest.mark.parametrize("argnames", argvalues)
Где:
argnames
: строка или список строк, содержащий имена параметров, которые будут переданы в тестовую функцию. Если параметров несколько, их нужно указать через запятую (например, "input, expected"
).argvalues
: список значений (или кортежей значений, если параметров несколько) для каждого набора тестов. Каждый элемент списка argvalues
будет использован как набор входных данных для одного запуска тестовой функции.Пример:
import pytest
def add(x, y):
return x + y
@pytest.mark.parametrize("x, y, expected", [
(1, 2, 3),
(5, 5, 10),
(0, -1, -1),
(-1, -1, -2),
])
def test_add(x, y, expected):
assert add(x, y) == expected
В этом примере функция test_add
будет запущена четыре раза. Каждый раз x
, y
и expected
будут принимать значения из соответствующего кортежа в списке argvalues
. Таким образом, тест проверяет, что функция add
правильно складывает различные числа.
Другие возможности:
ids
в @pytest.mark.parametrize
, чтобы задать имена для каждого набора тестов. Это облегчает понимание результатов тестирования.
@pytest.mark.parametrize("x, y, expected", [
(1, 2, 3),
(5, 5, 10),
], ids=["positive_numbers", "equal_numbers"])
def test_add(x, y, expected):
assert add(x, y) == expected
import pytest
def divide(x, y):
return x / y
@pytest.mark.parametrize(
"x, y, expected",
[
(10, 2, 5),
pytest.param(10, 0, float('inf'), marks=pytest.mark.xfail(reason="Division by zero")),
],
)
def test_divide(x, y, expected):
assert divide(x, y) == expected
В этом примере тест с делением на ноль помечен как xfail
, чтобы указать, что ожидается сбой.
argvalues
можно использовать функцию, которая будет генерировать эти значения. Это полезно для сложных случаев, когда требуется динамически создавать наборы входных данных.Преимущества использования параметризации:
В заключение, параметризация тестов в pytest – мощный инструмент, который позволяет писать более эффективные, читаемые и надежные тесты.