Source code for hwt.pyUtils.testUtils
from itertools import product
[docs]class TestMatrix():
"""
Class which instance is a decorator which executes unittest.TestCase
test method with every combination of argumets
"""
[docs] def __init__(self, *args, **kwargs):
"""
:note: args, kwargs are lists of arguments which should be passed as a test
arguments
"""
self.args = args
kwargs = sorted(kwargs.items(), key=lambda x: x[0])
self.kwargs_keys = [x[0] for x in kwargs]
self.kwargs_values = [x[1] for x in kwargs]
self.test_arg_values = list(product(*args, *self.kwargs_values))
[docs] def split_args_kwargs(self, args):
kwargs_cnt = len(self.kwargs_keys)
if kwargs_cnt:
_args = args[:kwargs_cnt]
kwargs = {k: v for k, v in zip(
self.kwargs_keys, args[:kwargs_cnt])}
return _args, kwargs
else:
return args, {}
def __call__(self, test_fn):
test_matrix = self
def test_wrap(self):
for args in test_matrix.test_arg_values:
args, kwargs = test_matrix.split_args_kwargs(args)
try:
test_fn(self, *args, **kwargs)
except Exception as e:
# add note to an exception about which test arguments were
# used
# import traceback
# traceback.print_exc()
msg_buff = []
for a in args:
msg_buff.append(repr(a))
for k in test_matrix.kwargs_keys:
msg_buff.append("%s=%r" % (k, kwargs[k]))
raise Exception(
"Test failed %s" % (", ".join(msg_buff)), ) from e
return test_wrap