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]