Skip to main content

Test your types by running typecheckers on them.

Project description

pytest-typing: Test Your Types

Ensure your types do what you think they do.

License: MIT PyPI Supported Python Versions Coverage


pytest-typing lets you test the type signatures of your code to ensure they really are what you expect. You write Markdown files with Python code blocks and expected type assertions; pytest-typing runs type checkers on these blocks and compares the actual and expected outputs.

First, install the plugin, making it discoverable by pytest:

$ pip install pytest-typing
$ # or
$ uv add pytest-typing --group dev

Then, configure pytest-typing with the type checker (or checkers) you want to use in pyproject.toml:

[tool.pytest]
typing_checkers = ["mypy"]

The currently supported type checkers are Mypy, ty, Pyrefly, and Pyright.

Finally, start writing Markdown files in your test directory (tests/ by default). The files need to be named test_typing_*.md in order to be collected.

Inside the Markdown file, use Markdown headings (#, ##, etc.) to separate tests. Inside each heading, write fenced Python code blocks (python or py) with code that will be type-checked.

This is what an example file might look like, defining two tests:

# This is a test file

This is free-form text that can explain the test but is ignored by the plugin.

## This is a happy-path test

This code snippet should type-check without problems.

```python
a: int = 1
```

## This is a sad-path test

This test demonstrates how errors can be checked using error codes.
Note that error codes are specific to individual type checkers.

```python
a: str = 1  # error: [invalid-assignment]
```

In addition to matching on error codes, we can additionally match the exact error messages too.

a: str = 1  # error: [invalid-assignment] Object of type `Literal[1]` is not assignable to `str`

Although this may be fragile since checkers can improve their error messages from time to time.

Comments may be placed above lines that are expected to produce errors.

# error: [invalid-assignment]
a: str = 1

reveal_type statements can be matched against.

reveal_type(1)  # revealed: Literal[1]

Or, again, on the line above.

# revealed: Literal[1]
reveal_type(1)

A section may contain multiple code blocks; this is useful for inserting longer pieces of prose in between blocks. All blocks within a section get concatenated.

# This test contains multiple blocks

```python
a: int = 1
```

Here's some prose explaining what's going on, and then a second block:

```python
b: str = 1  # error: [invalid-assignment]
```

Testing on multiple checkers

When the typing_checkers field is configured with multiple checkers, tests will be run on all of them. Difference checkers usually have different error codes, so different error comments should be used.

a: str = 1  # ty-error: [invalid-assignment]  # mypy-error: [assignment]

Or, when more checkers are in use, stacked:

# ty-error: [invalid-assignment]
# mypy-error: [assignment]
# pyrefly-error: [bad-assignment]
# pyright-error: [reportAssignmentType]
a: str = 1

A code block can be configured to run only on a specific checker:

```python only=mypy
a: int = 1
```

Or configured to skip only a specific checker:

```python skip=mypy
a: int = 1
```

pytest-typing is inspired by Astral's mdtest framework.

Project Information

License

pytest-typing is written by Tin Tvrtković and distributed under the terms of the MIT license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pytest_typing-26.3.0.tar.gz (65.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pytest_typing-26.3.0-py3-none-any.whl (17.6 kB view details)

Uploaded Python 3

File details

Details for the file pytest_typing-26.3.0.tar.gz.

File metadata

  • Download URL: pytest_typing-26.3.0.tar.gz
  • Upload date:
  • Size: 65.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pytest_typing-26.3.0.tar.gz
Algorithm Hash digest
SHA256 c0e155612088bd30351bd6a38fea2bf039a280b5303423e8c3eebe568c180b20
MD5 318d2d255de45ef62591791d686091f5
BLAKE2b-256 3a3f982c57ce061a6fd667e85b1256eb3ad5d67dc56ba53d430b3bd9aca26716

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytest_typing-26.3.0.tar.gz:

Publisher: pypi-package.yml on Tinche/pytest-typing

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pytest_typing-26.3.0-py3-none-any.whl.

File metadata

  • Download URL: pytest_typing-26.3.0-py3-none-any.whl
  • Upload date:
  • Size: 17.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pytest_typing-26.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b44a990622e8f77684b0f35c13e1d8711fd20a43c53a53b378619d69bea47007
MD5 d7ae429e280e43c5303b829ff4f985e9
BLAKE2b-256 22c18c4b27724dc0cc0c566e7b1a27a1afd4497d6c5b9cc93a3f9330c742ac12

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytest_typing-26.3.0-py3-none-any.whl:

Publisher: pypi-package.yml on Tinche/pytest-typing

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page