Skip to main content

Jticker core

Project description

pytest-automock

Travis status for master branch Codecov coverage for master branch Pypi version Pypi downloads count

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
  • Black and white lists for attributes
  • 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.7+

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,
             allowed_methods: Optional[Sequence[str]] = None,
             forbidden_methods: Optional[Sequence[str]] = 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 mocks
  • override_name: forced mock-file name
  • unlocked: mode selector (if omited, selected by --automock-unlocked)
  • allowed_methods: sequence of allowed to mock attributes
  • forbidden_methods: sequnce of forbidden to mock attributes
  • encode: encode routine
  • decode: 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,
             allowed_methods: Optional[Sequence[str]] = None,
             forbidden_methods: Optional[Sequence[str]] = None)
  • factory: object/function to wrap
  • memory: dicrionary to get/put mocks
  • locked: mode selector
  • allowed_methods: sequence of allowed to mock attributes
  • forbidden_methods: sequnce of forbidden to mock attributes

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


Download files

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

Source Distribution

pytest-automock-0.2.0.tar.gz (12.4 kB view details)

Uploaded Source

Built Distribution

pytest_automock-0.2.0-py3-none-any.whl (5.9 kB view details)

Uploaded Python 3

File details

Details for the file pytest-automock-0.2.0.tar.gz.

File metadata

  • Download URL: pytest-automock-0.2.0.tar.gz
  • Upload date:
  • Size: 12.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.20.1 setuptools/40.6.3 requests-toolbelt/0.8.0 tqdm/4.36.1 CPython/3.7.2

File hashes

Hashes for pytest-automock-0.2.0.tar.gz
Algorithm Hash digest
SHA256 cc2abd5ff4a45aecb8c3c38d18b47dcc58ae05f7bb852dd7573225e5c0c97e70
MD5 8db98da1df89c21d3089422d67fc5c24
BLAKE2b-256 10c4581abcdddac7225ff0dbf65fb474e29a69ac2ed13b504e16c6527cf2101e

See more details on using hashes here.

File details

Details for the file pytest_automock-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: pytest_automock-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 5.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.20.1 setuptools/40.6.3 requests-toolbelt/0.8.0 tqdm/4.36.1 CPython/3.7.2

File hashes

Hashes for pytest_automock-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 983664b0a04ee74d7d3256be3b15b088aa864b606c2ab06806c9525913625413
MD5 c8afc6c57e9dbaf86611d40ec7743d8a
BLAKE2b-256 7acb0026662458cb6ba3b45b0179863393016d8b8a5345a5ef6bb1e72e02d7c3

See more details on using hashes here.

Supported by

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