The parametrized fixture is a convenient way to factorize your python test functions, avoid duplicates in your test code and help you stick to the DRY (Don’t Repeat Yourself) principle.
Note: you can use it after having installed the plugin via pip install parametrized
.
Let’s demonstrate this with a quick and easy example. Let’s assume you have a function that returns the sum of the elements within a list:
def sum_list_elements(l):
return sum(l)
You want to test the behavior of your function using pytest
. In your Test Strategy, you want to test this function for different kind of inputs. A testing suit could look like:
def test_sum_list_no_elements():
result = sum_list_elements([])
assert result == 0
def test_sum_list_one_element():
result = sum_list_elements([-2])
assert result == -2
def test_sum_list_cancelling_elements():
result = sum_list_elements([-3, 1, 2])
assert result == 0
def test_sum_list_elements():
result = sum_list_elements([1, 2, 3])
assert result == 6
However, this means having a lot of redundant code. You can refactor the suit thanks to the parametrized fixture:
from parameterized import parameterized
@parameterized.expand([
([], 0),
([-2], -2),
([-3, 1, 2], 0),
([1, 2, 3], 6)
])
def test_sum_list_elements_suit(inputs, expected):
result = sum_list_elements(inputs)
assert result == expected
Here is the result of the tests:
zsh> poetry run pytest tests/test_parametrized.py
collected 4 items
tests/test_parametrized.py::test_sum_list_elements_suit_0 PASSED
tests/test_parametrized.py::test_sum_list_elements_suit_1 PASSED
tests/test_parametrized.py::test_sum_list_elements_suit_2 PASSED
tests/test_parametrized.py::test_sum_list_elements_suit_3 PASSED
======================= 4 passed in 0.01s =======================
To learn more about parametrization: Pytest Against a Wide Range of Data with Python hypothesis and Automatically Discover Edge Cases.