You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
2.2 KiB
64 lines
2.2 KiB
4 months ago
|
# Written by Will Bond <will@wbond.net>
|
||
|
#
|
||
|
# The author or authors of this code dedicate any and all copyright interest in
|
||
|
# this code to the public domain. We make this dedication for the benefit of the
|
||
|
# public at large and to the detriment of our heirs and successors. We intend
|
||
|
# this dedication to be an overt act of relinquishment in perpetuity of all
|
||
|
# present and future rights to this code under copyright law.
|
||
|
|
||
|
|
||
|
def data(provider_method, first_param_name_suffix=False):
|
||
|
"""
|
||
|
A method decorator for unittest.TestCase classes that configured a
|
||
|
static method to be used to provide multiple sets of test data to a single
|
||
|
test
|
||
|
|
||
|
:param provider_method:
|
||
|
The name of the staticmethod of the class to use as the data provider
|
||
|
|
||
|
:param first_param_name_suffix:
|
||
|
If the first parameter for each set should be appended to the method
|
||
|
name to generate the name of the test. Otherwise integers are used.
|
||
|
|
||
|
:return:
|
||
|
The decorated function
|
||
|
"""
|
||
|
|
||
|
def test_func_decorator(test_func):
|
||
|
test_func._provider_method = provider_method
|
||
|
test_func._provider_name_suffix = first_param_name_suffix
|
||
|
return test_func
|
||
|
return test_func_decorator
|
||
|
|
||
|
|
||
|
def data_decorator(cls):
|
||
|
"""
|
||
|
A class decorator that works with the @provider decorator to generate test
|
||
|
method from a data provider
|
||
|
"""
|
||
|
|
||
|
def generate_test_func(name, original_function, num, params):
|
||
|
if original_function._provider_name_suffix:
|
||
|
data_name = params[0]
|
||
|
params = params[1:]
|
||
|
else:
|
||
|
data_name = num
|
||
|
expanded_name = 'test_%s_%s' % (name, data_name)
|
||
|
|
||
|
# We used expanded variable names here since this line is present in
|
||
|
# backtraces that are generated from test failures.
|
||
|
def generated_test_function(self):
|
||
|
original_function(self, *params)
|
||
|
|
||
|
setattr(cls, expanded_name, generated_test_function)
|
||
|
|
||
|
for name in dir(cls):
|
||
|
func = getattr(cls, name)
|
||
|
if hasattr(func, '_provider_method'):
|
||
|
num = 1
|
||
|
for params in getattr(cls, func._provider_method)():
|
||
|
generate_test_func(name, func, num, params)
|
||
|
num += 1
|
||
|
|
||
|
return cls
|