@@ -945,6 +945,31 @@ def check_sizeof(test, o, size):
945945 % (type (o ), result , size )
946946 test .assertEqual (result , size , msg )
947947
948+ def subTests (arg_names , arg_values , / , * , _do_cleanups = False ):
949+ """Run multiple subtests with different parameters.
950+ """
951+ single_param = False
952+ if isinstance (arg_names , str ):
953+ arg_names = arg_names .replace (',' ,' ' ).split ()
954+ if len (arg_names ) == 1 :
955+ single_param = True
956+ arg_values = tuple (arg_values )
957+ def decorator (func ):
958+ if isinstance (func , type ):
959+ raise TypeError ('subTests() can only decorate methods, not classes' )
960+ @functools .wraps (func )
961+ def wrapper (self , / , * args , ** kwargs ):
962+ for values in arg_values :
963+ if single_param :
964+ values = (values ,)
965+ subtest_kwargs = dict (zip (arg_names , values ))
966+ with self .subTest (** subtest_kwargs ):
967+ func (self , * args , ** kwargs , ** subtest_kwargs )
968+ if _do_cleanups :
969+ self .doCleanups ()
970+ return wrapper
971+ return decorator
972+
948973#=======================================================================
949974# Decorator/context manager for running a code in a different locale,
950975# correctly resetting it afterwards.
0 commit comments