1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
from inspect import getmembers
class TestChooser:
def __init__(self):
self.new_module()
def new_module(self):
"""Tells TestChooser that a new module has been entered"""
self.done = {}
def already_visited(self, kls, name):
"""Determine if a method has already been accepted for this module"""
key = f"{kls}.{name}"
if key not in self.done:
self.done[key] = True
return False
else:
return True
def consider(self, method):
"""
Determines whether a method should be considered a Test
Returns False if it believes it isn't a test
Will return True otherwise
"""
if method.__name__.startswith("ignore__"):
# Method wants to be ignored
return False
if hasattr(method, "__test__") and not method.__test__:
# Method doesn't want to be tested
return False
kls = None
print(method)
if getattr(method, "__self__"):
kls = method.__self__.__class__
if not kls:
# im_class seems to be None in pypy
for k, v in getmembers(method):
if k == "im_self" and v:
kls = v.__class__
break
elif k == "im_class" and v:
kls = v
break
if not hasattr(kls, "is_noy_spec"):
# Kls not a noy_spec, we don't care if it runs or not
return None
if kls.__dict__.get("__only_run_tests_in_children__"):
# Only run these tests in the children, not in this class itself
return False
method_in_kls = method.__name__ in kls.__dict__
method_is_test = method.__name__.startswith("test_")
method_passed_down = any(
method.__name__ in superkls.__dict__
and getattr(superkls, "__only_run_tests_in_children__", False)
for superkls in kls.__bases__
)
if (method_passed_down or method_in_kls) and method_is_test:
if not self.already_visited(kls.__name__, method.__name__):
return True
# Is a noy_spec method but not a valid test, refuse it
return False
|