4 from Config import Config
9 tests_path = os.path.realpath(tests.__path__[0])
13 def __init__(self, globals, config = None, logging=None, verbose=None):
14 if config is None: self.config = Config()
15 else: self.config = Config(config)
17 test_files = self.test_files(self.tests_path)
19 # determine what is callable
20 for file in test_files:
21 tests = self.callables(file)
22 tests = filter(lambda t: t.test_name not in ['Test'], tests)
23 callables.update(tests)
25 # Add methods to self and global environemt
26 for method in callables:
27 if logging: method = log(method, method.test_name)
28 elif hasattr(self.config, 'log') and self.config.log:
29 method = log(method, method.test_name)
31 paths = method.test_name.split(".")
36 if not hasattr(self, first):
38 setattr(self, first, obj)
39 # Also add to global environment if specified
40 if globals is not None:
43 obj = getattr(self, first)
46 if not hasattr(obj, path):
48 setattr(obj, path, method)
49 globals[method.test_name]=obj
51 setattr(obj, path, Dummy())
52 obj = getattr(obj, path)
54 if globals is not None:
55 globals[method.test_name] = method
57 def test_files(self, tests_dir):
62 # Load files from tests direcotry
63 real_files = lambda name: not name.startswith('__init__') \
64 and name.endswith('.py')
65 remove_ext = lambda name: name.split(".py")[0]
66 iterator = os.walk(tests_dir)
67 (root, basenames, files) = iterator.next()
70 test_files.extend([test_base+file for file in map(remove_ext, filter(real_files, files))])
72 # recurse through directory
73 #for (root, dirs, files) in iterator:
74 # parts = root.split(os.sep)
75 # for basename in basenames:
76 # if basename in parts:
77 # test_base = ".".join(parts[parts.index(basename):])+"."
78 # files = filter(real_files, files)
79 # files = map(remove_ext, files)
80 # test_files.extend([test_base+file for file in files])
81 return list(set(test_files))
83 def callables(self, test_file):
85 Return a new instance of the specified method.
88 # Get new instance of method
89 parts = test_file.split(".")
90 # add every part except for the last to name (filename)
92 test_basename = ".".join(parts[:-1])
93 if test_basename: test_basename += '.'
94 test_path = tests_dir + test_file
96 test = __import__(test_path, globals(), locals(), test_path)
99 for attribute in dir(test):
100 attr = getattr(test, attribute)
101 if callable(attr) and hasattr(attr, 'status'):
102 setattr(attr, 'test_name', test_basename+attribute)
103 callables.append(attr(self.config))
105 except ImportError, AttributeError: