I cut every corner I could. Some methods are not random, but this can be easily fixed.
There is a runner decorator (dependent on the decorator library) than run’s test methods repeatedly.
import random def oneof(*values): return random.choice(values) def optional(param): return oneof(None, param) def boolean(): return oneof(True, False) def integer(min=0,max=1<<30): return random.randint(min,max) def char(): return chr(integer(min=2,max=ord('z'))) def string(min=0): return "".join([char() for _ in xrange(integer(min=min, max=10))]) def nonempty_string(): return string(min=1) def substring(string): if not string: return string start = integer(0, len(string) - 1) end = start + integer(len(string) - start) return string[start:end] def date(): return datetime.date.today() def subset(*vs): return [e for e in vs if boolean()] def list(gen): return [gen() for _ in xrange(integer(max=5))] @decorator def runner(func, *args, **kwargs): for r in xrange(4): test_instance = args[0]