diff options
author | Jelmer Vernooij <jelmer@jelmer.uk> | 2018-03-24 14:22:44 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-24 14:22:44 +0000 |
commit | 94397173c7ecc65951afa52ce15120b7bfbd3374 (patch) | |
tree | 9ce9503d65ca863d9dd4dcd91d1ab72beb9fda9e | |
parent | 9a80eb9adba9d5e43776658801e2fe1ccdb04f5c (diff) | |
parent | bb00b29f4778650bc484912f6198f19832b1b1ac (diff) | |
download | subunit-git-94397173c7ecc65951afa52ce15120b7bfbd3374.tar.gz |
Merge pull request #29 from jelmer/rename-test-ids1.3.0
Add support for passing in a regex to rename test ids.
-rw-r--r-- | NEWS | 6 | ||||
-rwxr-xr-x | filters/subunit-filter | 14 | ||||
-rw-r--r-- | python/subunit/test_results.py | 17 | ||||
-rw-r--r-- | python/subunit/tests/test_subunit_filter.py | 16 |
4 files changed, 51 insertions, 2 deletions
@@ -8,6 +8,12 @@ NEXT (In development) 1.3.0 ----- +IMPROVEMENTS +~~~~~~~~~~~~ + +* Add a --rename flag to subunit-filter. + (Jelmer Vernooij, #1758522) + BUGFIXES ~~~~~~~~ diff --git a/filters/subunit-filter b/filters/subunit-filter index ef4afd9..7314531 100755 --- a/filters/subunit-filter +++ b/filters/subunit-filter @@ -91,6 +91,9 @@ def make_options(description): parser.add_option("-F", "--only-genuine-failures", action="callback", callback=only_genuine_failures_callback, help="Only pass through failures and exceptions.") + parser.add_option("--rename", action="append", nargs=2, + help="Apply specified regex subsitutions to test names.", + dest="renames", default=[]) return parser @@ -125,6 +128,14 @@ def _make_regexp_filter(with_regexps, without_regexps): return check_regexps +def _compile_rename(patterns): + def rename(name): + for (from_pattern, to_pattern) in patterns: + name = re.sub(from_pattern, to_pattern, name) + return name + return rename + + def _make_result(output, options, predicate): """Make the result that we'll send the test outcomes to.""" fixup_expected_failures = set() @@ -139,7 +150,8 @@ def _make_result(output, options, predicate): filter_skip=options.skip, filter_xfail=options.xfail, filter_predicate=predicate, - fixup_expected_failures=fixup_expected_failures)) + fixup_expected_failures=fixup_expected_failures, + rename=_compile_rename(options.renames))) def main(): diff --git a/python/subunit/test_results.py b/python/subunit/test_results.py index b3ca968..53c3dad 100644 --- a/python/subunit/test_results.py +++ b/python/subunit/test_results.py @@ -25,6 +25,7 @@ from testtools.content import ( TracebackContent, ) from testtools import StreamResult +from testtools.testcase import PlaceHolder from subunit import iso8601 import subunit @@ -450,7 +451,8 @@ class TestResultFilter(TestResultDecorator): def __init__(self, result, filter_error=False, filter_failure=False, filter_success=True, filter_skip=False, filter_xfail=False, - filter_predicate=None, fixup_expected_failures=None): + filter_predicate=None, fixup_expected_failures=None, + rename=None): """Create a FilterResult object filtering to result. :param filter_error: Filter out errors. @@ -467,6 +469,7 @@ class TestResultFilter(TestResultDecorator): parameter for efficiency. :param fixup_expected_failures: Set of test ids to consider known failing. + :param rename: Optional function to rename test ids """ predicates = [] if filter_error: @@ -500,8 +503,10 @@ class TestResultFilter(TestResultDecorator): self._fixup_expected_failures = frozenset() else: self._fixup_expected_failures = fixup_expected_failures + self._rename_fn = rename def addError(self, test, err=None, details=None): + test = self._apply_renames(test) if self._failure_expected(test): self.addExpectedFailure(test, err=err, details=details) else: @@ -509,6 +514,7 @@ class TestResultFilter(TestResultDecorator): test, err=err, details=details) def addFailure(self, test, err=None, details=None): + test = self._apply_renames(test) if self._failure_expected(test): self.addExpectedFailure(test, err=err, details=details) else: @@ -516,6 +522,7 @@ class TestResultFilter(TestResultDecorator): test, err=err, details=details) def addSuccess(self, test, details=None): + test = self._apply_renames(test) if self._failure_expected(test): self.addUnexpectedSuccess(test, details=details) else: @@ -524,6 +531,14 @@ class TestResultFilter(TestResultDecorator): def _failure_expected(self, test): return (test.id() in self._fixup_expected_failures) + def _apply_renames(self, test): + if self._rename_fn is None: + return test + new_id = self._rename_fn(test.id()) + # TODO(jelmer): Isn't there a cleaner way of doing this? + setattr(test, "id", lambda: new_id) + return test + class TestIdPrintingResult(testtools.TestResult): """Print test ids to a stream. diff --git a/python/subunit/tests/test_subunit_filter.py b/python/subunit/tests/test_subunit_filter.py index 5f34b3b..95aea36 100644 --- a/python/subunit/tests/test_subunit_filter.py +++ b/python/subunit/tests/test_subunit_filter.py @@ -280,6 +280,22 @@ xfail todo ('addSkip', foo, {}), ('stopTest', foo), ], result._events) + def test_renames(self): + def rename(name): + return name + " - renamed" + result = ExtendedTestResult() + result_filter = TestResultFilter( + result, filter_success=False, rename=rename) + input_stream = _b( + "test: foo\n" + "successful: foo\n") + self.run_tests(result_filter, input_stream) + self.assertEquals( + [('startTest', 'foo - renamed'), + ('addSuccess', 'foo - renamed'), + ('stopTest', 'foo - renamed')], + [(ev[0], ev[1].id()) for ev in result._events]) + if sys.version_info < (2, 7): # These tests require Python >=2.7. del test_fixup_expected_failures, test_fixup_expected_errors, test_fixup_unexpected_success |