Skip to main content

Templates for testing with strings

Project description

License PyPI CI pre-commit.ci status CodeQL codecov.io readthedocs.org python3.8 Black pylint

Templates for testing with strings

Designed with pytest.mark.parametrize in mind

Work with subclasses inheriting from the templatest.BaseTemplate abstract base class

To use the inherited class decorate it with templatest.templates.register and ensure the module it is in is imported at runtime

As there will be no need to import anything from this module related to this package, this can be ensured by placing it in tests/__init__.py

>>> # tests/__init__.py
>>>
>>> import templatest
>>>
>>> @templatest.templates.register
... class _ExampleTemplate(templatest.BaseTemplate):
...     @property
...     def template(self) -> str:
...         return "Hello, world"
...
...     @property
...     def expected(self) -> str:
...         return "Expected result"

The class’s properties will then be available in the templatest.templates.registered object as an instance of templatest.Template named tuple

>>> templatest.templates.registered
<Registered [Template(name='example-template', template='Hello, world', expected='Expected result')]>

Organise tests by prefixing subclasses for common tests

>>> # tests/__init__.py
>>>
>>> @templatest.templates.register
... class _ErrExampleTemplate(templatest.BaseTemplate):
...
...     @property
...     def template(self) -> str:
...         return "Goodbye, world..."
...
...     @property
...     def expected(self) -> str:
...         return "Goodbye, world..."
>>>
>>> templatest.templates.registered.getids()
('example-template', 'err-example-template')
>>>
>>> templatest.templates.registered.filtergroup('err').getids()
('example-template',)
>>>
>>> templatest.templates.registered.getgroup('err').getids()
('err-example-template',)

Registered.filtergroup can be chained, but this won’t work for Registered.getgroup

More succinctly, multiple prefixes can be used

>>> # tests/__init__.py
>>>
>>> @templatest.templates.register
... class _MultiExampleTemplate(templatest.BaseTemplate):
...
...     @property
...     def template(self) -> str:
...         return "Hello world, and goodbye world..."
...
...     @property
...     def expected(self) -> str:
...         return "Hello world, and goodbye world..."
>>>
>>> templatest.templates.registered.filtergroup('err').filtergroup('multi').getids()
('example-template',)
>>>
>>> templatest.templates.registered.getgroup('err').getgroup('multi').getids()
()
>>>
>>> templatest.templates.registered.filtergroup('err', 'multi').getids()
('example-template',)
>>>
>>> templatest.templates.registered.getgroup('err', 'multi').getids()
('err-example-template', 'multi-example-template')

Additionally, templates can be referenced by index

>>> templatest.templates.registered.getindex('example-template')
0
>>> templatest.templates.registered.getindex('err-example-template')
1
>>> registered = templatest.templates.registered[0]
>>> registered.name
'example-template'
>>> registered.template
'Hello, world'
>>> registered.expected
'Expected result'
>>> name, template, expected = templatest.templates.registered[1]
>>> name
'err-example-template'
>>> template
'Goodbye, world...'
>>> expected
'Goodbye, world...'

And a template can be returned by name

>>> templatest.templates.registered.getbyname('example-template')
Template(name='example-template', template='Hello, world', expected='Expected result')
>>> templatest.templates.registered.getbyname('err-example-template')
Template(name='err-example-template', template='Goodbye, world...', expected='Goodbye, world...')

Example usage with a parametrized test

>>> # tests/_test.py
>>>
>>> import pytest
>>>
>>> from templatest.templates import registered as r
>>>
>>> @pytest.mark.parametrize("n,t,e", r, ids=r.getids())
... def test_example_all(n: str, t: str, e: str) -> None: ...
>>>
>>> @pytest.mark.parametrize("n,t,e", r.filtergroup('err'), ids=r.filtergroup('err').getids())
... def test_example_no_errs(n: str, t: str, e: str) -> None: ...
>>>
>>> @pytest.mark.parametrize("n,t,e", r.getgroup('err'), ids=r.getgroup('err').getids())
... def test_example_errs(n: str, t: str, e: str) -> None:
...     with pytest.raises(Exception) as err:
...         raise Exception(e)
...
...     assert str(err.value) == e

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

templatest-0.8.0.tar.gz (9.4 kB view details)

Uploaded Source

Built Distribution

templatest-0.8.0-py3-none-any.whl (9.0 kB view details)

Uploaded Python 3

File details

Details for the file templatest-0.8.0.tar.gz.

File metadata

  • Download URL: templatest-0.8.0.tar.gz
  • Upload date:
  • Size: 9.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.2.1 CPython/3.8.13 Darwin/22.2.0

File hashes

Hashes for templatest-0.8.0.tar.gz
Algorithm Hash digest
SHA256 c808360bf0791cc5629f6baf8002f48159c11bd18f6b53096cc089ceada91dd2
MD5 cff9e190a09d55439c09a8df91b28fd6
BLAKE2b-256 c376806dac575721907d19ff9196fe9ff8a011b6d0338bfea7dbe58a0fdf0171

See more details on using hashes here.

File details

Details for the file templatest-0.8.0-py3-none-any.whl.

File metadata

  • Download URL: templatest-0.8.0-py3-none-any.whl
  • Upload date:
  • Size: 9.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.2.1 CPython/3.8.13 Darwin/22.2.0

File hashes

Hashes for templatest-0.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 aa9c3b918915f57f1751bdf961b06577630e2c741b8f207ff5f985def64750b0
MD5 3bdcd68cbf2b26de5659080a3a212651
BLAKE2b-256 2752bd5005ca191f59cc4c54891ee0d1f5f599a786d6764dcce777b26463d5e3

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