bpo-33718: regrtest: update from master (GH-7305)

This commit is contained in:
Victor Stinner 2018-06-01 12:29:39 +02:00 committed by GitHub
parent 466aae5457
commit 3dd802d8f2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 87 additions and 61 deletions

View File

@ -8,7 +8,6 @@ import re
import sys import sys
import sysconfig import sysconfig
import tempfile import tempfile
import textwrap
import time import time
import unittest import unittest
from test.libregrtest.cmdline import _parse_args from test.libregrtest.cmdline import _parse_args
@ -18,6 +17,7 @@ from test.libregrtest.runtest import (
INTERRUPTED, CHILD_ERROR, INTERRUPTED, CHILD_ERROR,
PROGRESS_MIN_TIME, format_test_result) PROGRESS_MIN_TIME, format_test_result)
from test.libregrtest.setup import setup_tests from test.libregrtest.setup import setup_tests
from test.libregrtest.utils import removepy, count, format_duration, printlist
from test import support from test import support
try: try:
import gc import gc
@ -41,16 +41,6 @@ else:
TEMPDIR = os.path.abspath(TEMPDIR) TEMPDIR = os.path.abspath(TEMPDIR)
def format_duration(seconds):
if seconds < 1.0:
return '%.0f ms' % (seconds * 1e3)
if seconds < 60.0:
return '%.0f sec' % seconds
minutes, seconds = divmod(seconds, 60.0)
return '%.0f min %.0f sec' % (minutes, seconds)
class Regrtest: class Regrtest:
"""Execute a test suite. """Execute a test suite.
@ -88,6 +78,7 @@ class Regrtest:
self.skipped = [] self.skipped = []
self.resource_denieds = [] self.resource_denieds = []
self.environment_changed = [] self.environment_changed = []
self.rerun = []
self.interrupted = False self.interrupted = False
# used by --slow # used by --slow
@ -281,10 +272,11 @@ class Regrtest:
self.ns.verbose = True self.ns.verbose = True
self.ns.failfast = False self.ns.failfast = False
self.ns.verbose3 = False self.ns.verbose3 = False
self.ns.match_tests = None
print()
print("Re-running failed tests in verbose mode") print("Re-running failed tests in verbose mode")
for test in self.bad[:]: self.rerun = self.bad[:]
for test in self.rerun:
print("Re-running test %r in verbose mode" % test, flush=True) print("Re-running test %r in verbose mode" % test, flush=True)
try: try:
self.ns.verbose = True self.ns.verbose = True
@ -302,22 +294,27 @@ class Regrtest:
print(count(len(self.bad), 'test'), "failed again:") print(count(len(self.bad), 'test'), "failed again:")
printlist(self.bad) printlist(self.bad)
self.display_result()
def display_result(self): def display_result(self):
if self.interrupted: # If running the test suite for PGO then no one cares about results.
# print a newline after ^C if self.ns.pgo:
return
print() print()
print("== Tests result: %s ==" % self.get_tests_result())
if self.interrupted:
print()
# print a newline after ^C
print("Test suite interrupted by signal SIGINT.") print("Test suite interrupted by signal SIGINT.")
executed = set(self.good) | set(self.bad) | set(self.skipped) executed = set(self.good) | set(self.bad) | set(self.skipped)
omitted = set(self.selected) - executed omitted = set(self.selected) - executed
print(count(len(omitted), "test"), "omitted:") print(count(len(omitted), "test"), "omitted:")
printlist(omitted) printlist(omitted)
# If running the test suite for PGO then no one cares about
# results.
if self.ns.pgo:
return
if self.good and not self.ns.quiet: if self.good and not self.ns.quiet:
print()
if (not self.bad if (not self.bad
and not self.skipped and not self.skipped
and not self.interrupted and not self.interrupted
@ -348,6 +345,11 @@ class Regrtest:
print(count(len(self.skipped), "test"), "skipped:") print(count(len(self.skipped), "test"), "skipped:")
printlist(self.skipped) printlist(self.skipped)
if self.rerun:
print()
print("%s:" % count(len(self.rerun), "re-run test"))
printlist(self.rerun)
def run_tests_sequential(self): def run_tests_sequential(self):
if self.ns.trace: if self.ns.trace:
import trace import trace
@ -432,6 +434,21 @@ class Regrtest:
% (locale.getpreferredencoding(False), % (locale.getpreferredencoding(False),
sys.getfilesystemencoding())) sys.getfilesystemencoding()))
def get_tests_result(self):
result = []
if self.bad:
result.append("FAILURE")
elif self.ns.fail_env_changed and self.environment_changed:
result.append("ENV CHANGED")
if self.interrupted:
result.append("INTERRUPTED")
if not result:
result.append("SUCCESS")
return ', '.join(result)
def run_tests(self): def run_tests(self):
# For a partial run, we do not need to clutter the output. # For a partial run, we do not need to clutter the output.
if (self.ns.header if (self.ns.header
@ -473,16 +490,7 @@ class Regrtest:
print() print()
duration = time.monotonic() - self.start_time duration = time.monotonic() - self.start_time
print("Total duration: %s" % format_duration(duration)) print("Total duration: %s" % format_duration(duration))
print("Tests result: %s" % self.get_tests_result())
if self.bad:
result = "FAILURE"
elif self.interrupted:
result = "INTERRUPTED"
elif self.ns.fail_env_changed and self.environment_changed:
result = "ENV CHANGED"
else:
result = "SUCCESS"
print("Tests result: %s" % result)
if self.ns.runleaks: if self.ns.runleaks:
os.system("leaks %d" % os.getpid()) os.system("leaks %d" % os.getpid())
@ -549,37 +557,6 @@ class Regrtest:
sys.exit(0) sys.exit(0)
def removepy(names):
if not names:
return
for idx, name in enumerate(names):
basename, ext = os.path.splitext(name)
if ext == '.py':
names[idx] = basename
def count(n, word):
if n == 1:
return "%d %s" % (n, word)
else:
return "%d %ss" % (n, word)
def printlist(x, width=70, indent=4, file=None):
"""Print the elements of iterable x to stdout.
Optional arg width (default 70) is the maximum line length.
Optional arg indent (default 4) is the number of blanks with which to
begin each line.
"""
blanks = ' ' * indent
# 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,
initial_indent=blanks, subsequent_indent=blanks),
file=file)
def main(tests=None, **kwargs): def main(tests=None, **kwargs):
"""Run the Python suite.""" """Run the Python suite."""
Regrtest().main(tests=tests, **kwargs) Regrtest().main(tests=tests, **kwargs)

View File

@ -13,6 +13,7 @@ from test.libregrtest.runtest import (
runtest, INTERRUPTED, CHILD_ERROR, PROGRESS_MIN_TIME, runtest, INTERRUPTED, CHILD_ERROR, PROGRESS_MIN_TIME,
format_test_result) format_test_result)
from test.libregrtest.setup import setup_tests from test.libregrtest.setup import setup_tests
from test.libregrtest.utils import format_duration
# Display the running tests if nothing happened last N seconds # Display the running tests if nothing happened last N seconds
@ -167,7 +168,8 @@ def run_tests_multiprocess(regrtest):
continue continue
dt = time.monotonic() - worker.start_time dt = time.monotonic() - worker.start_time
if dt >= PROGRESS_MIN_TIME: if dt >= PROGRESS_MIN_TIME:
running.append('%s (%.0f sec)' % (current_test, dt)) text = '%s (%s)' % (current_test, format_duration(dt))
running.append(text)
return running return running
finished = 0 finished = 0

View File

@ -0,0 +1,47 @@
import os.path
import textwrap
def format_duration(seconds):
if seconds < 1.0:
return '%.0f ms' % (seconds * 1e3)
if seconds < 60.0:
return '%.0f sec' % seconds
minutes, seconds = divmod(seconds, 60.0)
hours, minutes = divmod(minutes, 60.0)
if hours:
return '%.0f hour %.0f min' % (hours, minutes)
else:
return '%.0f min %.0f sec' % (minutes, seconds)
def removepy(names):
if not names:
return
for idx, name in enumerate(names):
basename, ext = os.path.splitext(name)
if ext == '.py':
names[idx] = basename
def count(n, word):
if n == 1:
return "%d %s" % (n, word)
else:
return "%d %ss" % (n, word)
def printlist(x, width=70, indent=4, file=None):
"""Print the elements of iterable x to stdout.
Optional arg width (default 70) is the maximum line length.
Optional arg indent (default 4) is the number of blanks with which to
begin each line.
"""
blanks = ' ' * indent
# 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,
initial_indent=blanks, subsequent_indent=blanks),
file=file)