regrtest: nicer output for durations

Use milliseconds and minutes units, not only seconds.
This commit is contained in:
Victor Stinner 2016-08-17 12:22:52 +02:00
parent f7457001a6
commit 435eaf4422
2 changed files with 21 additions and 14 deletions

View File

@ -34,6 +34,16 @@ else:
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:
"""Execute a test suite.
@ -107,14 +117,6 @@ class Regrtest:
self.skipped.append(test)
self.resource_denieds.append(test)
def time_delta(self, ceil=False):
seconds = time.monotonic() - self.start_time
if ceil:
seconds = math.ceil(seconds)
else:
seconds = int(seconds)
return datetime.timedelta(seconds=seconds)
def display_progress(self, test_index, test):
if self.ns.quiet:
return
@ -122,12 +124,14 @@ class Regrtest:
fmt = "{time} [{test_index:{count_width}}{test_count}/{nbad}] {test_name}"
else:
fmt = "{time} [{test_index:{count_width}}{test_count}] {test_name}"
test_time = time.monotonic() - self.start_time
test_time = datetime.timedelta(seconds=int(test_time))
line = fmt.format(count_width=self.test_count_width,
test_index=test_index,
test_count=self.test_count,
nbad=len(self.bad),
test_name=test,
time=self.time_delta())
time=test_time)
print(line, flush=True)
def parse_args(self, kwargs):
@ -286,9 +290,10 @@ class Regrtest:
if self.ns.print_slow:
self.test_times.sort(reverse=True)
print()
print("10 slowest tests:")
for time, test in self.test_times[:10]:
print("%s: %.1fs" % (test, time))
print("- %s: %s" % (test, format_duration(time)))
if self.bad:
print(count(len(self.bad), "test"), "failed:")
@ -342,7 +347,7 @@ class Regrtest:
previous_test = format_test_result(test, result[0])
test_time = time.monotonic() - start_time
if test_time >= PROGRESS_MIN_TIME:
previous_test = "%s in %.0f sec" % (previous_test, test_time)
previous_test = "%s in %s" % (previous_test, format_duration(test_time))
elif result[0] == PASSED:
# be quiet: say nothing if the test passed shortly
previous_test = None
@ -418,7 +423,9 @@ class Regrtest:
r.write_results(show_missing=True, summary=True,
coverdir=self.ns.coverdir)
print("Total duration: %s" % self.time_delta(ceil=True))
print()
duration = time.monotonic() - self.start_time
print("Total duration: %s" % format_duration(duration))
if self.ns.runleaks:
os.system("leaks %d" % os.getpid())

View File

@ -660,13 +660,13 @@ class ArgsTestCase(BaseTestCase):
output = self.run_tests(test, exitcode=1)
self.check_executed_tests(output, test, omitted=test)
def test_slow(self):
def test_slowest(self):
# test --slowest
tests = [self.create_test() for index in range(3)]
output = self.run_tests("--slowest", *tests)
self.check_executed_tests(output, tests)
regex = ('10 slowest tests:\n'
'(?:%s: [0-9]+\.[0-9]+s\n){%s}'
'(?:- %s: .*\n){%s}'
% (self.TESTNAME_REGEX, len(tests)))
self.check_line(output, regex)