Skip to main content

Dynamic resource-based unittest suites made easy.

Project description

unittest-resources

Dynamic resource-based unittest suites made easy.

Usage

First and foremost, add this package as a project dependency on your setup.py.

from setuptools import setup

setup(
    name='mymodule',
    # ...
    test_suite='tests',
    tests_require=['unittest-resources'],
    #...
    )

That said, this module can be used in three ways:

And then you can run your tests as usual.

python setup.py test

Remember you still have to include your testing dependencies by yourself (like pycodestyle, pydocstyle, mypy or radon) even if they're used only through this package.

Other option, if you feel comfortable about installing all unittest-resources optional dependencies (ie. especially if you're using all classes defined on unittest_resources.testing), is to specify unittest-resources[testing] as dependency.

Using unittest_resources.ResourceTestCase base class

With unittest_resources.ResourceTestCase your base (replacing unittest.TestCase).

import unittest_resources


class MyTestCase(unittest_resources.ResourceTestCase):
    """
    TestCase class with tests autogenerated based on resources.

    This regular :class:`unittest.TestCase`-derived class generates
    test methods by recursively inspecting a module for resources,
    based on special class attributes (prefixed by `meta_`).

    The following functions from :module:`importlib.resources` are
    available as :class:`staticmethod`s:
    - :func:`importlib.resources.contents` as `contents`
    - :func:`importlib.resources.is_resource` as `is_resource`
    - :func:`importlib.resources.open_binary` as `open_binary`
    - :func:`importlib.resources.open_text` as `open_text`
    - :func:`importlib.resources.path` as `path`
    - :func:`importlib.resources.read_binary` as `read_binary`
    - :func:`importlib.resources.read_text` as `read_text`
    """

    meta_module = 'mymodule'
    meta_prefix = 'mytest_'
    meta_resource_pattern = re.compile(r'\.test_file')

    def meta_test(self, module, resource):
        # type: (str, str) -> None
        """
        Function will be called with every resource found.

        This function received resource-containing module name, and the
        resource name itself.

        :param module: resource-containing module name
        :type module: str
        :param resource: resource name (usually a filename)
        :type resource: str
        """
        with self.path(module, resource) as path:
            self.assertPathStuff(str(path))

        with self.open_text(module, encoding='utf-8') as f:
            self.assertTextFileStuff(f)

        with self.open_binary(module) as f:
            self.assertBytesFileStuff(f)

        text = self.read_text(module, resource)
        self.assertTextStuff(text)

        data = self.read_binary(module, resource)
        self.assertBytesStuff(text)

Using unittest_resources.ResourceTestMeta metaclass

Or, alternatively, using the provided metaclass.

import unittest
import unittest_resources


class MyTestCase(unittest.TestCase,
                 metaclass=unittest_resources.ResourceTestMeta):
    """
    TestCase class with tests autogenerated based on resources.

    This regular :class:`unittest.TestCase`-derived class generates
    test methods by recursively inspecting a module for resources,
    based on special class attributes (prefixed by `meta_`).

    The following functions from :module:`importlib.resources` are
    available as :class:`staticmethod`s:
    - :func:`importlib.resources.contents` as `contents`
    - :func:`importlib.resources.is_resource` as `is_resource`
    - :func:`importlib.resources.open_binary` as `open_binary`
    - :func:`importlib.resources.open_text` as `open_text`
    - :func:`importlib.resources.path` as `path`
    - :func:`importlib.resources.read_binary` as `read_binary`
    - :func:`importlib.resources.read_text` as `read_text`
    """

    meta_module = 'mymodule'
    meta_prefix = 'mytest_'
    meta_resource_pattern = re.compile(r'\.test_file')

    def meta_test(self, module, resource):
        # type: (str, str) -> None
        """
        Function will be called with every resource found.

        This function received resource-containing module name, and the
        resource name itself.

        :param module: resource-containing module name
        :type module: str
        :param resource: resource name (usually a filename)
        :type resource: str
        """
        with self.path(module, resource) as path:
            self.assertPathStuff(str(path))

        with self.open_text(module, encoding='utf-8') as f:
            self.assertTextFileStuff(f)

        with self.open_binary(module) as f:
            self.assertBytesFileStuff(f)

        text = self.read_text(module, resource)
        self.assertTextStuff(text)

        data = self.read_binary(module, resource)
        self.assertBytesStuff(text)

Using unittest_resources.testing tool integrations

This package provides ready-to-use integrations of some common libraries

import unittest
import unittest_resources.testing


class TestCodeStyle(unittest_resources.testing.CodeStyleTestCase):
    """
    This TestCase class applies pycodestyle to each python file located
    inside a python module.
    """

    meta_module = 'mymodule'

Refer to unittest_resources.testing module itself to see the available classes and unittest_resources.tests.test_code to see how to use them.

Examples

This package own test suite is self-explanatory, and covers covers the usage of this module to run pycodestyle, pydocstyle, mypy and radon over project code.

You can either subclass and customize them to run on your code, or use them as an example to integrate other tools.

License

MIT (see LICENSE file).

Changelog

See CHANGELOG file.

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

unittest-resources-0.1.1.tar.gz (10.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

unittest_resources-0.1.1-py2.py3-none-any.whl (12.3 kB view details)

Uploaded Python 2Python 3

File details

Details for the file unittest-resources-0.1.1.tar.gz.

File metadata

  • Download URL: unittest-resources-0.1.1.tar.gz
  • Upload date:
  • Size: 10.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.7.4

File hashes

Hashes for unittest-resources-0.1.1.tar.gz
Algorithm Hash digest
SHA256 33f547bec9d12411f752f3df4fef9f23523d7319c05bde4595689e3b6d1568ab
MD5 f88d3421a71ad2e14f710e4373da9c8e
BLAKE2b-256 01c1e2c8b1452be85b624aba5ed6c832139b8fa864703c09ba64045eca51b0bb

See more details on using hashes here.

File details

Details for the file unittest_resources-0.1.1-py2.py3-none-any.whl.

File metadata

  • Download URL: unittest_resources-0.1.1-py2.py3-none-any.whl
  • Upload date:
  • Size: 12.3 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.7.4

File hashes

Hashes for unittest_resources-0.1.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 0f0c149e8e2a572d55d7e6c4a5663708d5b2ee3e54755aeedda07f5e417d3222
MD5 662acfa40c5584b2cb20745465f74f09
BLAKE2b-256 3a215ceead80a379ee5eba7e13324f06caa52bb1d0157fd99261e7d7fd0ce25f

See more details on using hashes here.

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