Pytest plugin for automatical mocks creation
Project description
pytest-automock
Reason
- No generic automock solution
Features
- Pytest plugin
- Autogenerate/autouse mocks for functions and objects
- Sync and async support
- Locked mode to be sure mocked objects stay untouched
- Customizable serialization
Limitaions
- No support for dunder methods (can be partly solved in future)
- No support for sync/async generators/contexts
- Races will break tests, since order counts
License
pytest-automock
is offered under MIT license.
Requirements
- python 3.6+
Usage
Lets say you have some module mymod.py
:
import time
class Network:
def get_data_from_network(self, x, y):
time.sleep(1)
return x + y
def send_data_to_network(self, value):
time.sleep(1)
def logic(x):
n = Network()
a, b = 0, 1
while b < x:
c = n.get_data_from_network(a, b)
a, b = b, c
n.send_data_to_network("ok")
return b
And you want to create mocks for your Network
class (since testing time and sane counts), but you are too lazy to write them... conftest.py
:
import pytest
import mymod
@pytest.fixture(autouse=True)
def _mocks(automock):
with automock((mymod, "Network")):
yield
test_logic.py
:
from mymod import logic
def test_logic():
assert logic(7) == 8
assert logic(10) == 13
If you run pytest
on this setup, then you will see fail:
$ pytest -x
...
E RuntimeError: Mock is locked, but '__init__' wanted
automock
can work in two modes: locked and unlocked. Locked mode is default, real methods calls of mocked objects are
not allowed in this mode. So, above error says that we can't call __init__
of our Network
.
In locked mode there is no mock-files update also.
To allow real calls and mocks generation automock
provides extra cli argument to pytest
: --automock-unlocked
$ pytest -x --automock-unlocked
...
test_logic.py .
...
1 passed in 22.09s
After that you can see that tests/mocks/test_logic/mymod/Network
file was created. This is mock for your test sequence.
Now you can rerun tests and see what happens (you can omit --automock-unlocked
key for ensurance, that real object
will not be touched (actually even created)).
$ pytest -x
...
test_logic.py .
...
1 passed in 0.04s
API
automock
(fixture)
automock
fixture is a context manager
def automock(*pairs,
storage: Union[str, Path] = "tests/mocks",
override_name: Optional[str] = None,
unlocked: Optional[bool] = None,
encode: Callable[[Any], bytes] = pickle.dumps,
decode: Callable[[bytes], Any] = pickle.loads)
*pairs
: pair/tuple of object/module and attribute name (str
)storage
: root path for storing mocksoverride_name
: forced mock-file nameunlocked
: mode selector (if omited, selected by--automock-unlocked
)encode
: encode routinedecode
: decode routine
automock_unlocked
(fixture)
Fixture with default mode from cli parameter (bool
).
automock
(function)
automock
function is not supposed to be used by anyone but automock
fixture
def automock(factory: Callable, *,
memory: Dict,
locked: bool = True,
encode: Callable[[Any], bytes] = pickle.dumps,
decode: Callable[[bytes], Any] = pickle.loads):
factory
: object/function to wrapmemory
: dicrionary to get/put mockslocked
: mode selectorencode
: encode routinedecode
: decode routine
Development
Run tests
Since coverage issue/feature, plugins coverage is broken by default. Workaround:
COV_CORE_SOURCE=pytest_automock COV_CORE_CONFIG=.coveragerc COV_CORE_DATAFILE=.coverage.eager pytest
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-automock-0.5.0.tar.gz
.
File metadata
- Download URL: pytest-automock-0.5.0.tar.gz
- Upload date:
- Size: 20.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.6.0 requests-toolbelt/0.9.1 tqdm/4.38.0 CPython/3.6.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 00d35c3cd2c2637c8f4966a56aa622e5c4007eb5794ad7a60bf3d5ae067f523b |
|
MD5 | 6164bb31fb6e5ae1239fa31631cfe230 |
|
BLAKE2b-256 | 29031b940376e6a487785999b9a7e717abe5b41386032febdb9e788a4ce69ebe |
File details
Details for the file pytest_automock-0.5.0-py3-none-any.whl
.
File metadata
- Download URL: pytest_automock-0.5.0-py3-none-any.whl
- Upload date:
- Size: 5.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.6.0 requests-toolbelt/0.9.1 tqdm/4.38.0 CPython/3.6.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 12bd129305cf0e66ac74dcfbef560178a91aca363786d36e2104719c676fdfd8 |
|
MD5 | d18d728aaad7c2098fe8034555fcc4d5 |
|
BLAKE2b-256 | 37d0d34611531de7f946c59f484eae6f790c3f49c1f1c366e11de528c6c10d54 |