Skip to main content

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.

Metadata

Release files for pytest-typing 26.4.1

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-typing 26.4.1
File Size Uploaded
pytest_typing-26.4.1.tar.gz 65.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pytest-typing 26.4.1
File Interpreter ABI Platform
pytest_typing-26.4.1-py3-none-any.whl Python 3 none any Details

Total release size: 82.7 kB

Release files / pytest_typing-26.4.1.tar.gz

Download URL pytest_typing-26.4.1.tar.gz
Size 65.1 kB
Tags Source
SHA-256 checksum
How to use checksums
7bb2f335b0711fd3434853d4918ec908e86e1629e5d3c5af5000bdfe8102d4df
BLAKE2b-256 checksum
How to use checksums
9d296a09dcdabe91611d55eb29db8830d250d8539dc5e0485ff21e98f29b7581
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 12, 2026.

Transparency log

Release files / pytest_typing-26.4.1-py3-none-any.whl

Download URL pytest_typing-26.4.1-py3-none-any.whl
Size 17.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
42971cc9f0c376ea0a0a15ddcb9bc3d9ad994895d3c46d1b82868aa564b5a50a
BLAKE2b-256 checksum
How to use checksums
07c96b388b3db47dee998f645fdc3c22f21c4e7bfc4ae28743037b52f6bd5566
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 12, 2026.

Transparency log

Release history Release notifications | RSS feed

26.5.0

2 release files

This release

26.4.1 This release

2 release files

26.3.0

2 release files

26.2.0

2 release files

26.1.0

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