pytest plugin for writing tests for mypy plugins
Project description
pytest plugin for testing mypy types, stubs, and plugins
Installation
pip install pytest-mypy-plugins
Usage
Running
Plugin, after installation, is automatically picked up by pytest
therefore it is sufficient to
just execute:
pytest
Paths
The PYTHONPATH
and MYPYPATH
environment variables, if set, are passed to mypy
on invocation.
This may be helpful if you are testing a local plugin and need to provide an import path to it.
Be aware that when mypy
is run in a subprocess (the default) the test cases are run in temporary working directories
where relative paths such as PYTHONPATH=./my_plugin
do not reference the directory which you are running pytest
from.
If you encounter this, consider invoking pytest
with --mypy-same-process
or make your paths absolute,
e.g. PYTHONPATH=$(pwd)/my_plugin pytest
.
You can also specify PYTHONPATH
, MYPYPATH
, or any other environment variable in env:
section of yml
spec:
- case: mypy_path_from_env
main: |
from pair import Pair
instance: Pair
reveal_type(instance) # N: Revealed type is 'pair.Pair'
env:
- MYPYPATH=./pytest_mypy_plugins/tests/fixtures
What is a test case?
In general each test case is just an element in an array written in a properly formatted YAML
file.
On top of that, each case must comply to following types:
Property | Type | Description |
---|---|---|
case |
str |
Name of the test case, complies to [a-zA-Z0-9] pattern |
main |
str |
Portion of the code as if written in .py file |
files |
Optional[List[File]]=[] * |
List of extra files to simulate imports if needed |
disable_cache |
Optional[bool]=False |
Set to true disables mypy caching |
mypy_config |
Optional[Dict[str, Union[str, int, bool, float]]]={} |
Inline mypy configuration, passed directly to mypy as --config-file option |
env |
Optional[Dict[str, str]]={} |
Environmental variables to be provided inside of test run |
parametrized |
Optional[List[Parameter]]=[] * |
List of parameters, similar to @pytest.mark.parametrize |
skip |
str |
Expression evaluated with following globals set: sys , os , pytest and platform |
Appendix to pseudo types used above:
class File:
path: str
content: Optional[str] = None
Parameter = Mapping[str, Any]
Implementation notes:
main
must be non-empty string that evaluates to valid Python code,content
of each of extra files must evaluate to valid Python code,parametrized
entries must all be the objects of the same type. It simply means that each entry must have exact same set of keys,skip
- an expression set inskip
is passed directly intoeval
. It is advised to take a peek and learn about howeval
works.
Example
1. Inline type expectations
# typesafety/test_request.yml
- case: request_object_has_user_of_type_auth_user_model
main: |
from django.http.request import HttpRequest
reveal_type(HttpRequest().user) # N: Revealed type is 'myapp.models.MyUser'
# check that other fields work ok
reveal_type(HttpRequest().method) # N: Revealed type is 'Union[builtins.str, None]'
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
pass
2. @parametrized
- case: with_params
parametrized:
- val: 1
rt: builtins.int
- val: 1.0
rt: builtins.float
main: |
reveal_type({[ val }}) # N: Revealed type is '{{ rt }}'
3. Longer type expectations
- case: with_out
main: |
reveal_type('str')
out: |
main:1: note: Revealed type is 'builtins.str'
Options
mypy-tests:
--mypy-testing-base=MYPY_TESTING_BASE
Base directory for tests to use
--mypy-ini-file=MYPY_INI_FILE
Which .ini file to use as a default config for tests
--mypy-same-process
Now, to help with various issues in django-stubs, it runs every single test in the subprocess mypy call.
Some debuggers cannot attach to subprocess, so enable this flag to make mypy check happen in the same process.
(Could cause cache issues)
Further reading
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file pytest-mypy-plugins-1.6.1.tar.gz
.
File metadata
- Download URL: pytest-mypy-plugins-1.6.1.tar.gz
- Upload date:
- Size: 15.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.7.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f73986d4d78057f259518b81b019896985b19a698ce41deb6996ec73c3d7fcc6 |
|
MD5 | 1a6d05d0bbbe3b0cbd51f4b35f75b90e |
|
BLAKE2b-256 | c0751b595cfda6fe84281b0f9037ddf5f7d0710a72da75a753e34233f7465b62 |
File details
Details for the file pytest_mypy_plugins-1.6.1-py3-none-any.whl
.
File metadata
- Download URL: pytest_mypy_plugins-1.6.1-py3-none-any.whl
- Upload date:
- Size: 14.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.7.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b7f9c736f498a520c42ab393069b6e272036c2e4409d777403566e353743d603 |
|
MD5 | 293203102a606cc80c211015a7ffc9fe |
|
BLAKE2b-256 | a786c931cd15f1b3942cea6d374719cdf2b1bb0ff3a3b70bfd27cb311ea15c26 |