Package to use type annotations for parametrization in pytest
This package allows the declaration of parametrization using type annotations and definition of test cases using a decorator.
The primary reason of using this package over the standard pytest.mark.parametrize is readability and maintainability
of test cases especially if many test cases are defined for a single test function.
In addition, error messages are more informative compared to those provided by pytest.mark.parametrize.
Install pytest-parametrization-annotation
pip install pytest-parametrization-annotation
Usage
Defining a test function parameter as parametrized
To define a parameter as parametrized, use the Parametrized class or an instance of the Parametrized class as an
annotation.
from typing import Annotated
from pytest_parametrization_annotation import Parametrized
# Both definitions are treated the same
def test(a: Annotated[int, Parametrized], b: Annotated[int, Parametrized()]) -> None:
...
By default, parameters annotated in this way are treated as direct parameters.
To define a parameter as indirect, use the indirect argument when instantiating the Parametrized class.
from typing import Annotated
from pytest_parametrization_annotation import Parametrized
def test(a: Annotated[int, Parametrized(indirect=True)]) -> None:
...
In addition, the Parametrized class provides to methods to define default values, default and default_factory.
from typing import Annotated
from pytest_parametrization_annotation import Parametrized
def test(
a: Annotated[int, Parametrized(default=1)],
b: Annotated[str, Parametrized(default_factory=lambda: "Hello World!")]
) -> None:
...
Defining test cases
To define test cases, use the case marker.
Each parametrized argument must be reflected as keyword in the case marker.
from typing import Annotated
import pytest
from pytest_parametrization_annotation import Parametrized
@pytest.mark.case(a=1)
def test(a: Annotated[int, Parametrized]) -> None:
...
If a parametrized argument is missing from the case marker, the test suit will fail and a detailed error message will be provided.
examples/test_basic.py::test_addition | Case number 1: Failed to populate because the parameter 'b' is not provided and default is not configured.
Every case marker defines a single test case. To define multiple test cases, use multiple case markers.
from typing import Annotated
import pytest
from pytest_parametrization_annotation import Parametrized
@pytest.mark.case(a=1)
@pytest.mark.case(a=2)
@pytest.mark.case(a=3)
def test(a: Annotated[int, Parametrized]) -> None:
...
Optionally a case can be named by providing the first positional argument to the case marker. If this is not provided the default pytest naming scheme is used.
from typing import Annotated
import pytest
from pytest_parametrization_annotation import Parametrized
@pytest.mark.case("Example", a=1)
def test(a: Annotated[int, Parametrized]) -> None:
...
Develop
Install dependencies
poetry install
Format code
poetry run ruff format
poetry run black .
Run static type checker
poetry run mypy .
Run tests
poetry run tox run-parallel
Metadata
Release files for pytest-parametrization-annotation 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pytest_parametrization_annotation-1.0.0.tar.gz | 4.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pytest_parametrization_annotation-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 11.2 kB
Release files / pytest_parametrization_annotation-1.0.0.tar.gz
| Download URL | pytest_parametrization_annotation-1.0.0.tar.gz |
|---|---|
| Size | 4.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f6069b603de899009b38c6ddb765936a6474d29ed7e920ba45bee8fec2bc764b
|
|
BLAKE2b-256 checksum How to use checksums |
c757abd3a2a53376cc40d38a2fe91e3fc1842946dfe9d880ccc8053c4062e6f5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.0.1 CPython/3.12.8
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Dec 10, 2024.
Transparency logRelease files / pytest_parametrization_annotation-1.0.0-py3-none-any.whl
| Download URL | pytest_parametrization_annotation-1.0.0-py3-none-any.whl |
|---|---|
| Size | 6.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b0fa1a9d6604a6263497a3174a3688848710272c34735af88eca1dc8e622151f
|
|
BLAKE2b-256 checksum How to use checksums |
272b33f282215cd23a290df55be7414b617e8afbff0a4e1406c30882e4f09fac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.0.1 CPython/3.12.8
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Dec 10, 2024.
Transparency log