Kaydet (Commit) a49c935c authored tarafından mlouielu's avatar mlouielu Kaydeden (comit) Victor Stinner

bpo-30523: regrtest: Add --list-cases option (#2238)

* bpo-30523: regrtest: Add --list-cases option

* bpo-30523: Enhance --list-cases

* Add get_abs_module() function, use it in list_cases()
* list_cases() now logs skipped tests into stderr

* Remove unused doctest
üst 272d888c
...@@ -250,6 +250,9 @@ def _create_parser(): ...@@ -250,6 +250,9 @@ def _create_parser():
group.add_argument('--list-tests', action='store_true', group.add_argument('--list-tests', action='store_true',
help="only write the name of tests that will be run, " help="only write the name of tests that will be run, "
"don't execute them") "don't execute them")
group.add_argument('--list-cases', action='store_true',
help='only write the name of test cases that will be run'
' , don\'t execute them')
group.add_argument('-P', '--pgo', dest='pgo', action='store_true', group.add_argument('-P', '--pgo', dest='pgo', action='store_true',
help='enable Profile Guided Optimization training') help='enable Profile Guided Optimization training')
......
...@@ -10,9 +10,10 @@ import sysconfig ...@@ -10,9 +10,10 @@ import sysconfig
import tempfile import tempfile
import textwrap import textwrap
import time import time
import unittest
from test.libregrtest.cmdline import _parse_args from test.libregrtest.cmdline import _parse_args
from test.libregrtest.runtest import ( from test.libregrtest.runtest import (
findtests, runtest, findtests, runtest, get_abs_module,
STDTESTS, NOTTESTS, PASSED, FAILED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED, STDTESTS, NOTTESTS, PASSED, FAILED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED,
INTERRUPTED, CHILD_ERROR, INTERRUPTED, CHILD_ERROR,
PROGRESS_MIN_TIME, format_test_result) PROGRESS_MIN_TIME, format_test_result)
...@@ -248,6 +249,29 @@ class Regrtest: ...@@ -248,6 +249,29 @@ class Regrtest:
for name in self.selected: for name in self.selected:
print(name) print(name)
def _list_cases(self, suite):
for test in suite:
if isinstance(test, unittest.loader._FailedTest):
continue
if isinstance(test, unittest.TestSuite):
self._list_cases(test)
elif isinstance(test, unittest.TestCase):
print(test.id())
def list_cases(self):
for test in self.selected:
abstest = get_abs_module(self.ns, test)
try:
suite = unittest.defaultTestLoader.loadTestsFromName(abstest)
self._list_cases(suite)
except unittest.SkipTest:
self.skipped.append(test)
if self.skipped:
print(file=sys.stderr)
print(count(len(self.skipped), "test"), "skipped:", file=sys.stderr)
printlist(self.skipped, file=sys.stderr)
def rerun_failed_tests(self): def rerun_failed_tests(self):
self.ns.verbose = True self.ns.verbose = True
self.ns.failfast = False self.ns.failfast = False
...@@ -499,6 +523,10 @@ class Regrtest: ...@@ -499,6 +523,10 @@ class Regrtest:
self.list_tests() self.list_tests()
sys.exit(0) sys.exit(0)
if self.ns.list_cases:
self.list_cases()
sys.exit(0)
self.run_tests() self.run_tests()
self.display_result() self.display_result()
...@@ -525,7 +553,7 @@ def count(n, word): ...@@ -525,7 +553,7 @@ def count(n, word):
return "%d %ss" % (n, word) return "%d %ss" % (n, word)
def printlist(x, width=70, indent=4): def printlist(x, width=70, indent=4, file=None):
"""Print the elements of iterable x to stdout. """Print the elements of iterable x to stdout.
Optional arg width (default 70) is the maximum line length. Optional arg width (default 70) is the maximum line length.
...@@ -536,7 +564,8 @@ def printlist(x, width=70, indent=4): ...@@ -536,7 +564,8 @@ def printlist(x, width=70, indent=4):
blanks = ' ' * indent blanks = ' ' * indent
# Print the sorted list: 'x' may be a '--random' list or a set() # Print the sorted list: 'x' may be a '--random' list or a set()
print(textwrap.fill(' '.join(str(elt) for elt in sorted(x)), width, print(textwrap.fill(' '.join(str(elt) for elt in sorted(x)), width,
initial_indent=blanks, subsequent_indent=blanks)) initial_indent=blanks, subsequent_indent=blanks),
file=file)
def main(tests=None, **kwargs): def main(tests=None, **kwargs):
......
...@@ -71,6 +71,14 @@ def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS): ...@@ -71,6 +71,14 @@ def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
return stdtests + sorted(tests) return stdtests + sorted(tests)
def get_abs_module(ns, test):
if test.startswith('test.') or ns.testdir:
return test
else:
# Always import it from the test package
return 'test.' + test
def runtest(ns, test): def runtest(ns, test):
"""Run a single test. """Run a single test.
...@@ -141,11 +149,7 @@ def runtest_inner(ns, test, display_failure=True): ...@@ -141,11 +149,7 @@ def runtest_inner(ns, test, display_failure=True):
test_time = 0.0 test_time = 0.0
refleak = False # True if the test leaked references. refleak = False # True if the test leaked references.
try: try:
if test.startswith('test.') or ns.testdir: abstest = get_abs_module(ns, test)
abstest = test
else:
# Always import it from the test package
abstest = 'test.' + test
clear_caches() clear_caches()
with saved_test_environment(test, ns.verbose, ns.quiet, pgo=ns.pgo) as environment: with saved_test_environment(test, ns.verbose, ns.quiet, pgo=ns.pgo) as environment:
start_time = time.time() start_time = time.time()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment