Skip to content

Commit a49c935

Browse files
mlouieluvstinner
authored andcommitted
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
1 parent 272d888 commit a49c935

File tree

3 files changed

+44
-8
lines changed

3 files changed

+44
-8
lines changed

Lib/test/libregrtest/cmdline.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,9 @@ def _create_parser():
250250
group.add_argument('--list-tests', action='store_true',
251251
help="only write the name of tests that will be run, "
252252
"don't execute them")
253+
group.add_argument('--list-cases', action='store_true',
254+
help='only write the name of test cases that will be run'
255+
' , don\'t execute them')
253256
group.add_argument('-P', '--pgo', dest='pgo', action='store_true',
254257
help='enable Profile Guided Optimization training')
255258

Lib/test/libregrtest/main.py

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010
import tempfile
1111
import textwrap
1212
import time
13+
import unittest
1314
from test.libregrtest.cmdline import _parse_args
1415
from test.libregrtest.runtest import (
15-
findtests, runtest,
16+
findtests, runtest, get_abs_module,
1617
STDTESTS, NOTTESTS, PASSED, FAILED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED,
1718
INTERRUPTED, CHILD_ERROR,
1819
PROGRESS_MIN_TIME, format_test_result)
@@ -248,6 +249,29 @@ def list_tests(self):
248249
for name in self.selected:
249250
print(name)
250251

252+
def _list_cases(self, suite):
253+
for test in suite:
254+
if isinstance(test, unittest.loader._FailedTest):
255+
continue
256+
if isinstance(test, unittest.TestSuite):
257+
self._list_cases(test)
258+
elif isinstance(test, unittest.TestCase):
259+
print(test.id())
260+
261+
def list_cases(self):
262+
for test in self.selected:
263+
abstest = get_abs_module(self.ns, test)
264+
try:
265+
suite = unittest.defaultTestLoader.loadTestsFromName(abstest)
266+
self._list_cases(suite)
267+
except unittest.SkipTest:
268+
self.skipped.append(test)
269+
270+
if self.skipped:
271+
print(file=sys.stderr)
272+
print(count(len(self.skipped), "test"), "skipped:", file=sys.stderr)
273+
printlist(self.skipped, file=sys.stderr)
274+
251275
def rerun_failed_tests(self):
252276
self.ns.verbose = True
253277
self.ns.failfast = False
@@ -499,6 +523,10 @@ def _main(self, tests, kwargs):
499523
self.list_tests()
500524
sys.exit(0)
501525

526+
if self.ns.list_cases:
527+
self.list_cases()
528+
sys.exit(0)
529+
502530
self.run_tests()
503531
self.display_result()
504532

@@ -525,7 +553,7 @@ def count(n, word):
525553
return "%d %ss" % (n, word)
526554

527555

528-
def printlist(x, width=70, indent=4):
556+
def printlist(x, width=70, indent=4, file=None):
529557
"""Print the elements of iterable x to stdout.
530558
531559
Optional arg width (default 70) is the maximum line length.
@@ -536,7 +564,8 @@ def printlist(x, width=70, indent=4):
536564
blanks = ' ' * indent
537565
# Print the sorted list: 'x' may be a '--random' list or a set()
538566
print(textwrap.fill(' '.join(str(elt) for elt in sorted(x)), width,
539-
initial_indent=blanks, subsequent_indent=blanks))
567+
initial_indent=blanks, subsequent_indent=blanks),
568+
file=file)
540569

541570

542571
def main(tests=None, **kwargs):

Lib/test/libregrtest/runtest.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@ def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
7171
return stdtests + sorted(tests)
7272

7373

74+
def get_abs_module(ns, test):
75+
if test.startswith('test.') or ns.testdir:
76+
return test
77+
else:
78+
# Always import it from the test package
79+
return 'test.' + test
80+
81+
7482
def runtest(ns, test):
7583
"""Run a single test.
7684
@@ -141,11 +149,7 @@ def runtest_inner(ns, test, display_failure=True):
141149
test_time = 0.0
142150
refleak = False # True if the test leaked references.
143151
try:
144-
if test.startswith('test.') or ns.testdir:
145-
abstest = test
146-
else:
147-
# Always import it from the test package
148-
abstest = 'test.' + test
152+
abstest = get_abs_module(ns, test)
149153
clear_caches()
150154
with saved_test_environment(test, ns.verbose, ns.quiet, pgo=ns.pgo) as environment:
151155
start_time = time.time()

0 commit comments

Comments
 (0)