Skip to main content

Package to use type annotations for parametrization in pytest

codecov Code style: black

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)

Source distribution for pytest-parametrization-annotation 1.0.0
File Size Uploaded
pytest_parametrization_annotation-1.0.0.tar.gz 4.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pytest-parametrization-annotation 1.0.0
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page