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 and ty.

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]

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.1.0.tar.gz (61.4 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.1.0-py3-none-any.whl (15.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: pytest_typing-26.1.0.tar.gz
  • Upload date:
  • Size: 61.4 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.1.0.tar.gz
Algorithm Hash digest
SHA256 d9d82f28ad8f250eb34459b359914e6389692236ee8b8e9584e63fb0958850e1
MD5 c83a30cd203563b2943d2fd5dcf65893
BLAKE2b-256 454cdc3c1bb99edd318127d9378cc1228ec13c777e808d2ab90715543803993b

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytest_typing-26.1.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.1.0-py3-none-any.whl.

File metadata

  • Download URL: pytest_typing-26.1.0-py3-none-any.whl
  • Upload date:
  • Size: 15.1 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.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d5b4f5016c316d91ee13f91fce8111804a0d99d5769935db94c901e29a7b5ba5
MD5 e679922f1e12a06180a068fab69df5c1
BLAKE2b-256 25e60859d7743cdabacd0ef567c32b421296cb498f2919c015c274f7c4aafaea

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytest_typing-26.1.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