summaryrefslogtreecommitdiff
path: root/testlib.py
diff options
context:
space:
mode:
authorPierre-Yves David <pierre-yves.david@logilab.fr>2008-08-26 14:34:42 +0200
committerPierre-Yves David <pierre-yves.david@logilab.fr>2008-08-26 14:34:42 +0200
commitd4135a39a672ef17fbf5dc9c9b6eab99e492e26a (patch)
tree73c86920aab78608ea94cc05744e88f64d2f6a7f /testlib.py
parentd861299087e1ec9d9d6fd3ea254b3d549d6454e4 (diff)
downloadlogilab-common-d4135a39a672ef17fbf5dc9c9b6eab99e492e26a.tar.gz
allow by tag filtering
Diffstat (limited to 'testlib.py')
-rw-r--r--testlib.py47
1 files changed, 31 insertions, 16 deletions
diff --git a/testlib.py b/testlib.py
index 8433dcb..3b872e2 100644
--- a/testlib.py
+++ b/testlib.py
@@ -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)