You can test for many values in pytest in a single test by using parametrize. If you want to stack multiple variables though, it helps to recognize that you can stack these decorators on top of eachother.
Starting Point
Let's discuss an example. Suppose that we have the following test_normalise.py
file.
The goal will be to test a function called normalise
which will accept a
numpy array and output a numpy array with normalised values between 0 and 1.
We're going to start by checking that the shape of the array should does not change.
import pytest
import numpy as np
def normalize(X):
return (X - X.min())/(X.max() - X.min())
# First we generate a long set of settings
settings = []
for x in [1, 2, 30]:
for y in [1, 2, 30]:
settings.append((x, y))
# Next, we place them in parametrize
@pytest.mark.parametrize("x, y", settings)
def test_shape_same(x, y):
X = np.random.normal((x, y))
X_norm = normalize(X)
assert X.shape == X_norm.shape
Then we can run pytest on this file via;
# The verbose setting is optional, but gives more information
pytest test_normalise.py --verbose
Parametrize
An alternative might be to stack the parametrize
decorators!
import pytest
import numpy as np
def normalize(X):
return (X - X.min())/(X.max() - X.min())
@pytest.mark.parametrize("x", [1, 2, 30], ids=lambda d: f"x={d}")
@pytest.mark.parametrize("y", [1, 2, 30], ids=lambda d: f"y={d}")
def test_shape_same(x, y):
X = np.random.normal((x, y))
X_norm = normalize(X)
assert X.shape == X_norm.shape