diff options
author | Pierre-Yves David <pierre-yves.david@logilab.fr> | 2008-08-26 14:34:42 +0200 |
---|---|---|
committer | Pierre-Yves David <pierre-yves.david@logilab.fr> | 2008-08-26 14:34:42 +0200 |
commit | d4135a39a672ef17fbf5dc9c9b6eab99e492e26a (patch) | |
tree | 73c86920aab78608ea94cc05744e88f64d2f6a7f /testlib.py | |
parent | d861299087e1ec9d9d6fd3ea254b3d549d6454e4 (diff) | |
download | logilab-common-d4135a39a672ef17fbf5dc9c9b6eab99e492e26a.tar.gz |
allow by tag filtering
Diffstat (limited to 'testlib.py')
-rw-r--r-- | testlib.py | 47 |
1 files changed, 31 insertions, 16 deletions
@@ -490,19 +490,32 @@ class SkipAwareTextTestRunner(unittest.TextTestRunner): testname = '%s.%s' % (test.im_class.__name__, func.__name__) else: return True # Not sure when this happens + if is_generator(func) and skipgenerator: - return True # Let inner tests decide at run time + return self.does_match_tags(func) # Let inner tests decide at run time + # print 'testname', testname, self.test_pattern if self._this_is_skipped(testname): return False # this was explicitly skipped - if self.test_pattern is None: - return True # no pattern - try: - classpattern, testpattern = self.test_pattern.split('.') - klass, name = testname.split('.') - return classpattern in klass and testpattern in name - except ValueError: - return self.test_pattern in testname + if self.test_pattern is not None: + try: + classpattern, testpattern = self.test_pattern.split('.') + klass, name = testname.split('.') + if classpattern not in klass or testpattern not in name: + return False + except ValueError: + if self.test_pattern not in testname: + return False + + return self.does_match_tags(test) + + def does_match_tags(self, test): + if self.options is not None: + tags_pattern = getattr(self.options, 'tags_pattern', None) + if tags_pattern is not None: + tags = getattr(test, 'tags', Tags()) + return tags.match(tags_pattern) + return True # no pattern def _makeResult(self): return SkipAwareTestResult(self.stream, self.descriptions, @@ -678,6 +691,8 @@ Options: -s, --skip skip test matching this pattern (no regexp for now) -q, --quiet Minimal output + -m, --match Run only test whose tag match this pattern + Examples: %(progName)s - run default set of tests %(progName)s MyTestSuite - run suite 'MyTestSuite' @@ -702,12 +717,13 @@ Examples: self.printonly = None self.skipped_patterns = [] self.test_pattern = None + self.tags_pattern = None import getopt try: - options, args = getopt.getopt(argv[1:], 'hHvixqcp:s:', + options, args = getopt.getopt(argv[1:], 'hHvixqcp:s:m:', ['help', 'verbose', 'quiet', 'pdb', 'exitfirst', 'capture', 'printonly=', - 'skip=']) + 'skip=', 'match=']) for opt, value in options: if opt in ('-h', '-H', '--help'): self.usageExit() @@ -726,6 +742,9 @@ Examples: if opt in ('-s', '--skip'): self.skipped_patterns = [pat.strip() for pat in value.split(', ')] + if opt in ('-m', '--match'): + #self.tags_pattern = value + self.options["tag_pattern"] = value self.testLoader.skipped_patterns = self.skipped_patterns if self.printonly is not None: self.capture += 1 @@ -1717,14 +1736,10 @@ def tag(*args): return func return desc - - class Tags(set): - + """A set of tag able validate an expression""" def __getitem__(self, key): return key in self - - def match(self, exp): return eval(exp, {}, self) |