testutils

Utilities for writing tests.

class silx.utils.testutils.ParametricTestCase(methodName='runTest')[source]

TestCase with subTest support for Python < 3.4.

Add subTest method to support parametric tests. API is the same, but behavior differs: If a subTest fails, the following ones are not run.

subTest(*args, **kwds)[source]

Use as unittest.TestCase.subTest method in Python >= 3.4.

silx.utils.testutils.parameterize(test_case_class, *args, **kwargs)[source]

Create a suite containing all tests taken from the given subclass, passing them the parameters.

class TestParameterizedCase(unittest.TestCase):
    def __init__(self, methodName='runTest', foo=None):
        unittest.TestCase.__init__(self, methodName)
        self.foo = foo

def suite():
    testSuite = unittest.TestSuite()
    testSuite.addTest(parameterize(TestParameterizedCase, foo=10))
    testSuite.addTest(parameterize(TestParameterizedCase, foo=50))
    return testSuite
class silx.utils.testutils.TestLogging(logger=None, critical=None, error=None, warning=None, info=None, debug=None, notset=None)[source]

Context checking the number of logging messages from a specified Logger.

It disables propagation of logging message while running.

This is meant to be used as a with statement, for example:

>>> with TestLogging(logger, error=2, warning=0):
>>>     pass  # Run tests here expecting 2 ERROR and no WARNING from logger
...
Parameters:
  • logger (str or logging.Logger) – Name or instance of the logger to test. (Default: root logger)
  • critical (int) – Expected number of CRITICAL messages. Default: Do not check.
  • error (int) – Expected number of ERROR messages. Default: Do not check.
  • warning (int) – Expected number of WARNING messages. Default: Do not check.
  • info (int) – Expected number of INFO messages. Default: Do not check.
  • debug (int) – Expected number of DEBUG messages. Default: Do not check.
  • notset (int) – Expected number of NOTSET messages. Default: Do not check.
Raises:

RuntimeError – If the message counts are the expected ones.

emit(record)[source]

Override logging.Handler.emit()

silx.utils.testutils.test_logging(logger=None, critical=None, error=None, warning=None, info=None, debug=None, notset=None)[source]

Decorator checking number of logging messages.

Propagation of logging messages is disabled by this decorator.

In case the expected number of logging messages is not found, it raises a RuntimeError.

>>> class Test(unittest.TestCase):
...     @test_logging('module_logger_name', error=2, warning=0)
...     def test(self):
...         pass  # Test expecting 2 ERROR and 0 WARNING messages
Parameters:
  • logger (str or logging.Logger) – Name or instance of the logger to test. (Default: root logger)
  • critical (int) – Expected number of CRITICAL messages. Default: Do not check.
  • error (int) – Expected number of ERROR messages. Default: Do not check.
  • warning (int) – Expected number of WARNING messages. Default: Do not check.
  • info (int) – Expected number of INFO messages. Default: Do not check.
  • debug (int) – Expected number of DEBUG messages. Default: Do not check.
  • notset (int) – Expected number of NOTSET messages. Default: Do not check.
class silx.utils.testutils.EnsureImportError(name)[source]

This context manager allows to simulate the unavailability of a library, even if it is actually available. It ensures that an ImportError is raised if the code inside the context tries to import the module.

It can be used to test that a correct fallback library is used, or that the expected error code is returned.

Trivial example:

from silx.utils.testutils import EnsureImportError

with EnsureImportError("h5py"):
    try:
        import h5py
    except ImportError:
        print("Good")

Note

This context manager does not remove the library from the namespace, if it is already imported. It only ensures that any attempt to import it again will cause an ImportError to be raised.